2014-09-19 22 views
5

'UTF8' kodlanmış bir Postgresql 9.3 veritabanım var. Ancak, veritabanında ASCII'den başka bir şey içermemesi gereken bir sütun var. Ve eğer ascii oraya girmezse, başka bir sistemde kontrolüm olmadığı bir soruna neden olur. Bu nedenle, sütuna bir kısıtlama eklemek istiyorum. Not: Zaten bir ÖNCE INSERT tetikleyiciye sahibim - bu nedenle çek için iyi bir yer olabilir.Ascii olmayan karakterleri denetlemek için Postgresql kısıtlaması

Bunu PostgreSQL'de başarmanın en iyi yolu nedir?

cevap

8

Bu amaçla ordinal 1 to 127 olarak ASCII tanımlayabilirsiniz, bu nedenle aşağıdaki sorgu "ASCII olmayan" değerlere sahip bir dize belirleyecektir:

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

ama süper verimli olmamaya olasıdır ve kullanımı alt sorguların sizi CHECK kısıtlaması yerine bir tetikleyici içinde yapmaya zorlar.

Onun yerine normal bir ifade kullanmayı tercih ediyorum. yazdırılabilir ASCII aralığını ise

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

this will match everything from the space to the tilde: Eğer istiyorsanız yazdırılabilir tüm karakterleri o zaman gibi bir denetim sınırlaması bir aralık kullanabilirsiniz.

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

en sıkı doğru yaklaşım convert_to(my_string, 'ascii') için olmak ve başarısız olursa bir istisna oluştuğunda izin verir ... ama: Tüm ASCII, yazdırılabilir ve yazdırılamaz istiyorsanız

, sen use byte escapes can PostgreSQL, ascii (yani 7 bit) kodlamayı sunmaz, böylece yaklaşım mümkün değildir.

3

regular expression etrafında kurulmuş bir CHECK kısıtlaması kullanın.

Belirli bir sütun den küçük harfler başka bir şey içermeyen asla demek olduğunu varsayarsak bir ziçin AZ'ye için büyük harfler ve sayılar aracılığıyla Böyle bir şey işe yaramalı.

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

Bu

onlar veritabanı sütunlara göre "sadece ASCII" bahsederken insanlar genellikle istemem ama ASCII da vb noktalama motifi, aritmetik operatörler, sen arasında gidip izin vermek istediğiniz Karakterler içerir budur köşeli parantez.

İlgili konular