Możesz zdefiniować ASCII
jako ordinal 1 to 127
w tym celu, więc następujące zapytanie zidentyfikuje ciąg z wartościami „non-ascii”:
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);
ale prawdopodobnie nie będzie to super wydajne, a użycie podzapytań zmusiłoby cię do zrobienia tego w wyzwalaczu, a nie w ograniczeniu CHECK.
Zamiast tego użyłbym wyrażenia regularnego. Jeśli chcesz wszystkie znaki do wydrukowania następnie możesz użyć zakresu w ograniczeniu sprawdzającym, na przykład:
CHECK (my_column ~ '^[ -~]*$')
dopasuje to wszystko, od przestrzeni po tyldę , który jest drukowalnym zakresem ASCII.
Jeśli chcesz, aby wszystkie ASCII, drukowane i niedrukowalne, możesz użyć bajtów ucieczki :
CHECK (my_column ~ '^[\x00-\x7F]*$')
Najbardziej poprawnym podejściem byłoby convert_to(my_string, 'ascii')
i niech zostanie zgłoszony wyjątek, jeśli się nie powiedzie ... ale PostgreSQL nie oferuje ascii
(tj. 7-bitowe) kodowanie, więc takie podejście nie jest możliwe.