Sql-Server
如何檢查非ASCII字元
檢查 VARCHAR 欄位是否具有非 Ascii 字元的最佳方法是什麼?
CHAR(1)
通過CHAR(31)
和CHAR(127)
通過CHAR(255)
。我嘗試使用
PATINDEX
並遇到以下問題。檢查下限工作正常。
SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
我的數據有 0x1E 的三個記錄,並且所有三個都返回。
但是當我只檢查上限時:
SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
它返回接近表中的所有記錄(表計數 170737 和返回計數 170735),並且由於我的數據在此範圍內沒有任何值,我認為它應該沒有返回任何記錄。
模式語法中的範圍使用排序規則的排序規則。
使用二進制整理子句,使范圍按字元程式碼排序。
(我也將其更改為,
LIKE
因為我發現它比 更明顯PATINDEX > 0
)SELECT * FROM mbrnotes WHERE LINE_TEXT COLLATE Latin1_General_100_BIN2 LIKE '%[' + CHAR(0)+ '-' +CHAR(31) + CHAR(127)+ '-' +CHAR(255)+']%'
如果您真的想查看有問題的字元,並且您使用的是具有該
TRANSLATE
功能的版本,則可以使用如下所示的內容DECLARE @WhiteListedCharacters NVARCHAR(1000 ) = ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' SELECT text, REPLACE( TRANSLATE(text, @WhiteListedCharacters COLLATE Latin1_General_100_BIN2, REPLICATE(LEFT(@WhiteListedCharacters,1), LEN(@WhiteListedCharacters))), LEFT(@WhiteListedCharacters,1), '') AS BadChars FROM sys.messages WHERE language_id = 1038
然後,您可以在第二次呼叫中使用該結果
TRANSLATE
來僅保留“好”字元。DECLARE @WhiteListedCharacters NVARCHAR(1000 ) = ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' SELECT text, BadChars, Cleaned = REPLACE(TRANSLATE(text COLLATE Latin1_General_100_BIN2, BadChars, REPLICATE(N'ψ', LEN(BadChars))), N'ψ', N'') FROM sys.messages CROSS APPLY ( SELECT REPLACE( TRANSLATE(text, @WhiteListedCharacters COLLATE Latin1_General_100_BIN2, REPLICATE(LEFT(@WhiteListedCharacters,1), LEN(@WhiteListedCharacters + '-') - 1)), LEFT(@WhiteListedCharacters,1), '') AS BadChars ) ca WHERE language_id = 1038