sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql-begränsning för att leta efter icke-ascii-tecken

Du kan definiera ASCII som ordinal 1 to 127 för detta ändamål, så följande fråga kommer att identifiera en sträng med "icke-ascii"-värden:

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

men det kommer sannolikt inte att vara supereffektivt, och användningen av underfrågor skulle tvinga dig att göra det i en trigger snarare än en CHECK-begränsning.

Istället skulle jag använda ett reguljärt uttryck. Om du vill ha alla utskrivbara tecken sedan kan du använda ett intervall i en kontrollbegränsning, som:

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

detta kommer att matcha allt från mellanslag till tilde , som är det utskrivbara ASCII-intervallet.

Om du vill ha all ASCII, utskrivbar och icke-utskrivbar, kan du använda byte escapes :

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

Den mest strikt korrekta metoden skulle vara att convert_to(my_string, 'ascii') och låt ett undantag göras om det misslyckas ... men PostgreSQL erbjuder inte en ascii (dvs. 7-bitars) kodning, så det tillvägagångssättet är inte möjligt.



  1. SQL CASE:Känn till och undvik 3 mindre kända problem

  2. Hur laddar man upp en bild till en databas med php-skript?

  3. Problem för infogning med psycopg

  4. At-Sign in SQL-sats före kolumnnamn