PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Restrição Postgresql para verificar caracteres não ASCII


Você pode definir ASCII como ordinal 1 to 127 para isso, a seguinte consulta identificará uma string com valores "não-ascii":
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);

mas provavelmente não será supereficiente, e o uso de subconsultas o forçaria a fazer isso em um gatilho em vez de uma restrição CHECK.

Em vez disso, eu usaria uma expressão regular. Se você deseja todos os caracteres imprimíveis então você pode usar um intervalo em uma restrição de verificação, como:
CHECK (my_column ~ '^[ -~]*$')

isso corresponderá a tudo, desde o espaço até o til , que é o intervalo ASCII imprimível.

Se você quiser todos os ASCII, imprimíveis e não imprimíveis, você pode usar escapes de byte :
CHECK (my_column ~ '^[\x00-\x7F]*$')

A abordagem mais estritamente correta seria convert_to(my_string, 'ascii') e deixe uma exceção ser levantada se falhar ... mas o PostgreSQL não oferece um ascii (ou seja, 7 bits), para que essa abordagem não seja possível.