ASCII
を定義できます ordinal 1 to 127
として この目的のために、次のクエリは「非ASCII」値の文字列を識別します。
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);
ただし、これは非常に効率的ではない可能性があり、サブクエリを使用すると、CHECK制約ではなくトリガーで実行する必要があります。
代わりに、正規表現を使用します。 すべての印刷可能な文字が必要な場合 次に、次のようなチェック制約で範囲を使用できます。
CHECK (my_column ~ '^[ -~]*$')
これは、スペースからチルダまですべてに一致します 、これは印刷可能なASCII範囲です。
印刷可能および印刷不可能なすべてのASCIIが必要な場合は、
CHECK (my_column ~ '^[\x00-\x7F]*$')
最も厳密に正しいアプローチは、convert_to(my_string, 'ascii')
です。 失敗した場合は例外を発生させます...しかしPostgreSQLはascii
を提供していません (つまり、7ビット)エンコーディングであるため、アプローチは不可能です。