Sql-Server

如何檢查非ASCII字元

  • December 17, 2021

檢查 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 

引用自:https://dba.stackexchange.com/questions/138350