为什么 unicode 星号被忽略?

Yis*_*ski 4 sql-server unicode

在 SQL Server 中,我运行这个简单的查询:

\n
select iif(N'\xe2\xad\x90' ='',1,0)   \n
Run Code Online (Sandbox Code Playgroud)\n

它返回1。为什么?

\n

如果我尝试其他 unicode 字符,一切似乎都可以。IE:

\n
select iif(N'\xe2\x9c\x94\xef\xb8\x8f' ='',1,0)   \n
Run Code Online (Sandbox Code Playgroud)\n

0按预期返回。

\n

当前整理:Latin1_General_100_CI_AI

\n

use*_*983 7

在某些排序规则中进行比较时,某些字符会被忽略。表情符号就是这样一种东西,许多表情符号将被视为彼此相等或什么都不是。例如CASE N\'\' WHEN N\'\' THEN 1 END返回1.

\n

如果您确实需要处理此类字符,最好COLLATE先使用二进制排序规则,然后再进行比较。

\n
SELECT \n       CASE N\'\' COLLATE Latin1_General_BIN WHEN N\'\' THEN 1 END,\n       CASE N\'\' COLLATE Latin1_General_BIN WHEN N\'\' THEN 1 END,\n       CASE N\'\xe2\xad\x90\' COLLATE Latin1_General_BIN WHEN N\'\' THEN 1 END;\n
Run Code Online (Sandbox Code Playgroud)\n

然后返回NULL所有表达式。

\n

数据库<>小提琴

\n
\n

看来提出的问题和要解决问题实际上并不相同。从评论来看,OP似乎想要一个CONSTRAINTCHECK不是的\'\'。有几种方法可以实现处理此类字符。

\n
    \n
  • 你可以COLLATECHECK:\n
    ALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn\n    CHECK (YourColumn COLLATE Latin1_General_BIN <> N\'\');\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 您可以检查LEN,它不允许以下值\' \':\n
    ALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn CHECK (LEN(YourColumn) > 0);\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 您可以检查DATALENGTH,这将允许以下值\' \':\n
    ALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn CHECK (DATALENGTH(YourColumn) > 0);\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 将计算的(和可能的PERSISTED)列添加到表中,并将CONSTRAINT与该列相对应。如果您需要在其他位置比较这些字符,这将很有用,并且您也可以使用INDEX该列:\n
    ALTER TABLE dbo.YourTable\nADD YourCollatedColumn AS YourColumn COLLATE Latin1_General_BIN PERSISTED;\nGO\n\nALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourCollatedColumn\n    CHECK (YourCollatedColumn <> N\'\');\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n