SQL 服务器字符串相等与 CHAR(0)
SQL server string equality vs CHAR(0)
我在 SQL 服务器(版本 12.0.2000.8,排序规则是 Hungarian_CI_AS)中遇到了一个很奇怪的问题:
我有一个 table 和一个 varchar(128) 可为空的列,它存储用户名,
我根本无法用简单的“=”运算符匹配它们中的任何一个。
所以当我执行这样的查询时:
select * from myTable where username = 'john.doe'
,
它没有 return 任何行。
我发现当我 select 与 LIKE 相同并将 % 作为尾随字符时,所以:
select * from myTable where username = 'john.doe%'
,
它工作正常。
所以我创建了一个查询,它将所有 char(0)-s 替换为“$”符号,如下所示:
select REPLACE(username, CHAR(0), '$') from myTable
where username LIKE 'john.doe%'
它 return 是一个 128 长的文字,像这样(填充了尾随 $-s):
john.doe$$$$$$$$$$....
考虑到上述事实,我怀疑 char(0)-s 不知何故是问题,但是当我 运行 一个简单的查询来模拟 '=' 运算符的相同条件时,我得到2 个文字相等:
SELECT CASE WHEN ('john.doe') = ('john.doe' + CHAR(0) + CHAR(0) + CHAR(0)) THEN 'Equal' ELSE 'Not Equal' END
这个查询 returns 等于。
所以我完全糊涂了,这是怎么回事?
我应该怎么做才能使“=”运算符在我的数据库上工作 table?
尝试将 table 中列的数据类型更改为 nvarchar(128),而不是 varchar(128)。它可能会神奇地解决问题(即使查询不会使用 N 前缀),但我无法解释原因。似乎在处理 varchar 和 nvarchar 数据类型之间的 CHAR(0) 方面存在根本差异。
我在 SQL 服务器(版本 12.0.2000.8,排序规则是 Hungarian_CI_AS)中遇到了一个很奇怪的问题:
我有一个 table 和一个 varchar(128) 可为空的列,它存储用户名,
我根本无法用简单的“=”运算符匹配它们中的任何一个。
所以当我执行这样的查询时:
select * from myTable where username = 'john.doe'
,
它没有 return 任何行。
我发现当我 select 与 LIKE 相同并将 % 作为尾随字符时,所以:
select * from myTable where username = 'john.doe%'
,
它工作正常。
所以我创建了一个查询,它将所有 char(0)-s 替换为“$”符号,如下所示:
select REPLACE(username, CHAR(0), '$') from myTable
where username LIKE 'john.doe%'
它 return 是一个 128 长的文字,像这样(填充了尾随 $-s): john.doe$$$$$$$$$$....
考虑到上述事实,我怀疑 char(0)-s 不知何故是问题,但是当我 运行 一个简单的查询来模拟 '=' 运算符的相同条件时,我得到2 个文字相等:
SELECT CASE WHEN ('john.doe') = ('john.doe' + CHAR(0) + CHAR(0) + CHAR(0)) THEN 'Equal' ELSE 'Not Equal' END
这个查询 returns 等于。
所以我完全糊涂了,这是怎么回事? 我应该怎么做才能使“=”运算符在我的数据库上工作 table?
尝试将 table 中列的数据类型更改为 nvarchar(128),而不是 varchar(128)。它可能会神奇地解决问题(即使查询不会使用 N 前缀),但我无法解释原因。似乎在处理 varchar 和 nvarchar 数据类型之间的 CHAR(0) 方面存在根本差异。