有没有办法检测nvarchar列中的unicode字符

时间:2018-03-12 01:56:32

标签: sql sql-server

输入列的实现不足以将电子邮件字符限制为罗马语...因此带有重音符号的法语和西班牙语字符已进入数据库,但被远程邮件服务器拒绝。有一个简单的SQL测试吗?

我试过

where email <> try_cast(try_cast(email as varchar) as nvarchar)

虽然它似乎在一定程度上起作用,但它似乎有点激进,因为它发现了更多的匹配,然后是非。

3 个答案:

答案 0 :(得分:3)

你可以试试这个:

where email like '%[^a-zA-Z0-9.@-_]%'

答案 1 :(得分:1)

您没有为varchar或nvarchar设置大小,因此它使用默认长度,我认为这是30。获取超过30个字符的电子邮件地址并不难。更改为'try_cast(try_cast(电子邮件为varchar(300))为nvarchar(300))'或类似内容。

但是,您确实意识到带有重音符号,中文,日语,阿拉伯语,印地语和其他字符的字符现在是有效的电子邮件地址吗?并非所有服务器都已更新以处理它们,但这并不意味着它不是实际地址。

答案 2 :(得分:0)

您可能想尝试

where email collate SQL_Latin1_General_CP437_BIN
    <> cast(email as varchar(max)) collate SQL_Latin1_General_CP437_BIN

(您可以将varchar(max)的长度更改为email,尽管它也可以像varchar(max)一样使用。)

如果您不强制使用Unicode安全的二进制排序规则,则它可以使用任何数据库排序规则,这可能不适用于nchar(0x2014)(— U + 2014 EM DASH,可以将其转换为{例如, SQL_Latin1_General_CP1_CI_AS 的{1}}。