sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql-begrænsning for at tjekke for ikke-ascii-tegn

Du kan definere ASCII som ordinal 1 to 127 til dette formål, så følgende forespørgsel vil identificere en streng med "non-ascii"-værdier:

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

men det er sandsynligvis ikke supereffektivt, og brugen af ​​underforespørgsler ville tvinge dig til at gøre det i en trigger frem for en CHECK-begrænsning.

I stedet ville jeg bruge et regulært udtryk. Hvis du vil have alle udskrivbare tegn så kan du bruge et interval i en kontrolbegrænsning, såsom:

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

dette vil matche alt fra mellemrummet til tilden , som er det udskrivbare ASCII-område.

Hvis du vil have alle ASCII, printbare og ikke-printbare, kan du bruge byte escapes :

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

Den mest strengt korrekte tilgang ville være at convert_to(my_string, 'ascii') og lad en undtagelse blive rejst, hvis den mislykkes ... men PostgreSQL tilbyder ikke en ascii (dvs. 7-bit) kodning, så den tilgang er ikke mulig.



  1. Hvilken .NET-datatype er bedst til at kortlægge NUMBER Oracle-datatypen i NHibernate?

  2. Fremmednøgle til ikke-primær nøgle

  3. Sådan undgår du denne PDO-undtagelse:Kan ikke udføre forespørgsler, mens andre ubuffrede forespørgsler er aktive

  4. Brug af MySQL-udløsere til at logge alle tabelændringer til en sekundær tabel