¿Cuál es la mejor manera de verificar si un campo VARCHAR tiene caracteres no ascii?
CHAR(1)
a través de CHAR(31)
y CHAR(127)
a través de CHAR(255)
.
Intenté usar PATINDEX
y me he encontrado con el siguiente problema.
La comprobación del rango inferior funcionó correctamente.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Mis datos tenían tres registros con 0x1E y los tres fueron devueltos.
Pero cuando verifico solo el rango superior:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Devuelve cerca de todos los registros de la tabla (recuento de tabla 170737 y recuento devuelto 170735) y dado que mis datos no tenían ningún valor en este rango, creo que no debería haber devuelto ningún registro.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
fuente
fuente
Respuestas:
Los rangos en la sintaxis del patrón utilizan las reglas de clasificación de su intercalación.
Use una cláusula de clasificación binaria para que el rango esté ordenado por código de caracteres.
(También lo cambié a
LIKE
como me parece más obvio quePATINDEX > 0
)fuente
Si eres como yo y te has cansado a lo largo de los años buscando estos personajes en los terribles datos de tu empresa, puedes usar esta función o reescribirla para tu propio propósito. Es cierto que es prolijo, pero va más allá de la identificación de caracteres especiales si lo desea: descomente las líneas 19 a 179 para hacerlo.
Si la cadena no contiene valores ascii no imprimibles o extendidos, devuelve NULL.
Y luego, llámalo así:
Salida de muestra:
O
fuente