Bạn có thể xác định ASCII
dưới dạng ordinal 1 to 127
cho mục đích này, vì vậy truy vấn sau sẽ xác định một chuỗi có giá trị "không phải ascii":
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);
nhưng nó không có khả năng siêu hiệu quả và việc sử dụng các truy vấn con sẽ buộc bạn thực hiện điều đó trong một trình kích hoạt thay vì ràng buộc KIỂM TRA.
Thay vào đó, tôi sẽ sử dụng một biểu thức chính quy. Nếu bạn muốn tất cả các ký tự có thể in được thì bạn có thể sử dụng một phạm vi trong một ràng buộc kiểm tra, như:
CHECK (my_column ~ '^[ -~]*$')
điều này sẽ khớp với mọi thứ từ dấu cách đến dấu ngã , là phạm vi ASCII có thể in được.
Nếu bạn muốn tất cả ASCII, có thể in và không thể in, bạn có thể sử dụng các thoát byte :
CHECK (my_column ~ '^[\x00-\x7F]*$')
Cách tiếp cận chính xác nhất sẽ là convert_to(my_string, 'ascii')
và để một ngoại lệ được nêu ra nếu nó không thành công ... nhưng PostgreSQL không cung cấp ascii
(tức là 7-bit) mã hóa, vì vậy cách tiếp cận đó không thể thực hiện được.