Du kan definiera ASCII
som ordinal 1 to 127
för detta ändamål, så följande fråga kommer att identifiera en sträng med "icke-ascii"-värden:
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);
men det kommer sannolikt inte att vara supereffektivt, och användningen av underfrågor skulle tvinga dig att göra det i en trigger snarare än en CHECK-begränsning.
Istället skulle jag använda ett reguljärt uttryck. Om du vill ha alla utskrivbara tecken sedan kan du använda ett intervall i en kontrollbegränsning, som:
CHECK (my_column ~ '^[ -~]*$')
detta kommer att matcha allt från mellanslag till tilde , som är det utskrivbara ASCII-intervallet.
Om du vill ha all ASCII, utskrivbar och icke-utskrivbar, kan du använda byte escapes :
CHECK (my_column ~ '^[\x00-\x7F]*$')
Den mest strikt korrekta metoden skulle vara att convert_to(my_string, 'ascii')
och låt ett undantag göras om det misslyckas ... men PostgreSQL erbjuder inte en ascii
(dvs. 7-bitars) kodning, så det tillvägagångssättet är inte möjligt.