Sie können ASCII
definieren als ordinal 1 to 127
Zu diesem Zweck identifiziert die folgende Abfrage eine Zeichenfolge mit "Nicht-ASCII"-Werten:
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);
aber es ist wahrscheinlich nicht sehr effizient, und die Verwendung von Unterabfragen würde Sie dazu zwingen, es in einem Trigger statt in einer CHECK-Einschränkung zu tun.
Stattdessen würde ich einen regulären Ausdruck verwenden. Wenn Sie alle druckbaren Zeichen möchten dann können Sie einen Bereich in einer Check-Einschränkung verwenden, wie zum Beispiel:
CHECK (my_column ~ '^[ -~]*$')
das passt alles vom Leerzeichen bis zur Tilde , das ist der druckbare ASCII-Bereich.
Wenn Sie alles ASCII, druckbar und nicht druckbar wollen, können Sie Byte-Escapes verwenden :
CHECK (my_column ~ '^[\x00-\x7F]*$')
Der strengste Ansatz wäre convert_to(my_string, 'ascii')
und lassen Sie eine Ausnahme auslösen, wenn dies fehlschlägt ... aber PostgreSQL bietet kein ascii
an (d. h. 7-Bit)-Codierung, sodass dieser Ansatz nicht möglich ist.