PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Vincolo Postgresql per verificare la presenza di caratteri non ascii

Puoi definire ASCII come ordinal 1 to 127 a tal fine, quindi la seguente query identificherà una stringa con valori "non ascii":

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

ma non è probabile che sia super efficiente e l'uso di sottoquery ti costringerebbe a farlo in un trigger piuttosto che in un vincolo CHECK.

Invece userei un'espressione regolare. Se vuoi tutti i caratteri stampabili quindi puoi utilizzare un intervallo in un vincolo di controllo, come:

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

questo corrisponderà a tutto, dallo spazio alla tilde , che è l'intervallo ASCII stampabile.

Se desideri tutti gli ASCII, stampabili e non stampabili, puoi usare i byte escape :

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

L'approccio più strettamente corretto sarebbe convert_to(my_string, 'ascii') e lascia che venga sollevata un'eccezione se fallisce ... ma PostgreSQL non offre un ascii (cioè a 7 bit), quindi quell'approccio non è possibile.