Sql server 为什么SQLServer认为CHAR(49)和CHAR(185)是相同的?

Sql server 为什么SQLServer认为CHAR(49)和CHAR(185)是相同的?,sql-server,ascii,Sql Server,Ascii,为什么SQLServer认为CHAR(49)和CHAR(185)是相同的 当在NVARCHAR或TEXT类型的列中输入1时,它将其视为CHAR(49)(一)和CHAR(185)(上标一) 示例数据: SELECT CAST('1111' AS TEXT) AS col1 INTO CharTest; 选择脚本: SELECT * FROM CharTest WHERE col1 LIKE '%'+CHAR(49)+'%'; SELECT * FROM CharTest WHERE col1

为什么SQLServer认为CHAR(49)和CHAR(185)是相同的

当在NVARCHAR或TEXT类型的列中输入1时,它将其视为CHAR(49)(一)和CHAR(185)(上标一)

示例数据:

SELECT CAST('1111' AS TEXT)  AS col1 INTO CharTest;
选择脚本:

SELECT * FROM CharTest WHERE col1 LIKE '%'+CHAR(49)+'%';
SELECT * FROM CharTest WHERE col1 LIKE '%'+CHAR(185)+'%';

这两条语句都返回:1111

应该使用不同的排序规则

SELECT * FROM CharTest WHERE 
        col1 LIKE '%'+CHAR(49)+'%' COLLATE  SQL_Latin1_General_CP1_CS_AS;
SELECT * FROM CharTest WHERE 
        col1 LIKE '%'+CHAR(185)+'%' COLLATE SQL_Latin1_General_CP1_CS_AS;

不同的排序规则应该可以做到这一点

SELECT * FROM CharTest WHERE 
        col1 LIKE '%'+CHAR(49)+'%' COLLATE  SQL_Latin1_General_CP1_CS_AS;
SELECT * FROM CharTest WHERE 
        col1 LIKE '%'+CHAR(185)+'%' COLLATE SQL_Latin1_General_CP1_CS_AS;

我测试了脚本。它工作得很好,只有一个脚本检索1111,而另一个脚本检索不到。这是您有效的排序规则吗?您的示例数据与问题的描述不匹配,选择1111表示数据类型为
int
,因此通过正确的示例
NVARCHAR
TEXT
更新您的问题不相同的场景和不同的RDBMS,但本质上是相同的问题:默认情况下,LIKE不区分大小写。和
'1'=char(185)COLLATE-Latin1\u-General\u-CI\u-AS
计算结果为true,而区分大小写的排序规则
'1'=char(185)COLLATE-Latin1\u-General\u-CS\u-AS
计算结果为false。因此,指数数1算作另一种情况。谁知道呢?我测试了脚本。它工作得很好,只有一个脚本检索1111,而另一个脚本检索不到。这是您有效的排序规则吗?您的示例数据与问题的描述不匹配,选择1111表示数据类型为
int
,因此通过正确的示例
NVARCHAR
TEXT
更新您的问题不相同的场景和不同的RDBMS,但本质上是相同的问题:默认情况下,LIKE不区分大小写。和
'1'=char(185)COLLATE-Latin1\u-General\u-CI\u-AS
计算结果为true,而区分大小写的排序规则
'1'=char(185)COLLATE-Latin1\u-General\u-CS\u-AS
计算结果为false。因此,指数数1算作另一种情况。谁知道呢?投票,漂亮的接球。投票,漂亮的接球。