Yis*_*ski 4 sql-server unicode
在 SQL Server 中,我运行这个简单的查询:
\nselect iif(N'\xe2\xad\x90' ='',1,0) \nRun Code Online (Sandbox Code Playgroud)\n它返回1。为什么?
如果我尝试其他 unicode 字符,一切似乎都可以。IE:
\nselect iif(N'\xe2\x9c\x94\xef\xb8\x8f' ='',1,0) \nRun Code Online (Sandbox Code Playgroud)\n0按预期返回。
当前整理:Latin1_General_100_CI_AI
在某些排序规则中进行比较时,某些字符会被忽略。表情符号就是这样一种东西,许多表情符号将被视为彼此相等或什么都不是。例如CASE N\'\' WHEN N\'\' THEN 1 END返回1.
如果您确实需要处理此类字符,最好COLLATE先使用二进制排序规则,然后再进行比较。
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;\nRun Code Online (Sandbox Code Playgroud)\n然后返回NULL所有表达式。
看来提出的问题和要解决的问题实际上并不相同。从评论来看,OP似乎想要一个CONSTRAINT值CHECK不是的\'\'。有几种方法可以实现处理此类字符。
COLLATE在CHECK:\nALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn\n CHECK (YourColumn COLLATE Latin1_General_BIN <> N\'\');\nRun Code Online (Sandbox Code Playgroud)\nLEN,它不允许以下值\' \':\nALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn CHECK (LEN(YourColumn) > 0);\nRun Code Online (Sandbox Code Playgroud)\nDATALENGTH,这将允许以下值\' \':\nALTER TABLE dbo.YourTable\nADD CONSTRAINT Chk_YourColumn CHECK (DATALENGTH(YourColumn) > 0);\nRun Code Online (Sandbox Code Playgroud)\nPERSISTED)列添加到表中,并将CONSTRAINT与该列相对应。如果您需要在其他位置比较这些字符,这将很有用,并且您也可以使用INDEX该列:\nALTER 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\'\');\nRun Code Online (Sandbox Code Playgroud)\n