sql >> Base de Datos >  >> RDS >> PostgreSQL

Restricción de Postgresql para verificar caracteres que no sean ascii

Puede definir ASCII como ordinal 1 to 127 para este propósito, la siguiente consulta identificará una cadena con valores "no ASCII":

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

pero no es probable que sea súper eficiente, y el uso de subconsultas lo obligaría a hacerlo en un activador en lugar de una restricción CHECK.

En su lugar, usaría una expresión regular. Si desea todos los caracteres imprimibles entonces puede usar un rango en una restricción de verificación, como:

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

esto coincidirá con todo, desde el espacio hasta la tilde , que es el rango ASCII imprimible.

Si desea todo ASCII, imprimible y no imprimible, puede usar escapes de bytes :

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

El enfoque más estrictamente correcto sería convert_to(my_string, 'ascii') y permita que se genere una excepción si falla ... pero PostgreSQL no ofrece un ascii (es decir, codificación de 7 bits), por lo que ese enfoque no es posible.