आप ASCII
. को परिभाषित कर सकते हैं ordinal 1 to 127
. के रूप में इस उद्देश्य के लिए, इसलिए निम्न क्वेरी "गैर-असीसी" मानों वाली एक स्ट्रिंग की पहचान करेगी:
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-बिट) एन्कोडिंग, ताकि दृष्टिकोण संभव न हो।