2014-09-19 2 views
5

मेरे पास एक पोस्टग्रेस्क्ल 9.3 डेटाबेस है जो 'यूटीएफ 8' एन्कोड किया गया है। हालांकि, डेटाबेस में एक कॉलम है जिसमें कभी भी ASCII के अलावा कुछ भी नहीं होना चाहिए। और यदि गैर-असीसी वहां जाता है, तो यह किसी अन्य प्रणाली में एक समस्या का कारण बनता है जिसका मेरा कोई नियंत्रण नहीं है। इसलिए, मैं कॉलम में बाधा जोड़ना चाहता हूं। नोट: मेरे पास पहले से ही ट्रिगर इन्टर ट्रिगर है - ताकि चेक करने के लिए यह एक अच्छी जगह हो।पोस्टग्रेस्क्ल बाधा गैर-असीसी अक्षरों की जांच करने के लिए

PostgreSQL में इसे पूरा करने का सबसे अच्छा तरीका क्या है?

उत्तर

8

आप ASCIIordinal 1 to 127 के रूप में इस उद्देश्य के लिए परिभाषित कर सकते हैं, तो निम्न क्वेरी "गैर-ascii" मूल्यों के साथ एक स्ट्रिंग की पहचान करेगा:

SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127); 

लेकिन यह सुपर कुशल होने की संभावना नहीं है, और उपयोग subqueries के लिए आप एक जांच बाधा के बजाय एक ट्रिगर में ऐसा करने के लिए मजबूर करेंगे।

इसके बजाय मैं नियमित अभिव्यक्ति का उपयोग करता हूं।

CHECK (my_column ~ '^[ -~]*$') 

this will match everything from the space to the tilde, जो प्रिंट योग्य ASCII रेंज है: आप चाहते हैं सभी प्रिंट करने योग्य पात्रों तो आपको एक श्रेणी एक चेक बाधा की तरह उपयोग कर सकते हैं,।

आप सभी ASCII, प्रिंट करने योग्य और अमुद्रणीय चाहते हैं, आप कर सकते हैं use byte escapes:

CHECK (my_column ~ '^[\x00-\x7F]*$') 

सबसे सख्ती से सही दृष्टिकोण convert_to(my_string, 'ascii') होगा और अगर यह विफल रहता है एक अपवाद उठाया जा चलो ... लेकिन PostgreSQL ascii (यानी 7-बिट) एन्कोडिंग प्रदान नहीं करता है, ताकि दृष्टिकोण संभव न हो।

3

regular expression के आसपास बनाए गए एक चेक बाधा का उपयोग करें।

यह मानते हुए कि क्या आपका मतलब है एक निश्चित स्तंभ से कुछ भी लेकिन लोअरकेस अक्षर होने कभी नहीं करना चाहिए एकz को, से एकजेड को बड़े अक्षरों और संख्याओं के माध्यम से , इस तरह कुछ काम करना चाहिए।

alter table your_table 
add constraint allow_ascii_only 
check (your_column ~ '^[a-zA-Z0-9]+$'); 

यह वही लोग आमतौर पर जब वे डेटाबेस स्तंभों के संबंध में के बारे में "केवल ASCII" बात मतलब है, लेकिन ASCII भी आदि विराम चिह्न के लिए ग्लिफ़, अंकगणितीय ऑपरेटर, वर्ण आप के बीच जाना अनुमति देना चाहते हैं शामिल है वर्ग कोष्ठक।

संबंधित मुद्दे