Select 语句 returns 当 T-sql 中的列整理 SQL_Latin1_General_CP1_CI_AS 时什么也没有
Select statement returns nothing when column collation SQL_Latin1_General_CP1_CI_AS in T-sql
我有一个 select 语句如下:
SELECT Veri from tblTest
where CAST(Veri COLLATE SQL_Latin1_General_CP1_CI_AS as varchar(10))=
CAST('БHО' COLLATE SQL_Latin1_General_CP1_CI_AS as varchar(10))
列 Veri
的排序规则类型为 SQL_Latin1_General_CP1_CI_AS
。
有一行 Veri
等于 БHО。但是,select声明returns什么都没有。
Table tblTest 的排序规则也是 SQL_Latin1_General_CP1_CI_AS
。
我做错了什么?
编辑:列 Veri 的列定义如下:
CONDENSED_TYPE: nvarchar(50)
TABLE_SCHEMA:dbo
TABLE_NAME:tblTest
COLUMN_NAME: 维里
ORDINAL_POSITION: 2
COLUMN_DEFAULT: 空
IS_NULLABLE: 没有
DATA_TYPE: nvarchar
CHARACTER_MAXIMUM_LENGTH: 50
CHARACTER_OCTET_LENGTH: 100
NUMERIC_PRECISION:NULL
NUMERIC_PRECISION_RADIX: 空
NUMERIC_SCALE: 空
DATETIME_PRECISION: 空
CHARACTER_SET_CATALOG: 空
CHARACTER_SET_SCHEMA: 空
COLLATION_NAME: SQL_Latin1_General_CP1_CI_AS
CHARACTER_SET_NAME: 统一码
COLLATION_CATALOG: 空
DOMAIN_SCHEMA: 空
DOMAIN_NAME: 空
在 T/SQL 中,字符串常量 'БHО'
是一个 ANSI 字符串,并且 'Б' 不可用,因此您将得到 @EduardUta 查询的问号。您需要使用 Unicode 字符串,对字符串常量和 nvarchar 使用 N 前缀。试试这个;
SELECT Veri from tblTest
where CAST(Veri COLLATE SQL_Latin1_General_CP1_CI_AS as nvarchar(10)) =
CAST(N'БHО' COLLATE SQL_Latin1_General_CP1_CI_AS as nvarchar(10))
您可以删除 COLLATE 指令 - 取决于您的模式。
您可以做的另一件事是逐个字符地检查字符串以查看每个字符的实际含义。例如,在您的字符串“БHО”中,它可能看起来像西里尔大写字母 Be 后跟英文字母 H 和 O,但事实并非如此,这就是您没有得到匹配的原因。
declare @s nvarchar(100) = N'БНО'
declare @i int = 0
while (@i <= len(@s))
begin
print substring(@s, @i, 1) + N' - 0x' + convert(varchar(8), convert(varbinary(4), unicode(substring(@s, @i, 1))), 2)
set @i = @i + 1
end
尝试在上面的字符串 N'БНО' 中输入 Н 和 О,然后再次 运行 - 您将分别看到 0x48 和 0x4F。
希望这对您有所帮助,
里斯
我有一个 select 语句如下:
SELECT Veri from tblTest
where CAST(Veri COLLATE SQL_Latin1_General_CP1_CI_AS as varchar(10))=
CAST('БHО' COLLATE SQL_Latin1_General_CP1_CI_AS as varchar(10))
列 Veri
的排序规则类型为 SQL_Latin1_General_CP1_CI_AS
。
有一行 Veri
等于 БHО。但是,select声明returns什么都没有。
Table tblTest 的排序规则也是 SQL_Latin1_General_CP1_CI_AS
。
我做错了什么?
编辑:列 Veri 的列定义如下:
CONDENSED_TYPE: nvarchar(50) TABLE_SCHEMA:dbo TABLE_NAME:tblTest COLUMN_NAME: 维里 ORDINAL_POSITION: 2 COLUMN_DEFAULT: 空 IS_NULLABLE: 没有 DATA_TYPE: nvarchar CHARACTER_MAXIMUM_LENGTH: 50 CHARACTER_OCTET_LENGTH: 100 NUMERIC_PRECISION:NULL NUMERIC_PRECISION_RADIX: 空 NUMERIC_SCALE: 空 DATETIME_PRECISION: 空 CHARACTER_SET_CATALOG: 空 CHARACTER_SET_SCHEMA: 空 COLLATION_NAME: SQL_Latin1_General_CP1_CI_AS CHARACTER_SET_NAME: 统一码 COLLATION_CATALOG: 空 DOMAIN_SCHEMA: 空 DOMAIN_NAME: 空
在 T/SQL 中,字符串常量 'БHО'
是一个 ANSI 字符串,并且 'Б' 不可用,因此您将得到 @EduardUta 查询的问号。您需要使用 Unicode 字符串,对字符串常量和 nvarchar 使用 N 前缀。试试这个;
SELECT Veri from tblTest
where CAST(Veri COLLATE SQL_Latin1_General_CP1_CI_AS as nvarchar(10)) =
CAST(N'БHО' COLLATE SQL_Latin1_General_CP1_CI_AS as nvarchar(10))
您可以删除 COLLATE 指令 - 取决于您的模式。
您可以做的另一件事是逐个字符地检查字符串以查看每个字符的实际含义。例如,在您的字符串“БHО”中,它可能看起来像西里尔大写字母 Be 后跟英文字母 H 和 O,但事实并非如此,这就是您没有得到匹配的原因。
declare @s nvarchar(100) = N'БНО'
declare @i int = 0
while (@i <= len(@s))
begin
print substring(@s, @i, 1) + N' - 0x' + convert(varchar(8), convert(varbinary(4), unicode(substring(@s, @i, 1))), 2)
set @i = @i + 1
end
尝试在上面的字符串 N'БНО' 中输入 Н 和 О,然后再次 运行 - 您将分别看到 0x48 和 0x4F。
希望这对您有所帮助,
里斯