我将SQL Server的排序规则设置为Latin1_General_CI_AS。现在的问题是,在将用户导入系统时,对于那些尾随连字符-减号(只出现在SQL Server窗口中,但在浏览器和记事本上消失,即使我将它们放在单引号下)的记录,重复条目也会进入数据库。
您将注意到,第一个将返回两条相同EmailId的记录,但第二条将只返回一条在第一个脚本返回的where子句中具有相同EmailId的记录。
当您在记事本、浏览器或电子邮件中复制第一个脚本中的电子邮件时,它们看起来是一样的,但是当您在SQL Server本身中复制它时,您可以看到尾随的连字符-减号。
这些用户因为这些unicode而导入到系统中,这些unicode被SQL Server视为唯一的记录,并允许进入系统。
如何区分这些记录并防止它们进入系统?

发布于 2018-03-14 02:12:23
Unicode值应该放在NVARCHAR列中,该列每个字符占用2个字节,而VARCHAR只占用1个字节。如果您不需要Unicode字符,则应该将这些值转换为VARCHAR,但请记住,您可能会丢失数据,因为在1字节表示中不可用的字符将会丢失。SSMS网格视图执行忍者替换,并隐藏一些实际存储在列中的字符,如新行或制表符。
第一步是检查哪种数据类型是您的电子邮件列。可能是NVARCHAR。当您编写一个硬编码的NVARCHAR值时,您需要在字符串前放置一个"N“,如下所示:
EMail = N'myEmail@email.com'如果你想检查一个字符串的确切内容,你可以看到它的十六进制表示,看看哪个前导奇怪的字符有。在使用“相同”电子邮件的两个记录中尝试此方法:
SELECT convert (varbinary, Email) FROM UserInfo.[User]不幸的是,解决方案需要清除这些字符。将它们转换为VARCHAR (如果它们是NVARCHAR)可能会解决一些问题,但不是全部问题,例如,在值的开头仍然可以有一个TAB字符。
您可以尝试使用类似如下的LIKE搜索它们(返回所有不是字母从A到z、数字、点或at的电子邮件):
SELECT U.Email FROM UserInfo.[User] AS U WHERE U.Email LIKE '%[^A-z0-9@.]%'https://stackoverflow.com/questions/49262782
复制相似问题