Quelle est la meilleure façon de vérifier si un champ VARCHAR contient des caractères non ascii?
CHAR(1)
à travers CHAR(31)
et à CHAR(127)
travers CHAR(255)
.
J'ai essayé d'utiliser PATINDEX
et j'ai rencontré le problème suivant.
La vérification de la plage inférieure a fonctionné correctement.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Mes données avaient trois enregistrements avec 0x1E et tous les trois ont été retournés.
Mais quand je vérifie juste la plage supérieure:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Il retourne près de tous les enregistrements de la table (table 170737 et retourné 170735) et comme mes données n'avaient pas de valeurs dans cette plage, je pense qu'elles n'auraient dû retourner aucun enregistrement.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
la source
la source
Réponses:
Les plages de la syntaxe de modèle utilisent les règles de tri de votre classement.
Utilisez une clause d'assemblage binaire pour que la plage soit ordonnée par code de caractère.
(Je l'ai également changé en
LIKE
car je trouve cela plus évident quePATINDEX > 0
)la source
Si vous êtes comme moi et que vous vous êtes fatigué au fil des ans à la recherche de ces personnages dans les terribles données de votre entreprise, vous pouvez utiliser cette fonction ou la réécrire à votre guise. Il est certes verbeux, mais cela va l'étape supplémentaire d'identification des caractères spéciaux si vous le souhaitez - décommentez les lignes 19 à 179 pour le faire.
Si la chaîne ne contient pas de valeurs ascii non imprimables ou étendues, elle renvoie NULL.
Et puis, appelez-le comme:
Exemple de sortie:
Ou
la source