如何检查非 Ascii 字符

Ger*_*iss 17 sql-server t-sql sql-server-2008-r2

检查 VARCHAR 字段是否具有非 Ascii 字符的最佳方法是什么?
CHAR(1)通过CHAR(31)CHAR(127)通过CHAR(255)

我尝试使用PATINDEX并遇到了以下问题。

检查下范围是否正常工作。

SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0  
Run Code Online (Sandbox Code Playgroud)

我的数据有 0x1E 的三个记录,并且所有三个都返回了。

但是当我只检查上限时:

SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 
Run Code Online (Sandbox Code Playgroud)

它返回接近表中的所有记录(表计数 170737 并返回计数 170735),并且由于我的数据在此范围内没有任何值,我认为它不应该返回任何记录。

Mar*_*ith 20

模式语法中的范围使用排序规则的排序规则。

使用二进制 collat​​e 子句,以便按字符代码对范围进行排序。

(我也将其更改为,LIKE因为我发现它比 更明显PATINDEX > 0

SELECT *      
FROM mbrnotes      
WHERE LINE_TEXT LIKE '%[' + CHAR(127)+ '-' +CHAR(255)+']%'  COLLATE Latin1_General_100_BIN2
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 9

如果您像我一样,并且多年来您已经厌倦了在公司糟糕的数据中搜索这些字符,那么您可以使用此函数或根据自己的目的重写它。诚然,它很冗长,但如果您愿意,它会执行识别特殊字符的额外步骤 - 取消注释第 19 - 179 行即可。

\n\n

如果字符串不包含不可打印或扩展的 ascii 值 - 则返回 NULL。

\n\n
CREATE FUNCTION [dbo].[Find_Invalid_Chars]\n(\n    @SearchString VARCHAR(8000)\n)\nRETURNS VARCHAR(8000)\nAS\nBEGIN\n    DECLARE @CharPosition INT, @CharVal VARCHAR(100), @ReturnVal VARCHAR(8000) = \'\', @isValid BIT = 1 -- Start as valid\n\n    SET @CharPosition = 1\n\n    WHILE @CharPosition <= DATALENGTH(@SearchString)\n    BEGIN\n    IF (ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) NOT BETWEEN (32) AND (127))\n        BEGIN\n            SET @CharVal = \'[\' + CAST(ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) AS VARCHAR(3)) + \']\'\n            SET @isValid = 0\n            ---- Non-Printables\n            --SET @CharVal = REPLACE(@CharVal, \'[0]\', \'[NUL]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[1]\', \'[SOH]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[2]\', \'[STX]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[3]\', \'[ETX]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[4]\', \'[EOT]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[5]\', \'[ENQ]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[6]\', \'[ACK]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[7]\', \'[BEL]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[8]\', \'[BS]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[9]\', \'[HT]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[10]\', \'[LF]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[11]\', \'[VT]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[12]\', \'[FF]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[13]\', \'[CR]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[14]\', \'[SO]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[15]\', \'[SI]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[16]\', \'[DLE]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[17]\', \'[DC1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[18]\', \'[DC2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[19]\', \'[DC3]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[20]\', \'[DC4]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[21]\', \'[NAK]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[22]\', \'[SYN]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[23]\', \'[ETB]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[24]\', \'[CAN]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[25]\', \'[EM]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[26]\', \'[SUB]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[27]\', \'[ESC]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[28]\', \'[FS]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[29]\', \'[GS]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[30]\', \'[RS]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[31]\', \'[US]\')\n            ---- Extended Ascii\n            --SET @CharVal = REPLACE(@CharVal, \'[128]\', \'[\xe2\x82\xac]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[129]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[130]\', \'[\xe2\x80\x9a]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[131]\', \'[\xc6\x92]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[132]\', \'[\xe2\x80\x9e]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[133]\', \'[\xe2\x80\xa6]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[134]\', \'[\xe2\x80\xa0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[135]\', \'[\xe2\x80\xa1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[136]\', \'[\xcb\x86]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[137]\', \'[\xe2\x80\xb0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[138]\', \'[\xc5\xa0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[139]\', \'[\xe2\x80\xb9]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[140]\', \'[\xc5\x92]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[141]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[142]\', \'[\xc5\xbd]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[143]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[144]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[145]\', \'[\xe2\x80\x98]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[146]\', \'[\xe2\x80\x99]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[147]\', \'[\xe2\x80\x9c]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[148]\', \'[\xe2\x80\x9d]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[149]\', \'[\xe2\x80\xa2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[150]\', \'[\xe2\x80\x93]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[151]\', \'[\xe2\x80\x94]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[152]\', \'[\xcb\x9c]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[153]\', \'[\xe2\x84\xa2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[154]\', \'[\xc5\xa1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[155]\', \'[\xe2\x80\xba]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[156]\', \'[\xc5\x93]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[157]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[158]\', \'[\xc5\xbe]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[159]\', \'[\xc5\xb8]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[160]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[161]\', \'[\xc2\xa1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[162]\', \'[\xc2\xa2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[163]\', \'[\xc2\xa3]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[164]\', \'[\xc2\xa4]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[165]\', \'[\xc2\xa5]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[166]\', \'[\xc2\xa6]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[167]\', \'[\xc2\xa7]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[168]\', \'[\xc2\xa8]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[169]\', \'[\xc2\xa9]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[170]\', \'[\xc2\xaa]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[171]\', \'[\xc2\xab]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[172]\', \'[\xc2\xac]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[173]\', \'[]]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[174]\', \'[\xc2\xae]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[175]\', \'[\xc2\xaf]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[176]\', \'[\xc2\xb0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[177]\', \'[\xc2\xb1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[178]\', \'[\xc2\xb2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[179]\', \'[\xc2\xb3]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[180]\', \'[\xc2\xb4]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[181]\', \'[\xc2\xb5]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[182]\', \'[\xc2\xb6]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[183]\', \'[\xc2\xb7]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[184]\', \'[\xc2\xb8]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[185]\', \'[\xc2\xb9]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[186]\', \'[\xc2\xba]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[187]\', \'[\xc2\xbb]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[188]\', \'[\xc2\xbc]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[189]\', \'[\xc2\xbd]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[190]\', \'[\xc2\xbe]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[191]\', \'[\xc2\xbf]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[192]\', \'[\xc3\x80]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[193]\', \'[\xc3\x81]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[194]\', \'[\xc3\x82]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[195]\', \'[\xc3\x83]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[196]\', \'[\xc3\x84]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[197]\', \'[\xc3\x85]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[198]\', \'[\xc3\x86]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[199]\', \'[\xc3\x87]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[200]\', \'[\xc3\x88]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[201]\', \'[\xc3\x89]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[202]\', \'[\xc3\x8a]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[203]\', \'[\xc3\x8b]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[204]\', \'[\xc3\x8c]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[205]\', \'[\xc3\x8d]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[206]\', \'[\xc3\x8e]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[207]\', \'[\xc3\x8f]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[208]\', \'[\xc3\x90]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[209]\', \'[\xc3\x91]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[210]\', \'[\xc3\x92]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[211]\', \'[\xc3\x93]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[212]\', \'[\xc3\x94]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[213]\', \'[\xc3\x95]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[214]\', \'[\xc3\x96]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[215]\', \'[\xc3\x97]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[216]\', \'[\xc3\x98]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[217]\', \'[\xc3\x99]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[218]\', \'[\xc3\x9a]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[219]\', \'[\xc3\x9b]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[220]\', \'[\xc3\x9c]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[221]\', \'[\xc3\x9d]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[222]\', \'[\xc3\x9e]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[223]\', \'[\xc3\x9f]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[224]\', \'[\xc3\xa0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[225]\', \'[\xc3\xa1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[226]\', \'[\xc3\xa2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[227]\', \'[\xc3\xa3]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[228]\', \'[\xc3\xa4]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[229]\', \'[\xc3\xa5]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[230]\', \'[\xc3\xa6]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[231]\', \'[\xc3\xa7]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[232]\', \'[\xc3\xa8]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[233]\', \'[\xc3\xa9]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[234]\', \'[\xc3\xaa]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[235]\', \'[\xc3\xab]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[236]\', \'[\xc3\xac]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[237]\', \'[\xc3\xad]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[238]\', \'[\xc3\xae]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[239]\', \'[\xc3\xaf]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[240]\', \'[\xc3\xb0]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[241]\', \'[\xc3\xb1]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[242]\', \'[\xc3\xb2]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[243]\', \'[\xc3\xb3]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[244]\', \'[\xc3\xb4]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[245]\', \'[\xc3\xb5]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[246]\', \'[\xc3\xb6]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[247]\', \'[\xc3\xb7]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[248]\', \'[\xc3\xb8]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[249]\', \'[\xc3\xb9]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[250]\', \'[\xc3\xba]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[251]\', \'[\xc3\xbb]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[252]\', \'[\xc3\xbc]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[253]\', \'[\xc3\xbd]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[254]\', \'[\xc3\xbe]\')\n            --SET @CharVal = REPLACE(@CharVal, \'[255]\', \'[\xc3\xbf]\')\n        END\n    ELSE\n        BEGIN\n            SET @CharVal = SUBSTRING(@SearchString, @CharPosition, 1)\n        END\n\n    SET @ReturnVal = @ReturnVal + @CharVal\n\n    SET @CharPosition = @CharPosition + 1\n    END\n\nIF (@isValid = 1) SET @ReturnVal = NULL\n\nRETURN @ReturnVal\n\nEND\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,这样称呼它:

\n\n
SELECT BadString, dbo.Find_Invalid_Chars(BadString) [Invalid Characters]\nFROM #tmp_Table tmp_mc\nWHERE dbo.Find_Invalid_Chars(BadString) IS NOT NULL\n
Run Code Online (Sandbox Code Playgroud)\n\n

示例输出:

\n\n

具有字符身份

\n\n

或者

\n\n

没有字符标识

\n