在SQL Server 2008中管理Unicode

时间:2018-03-13 17:55:42

标签: sql sql-server sql-server-2008 unicode

我的SQL Server的排序规则设置为Latin1_General_CI_AS。现在的问题是在将用户导入系统时,重复的条目会进入数据库,以便那些仅在SQL Server窗口中显示尾随Hyphen-Minus的记录,但在浏览器和记事本上消失,即使我将它们放在单引号下

您会注意到,第一个将返回两个相同EmailId的记录,但第二个将仅返回一个记录,该记录在第一个脚本返回的where子句中具有相同的EmailId

当您从记事本或浏览器或电子邮件中复制第一个脚本中的电子邮件时,它们看起来相同,但是当您在SQL Server本身中复制它时,您可以看到尾随的连字符减号。

由于这些unicode,这些用户被导入系统,这些用户被SQL Server视为唯一记录并允许进入系统。

如何区分这些记录并防止它们进入系统?

enter image description here

1 个答案:

答案 0 :(得分:0)

Unicode值应该放在NVARCHAR列中,每个字符需要2个字节,而VARCHAR只需要1个。如果你不想要unicode字符,你应该将值转换为VARCHAR但请记住您可能会丢失数据,因为1字节表示中不可用的字符将丢失。 SSMS网格视图会对忍者进行替换并隐藏实际存储在列中的一些字符,例如新行或制表符。

第一步是检查您的电子邮件列是哪种数据类型。这可能是NVARCHAR。当您编写硬编码的NVARCHAR值时,您需要在字符串之前放置一个“N”,如下所示:

EMail = N'myEmail@email.com'

如果要检查字符串的确切内容,可以看到它的十六进制表示,并查看哪个前导奇怪的字符。使用“相同”电子邮件尝试使用2条记录:

SELECT convert (varbinary, Email) FROM UserInfo.[User]

不幸的是,该解决方案将涉及清理这些字符。将它们转换为VARCHAR(如果它们是NVARCHAR)可能会解决一些问题,但不是全部问题,因为您仍然可以使用例如{value}开头的TAB字符。

您可以尝试使用类似于此的LIKE搜索它们(返回所有不是A到z,数字,点或at的字母的电子邮件):

SELECT U.Email FROM UserInfo.[User] AS U WHERE U.Email LIKE '%[^A-z0-9@.]%'