需要提醒的是,這將發現,在兩種姓名和電子郵件地址但有效字符似乎並不在你的系統有效的,你應該使用下列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
即使他們自然是某人名字的一部分?或者一個域名,在這種情況下,將其改爲刪除口音在技術上不會是相同的域名,因此不會是他們的電子郵件地址? –