当T-sql中的列排序规则SQL_Latin1_General_CP1_CI_AS时,Select语句不返回任何内容

时间:2015-01-19 07:31:27

标签: sql-server collation string-comparison

我有一个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语句不返回任何内容。 表tblTest的排序规则也是SQL_Latin1_General_CP1_CI_AS。 我做错了什么?

编辑:列Veri的列定义如下:

CONDENSED_TYPE:nvarchar(50) TABLE_SCHEMA:dbo TABLE_NAME:tblTest COLUMN_NAME:Veri ORDINAL_POSITION:2 COLUMN_DEFAULT:NULL IS_NULLABLE:没有 DATA_TYPE:nvarchar CHARACTER_MAXIMUM_LENGTH:50 CHARACTER_OCTET_LENGTH:100 NUMERIC_PRECISION:NULL NUMERIC_PRECISION_RADIX:NULL NUMERIC_SCALE:NULL DATETIME_PRECISION:NULL CHARACTER_SET_CATALOG:NULL CHARACTER_SET_SCHEMA:NULL COLLATION_NAME:SQL_Latin1_General_CP1_CI_AS CHARACTER_SET_NAME:UNICODE COLLATION_CATALOG:NULL DOMAIN_SCHEMA:NULL DOMAIN_NAME:NULL

1 个答案:

答案 0 :(得分:1)

在T / SQL中,字符串常量'БHО'是ANSI字符串,'Б'不可用,因此您将获得@EduardUta查询的问号。您需要使用Unicode字符串,使用字符串常量的N前缀和nvarchar。试试这个;

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О'中,它可能看起来像西里尔字母大写字母后跟英文字母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。

希望这有帮助,

里斯