PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte Postgresql pour vérifier les caractères non-ascii

Vous pouvez définir ASCII comme ordinal 1 to 127 à cet effet, la requête suivante identifiera donc une chaîne avec des valeurs "non-ascii" :

SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);

mais il est peu probable que ce soit super efficace, et l'utilisation de sous-requêtes vous obligerait à le faire dans un déclencheur plutôt qu'une contrainte CHECK.

Au lieu de cela, j'utiliserais une expression régulière. Si vous voulez tous les caractères imprimables alors vous pouvez utiliser une plage dans une contrainte de vérification, comme :

CHECK (my_column ~ '^[ -~]*$')

cela correspondra à tout, de l'espace au tilde , qui est la plage ASCII imprimable.

Si vous voulez tout ASCII, imprimable et non imprimable, vous pouvez utiliser des échappements d'octets :

CHECK (my_column ~ '^[\x00-\x7F]*$')

L'approche la plus strictement correcte serait de convert_to(my_string, 'ascii') et laissez une exception être levée si elle échoue ... mais PostgreSQL n'offre pas de ascii (c'est-à-dire 7 bits), cette approche n'est donc pas possible.