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.