PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgresql-Einschränkung zum Suchen nach Nicht-ASCII-Zeichen

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.