首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL Server 2008中管理Unicode

在SQL Server 2008中管理Unicode
EN

Stack Overflow用户
提问于 2018-03-14 01:55:42
回答 1查看 54关注 0票数 0

我将SQL Server的排序规则设置为Latin1_General_CI_AS。现在的问题是,在将用户导入系统时,对于那些尾随连字符-减号(只出现在SQL Server窗口中,但在浏览器和记事本上消失,即使我将它们放在单引号下)的记录,重复条目也会进入数据库。

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

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

这些用户因为这些unicode而导入到系统中,这些unicode被SQL Server视为唯一的记录,并允许进入系统。

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

EN

回答 1

Stack Overflow用户

发布于 2018-03-14 02:12:23

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

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

代码语言:javascript
运行
复制
EMail = N'myEmail@email.com'

如果你想检查一个字符串的确切内容,你可以看到它的十六进制表示,看看哪个前导奇怪的字符有。在使用“相同”电子邮件的两个记录中尝试此方法:

代码语言:javascript
运行
复制
SELECT convert (varbinary, Email) FROM UserInfo.[User]

不幸的是,解决方案需要清除这些字符。将它们转换为VARCHAR (如果它们是NVARCHAR)可能会解决一些问题,但不是全部问题,例如,在值的开头仍然可以有一个TAB字符。

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

代码语言:javascript
运行
复制
SELECT U.Email FROM UserInfo.[User] AS U WHERE U.Email LIKE '%[^A-z0-9@.]%'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49262782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档