Qual é a melhor maneira de verificar se um campo VARCHAR possui caracteres não-ASCII?
CHAR(1)
completamente CHAR(31)
e CHAR(127)
completamente CHAR(255)
.
Tentei usar PATINDEX
e encontrei o seguinte problema.
A verificação da faixa inferior funcionou corretamente.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Meus dados tinham três registros com 0x1E e todos os três foram retornados.
Mas quando eu verifico apenas a faixa superior:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Ele retorna perto de todos os registros da tabela (contagem da tabela 170737 e contagem retornada 170735) e, como meus dados não tinham nenhum valor nesse intervalo, eu acho que não deveria ter retornado nenhum registro.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
fonte
fonte
Respostas:
Intervalos na sintaxe de padrão usam as regras de classificação do seu agrupamento.
Use uma cláusula de classificação binária para que o intervalo seja ordenado pelo código de caractere.
(Eu também mudei para
LIKE
como acho mais óbvio quePATINDEX > 0
)fonte
Se você é como eu e se cansou ao longo dos anos pesquisando esses personagens nos terríveis dados da sua empresa, pode usar essa função ou reescrevê-la para seu próprio objetivo. É reconhecidamente prolixo, mas dá o passo extra de identificar caracteres especiais, se você quiser - descomente as linhas 19 a 179 para fazer isso.
Se a sequência não contiver valores ASCII não imprimíveis ou estendidos, ela retornará NULL.
E então, chame assim:
Saída de amostra:
Ou
fonte