Ranges in the pattern syntax use the sorting rules of your collation. Use a binary collate clause so the range is ordered by character code. (I also changed it to `LIKE` as I find that more obvious than `PATINDEX > 0`) SELECT * FROM mbrnotes WHERE LINE_TEXT COLLATE Latin1_General_100_BIN2 LIKE '%[' + CHAR(0)+ '-' +CHAR(31) + CHAR(127)+ '-' +CHAR(255)+']%' If you actually want to see the offending characters and you are on a version with the `TRANSLATE` function you can use something like the below 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 You can then use that result in a second call to `TRANSLATE` to preserve only the "good" characters. 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