需要提醒的是,这将发现,在两种姓名和电子邮件地址但有效字符似乎并不在你的系统有效的,你应该使用下列LIKE
声明:
WHERE tab.col LIKE '%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2;
这里重要的是COLLATE Latin1_General_100_BIN2
(除非该字段已使用二进制排序规则)。但是,如果该字段未使用二进制排序规则,则在此为LIKE
谓词不指定一个字符将会因为它们通常等同于非重音字符(例如n
= ñ
)而错过诸如ñ
和其他重音字符之类的字符。
实施例:
SELECT col
FROM (VALUES ('©Johñ'),
('{ "email_address":"[email protected]", "values":{ "LNAME":"SmÌth»" } }'),
('{ "email_address":"[email protected]", "values":{ "LNAME":"Jones" } }'),
('{ }'),
('f_f'),
('g-g'),
('Johñ f')
) tab(col)
WHERE tab.col LIKE '%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2;
随着COLLATE
子句'Johñ f'
行被识别,但没有COLLATE,该行显示为 “有效”。
另外,如果你有两个:
- Unicode数据(即
NVARCHAR
/NCHAR
场)
- 接受现实世界的数据(而不会错误地拒绝姓名和电子邮件地址的系统包含非美国英文字符,或将它们转换为美国英语等效字符)
then T-SQL LIKE
oper ator无法工作,因为各种语言的信件种类繁多。在这种情况下,您将需要一个正则表达式,因为它们可以处理字符类,它们是字符的逻辑分组。当然,RegEx并不是在T-SQL本地提供的,但您仍然可以通过SQLCLR获得此功能。你可以找到很多关于如何编码的例子,或者你可以下载免费版本的SQL#库(我创建的,但大多数RegEx函数 - 以及其他许多 - 都是免费的),其中包括一个RegEx_IsMatch其可以用作功能如下:
SELECT tab.col,
CASE WHEN tab.col LIKE N'%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2
THEN 1 ELSE 0 END AS [LikeOperator],
SQL#.RegEx_IsMatch(tab.col, N'[\W-[-\{\} @:",.]]+', 1, N'IgnoreCase')
AS [RegEx_IsMatch]
FROM (VALUES (N'©Johñ'),
(N'{ "email_address":"[email protected]", "values":{ "LNAME":"SmÌth»" } }'),
(N'{ "email_address":"[email protected]", "values":{ "LNAME":"Jones" } }'),
(N'{ }'),
(N'f_f'),
(N'g-g'),
(N'k,k'),
(N'WIDE'),
(N'[email protected]'),
(N'Johñ f')
) tab(col);
返回:
col LIKE RegEx
----------------------- ----- ------
©Johñ 1 1
{ "email_address":"[email protected]", "values":{ "LNAME":"SmÌth»" } } 1 1
{ "email_address":"[email protected]", "values":{ "LNAME":"Jones" } } 0 0
{ } 0 0
f_f 0 0
g-g 0 0
k,k 0 0
WIDE 1 0
[email protected] 0 0
Johñ f 1 0
什么[\W-[-\{\} @:",.]]+
图案的意思是:一个或多个字符([]+
),这些 “非字” 字符(\W
) 除了(-[]
)以下列表,其是确定:-
,{
,}
,
,@
,:
,"
,,
,和.
。
“奇怪”是什么意思? “ñ”和“Ù”以及“Ì”对于名称来说是完全有效的字符,并且这些日子在域名中也是有效的。 –
在我的情况下,当这个JSON稍后被其他代码使用时,它们不被接受为有效字符,这使得它们对我来说是“奇怪的”。 – Blankdud
即使他们自然是某人名字的一部分?或者一个域名,在这种情况下,将其改为删除口音在技术上不会是相同的域名,因此不会是他们的电子邮件地址? –