sql >> Database >  >> RDS >> PostgreSQL

Postgresql-beperking om te controleren op niet-ascii-tekens

U kunt ASCII . definiëren als ordinal 1 to 127 voor dit doel, dus de volgende query identificeert een string met "niet-ascii"-waarden:

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

maar het is waarschijnlijk niet superefficiënt, en het gebruik van subquery's zou je dwingen om het te doen in een trigger in plaats van een CHECK-beperking.

In plaats daarvan zou ik een reguliere expressie gebruiken. Als u alle afdrukbare tekens wilt hebben dan kun je een bereik gebruiken in een controlebeperking, zoals:

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

dit komt overeen met alles, van de ruimte tot de tilde , wat het afdrukbare ASCII-bereik is.

Als u alle ASCII-, afdrukbare en niet-afdrukbare wilt, kunt u byte-escapes gebruiken :

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

De meest strikt correcte benadering zou zijn om convert_to(my_string, 'ascii') en laat een uitzondering worden gemaakt als het mislukt ... maar PostgreSQL biedt geen ascii (d.w.z. 7-bits) codering, dus die benadering is niet mogelijk.



  1. Kan PostgreSQL niet installeren:er is een fout opgetreden bij het uitvoeren van het Microsoft VC++ runtime-installatieprogramma op Windows XP

  2. Postgresql-adapter (pg):kon geen verbinding maken met de server

  3. Tabel ongedaan maken in MySQL

  4. Wat is de beste manier om te controleren op dubbele TEKST-velden in MYSQL/PHP?