Torna a Database

MySQL

Spread the love

Problemi e risposte sul DBMS che voleva fare concorrenza ma che è appena assorbito da Oracle.

Charset e Collation in MySQL

Mi sono imbattuto in un problema bloccante di un sito web: la non coerente adozione di uno stesso encoding in tutti i “pezzi” dell’applicazione web può provocare, in alcuni casi, anche errori bloccanti.

Ciò di cui parliamo sono due proprietà dei caratteri:

  1. l’encoding (codifica) che è la mappatura tra il simbolo (ad esempio “è”) ed il codice esadecimale che lo rappresenta in un file, in un pacchetto TCP/IP, in un database.
  2. la collation (confronto) che consiste in una serie di regole secondo le quali le stringhe vengono confrontate.

Collation binaria

Supponiamo di avere questo alfabeto A={‘a’,’b’,’A’,’B’}.

L’encoding (la codifica) è l’insieme c={0, 1, 2, 3}.

Il charset è la mappa cA che si può esprimere nella tabella

Simbolo Codice
a 0
b 1
A 2
B 3

La collation è una regola che ci consente di confrontare le stringhe. Che non è una cosa semplice quanto sembra. Se è vero che ‘a’ < ‘b’ (a precede b) e che per stabilire questa regola di precedenza possiamo utilizzare i codici così come sono (0 < 1 ⇒ ‘a’ < ‘b’), allora abbiamo scoperto un metodo per confrontare le stringhe che va sotto il nome di confronto binario (binary collation). Questa regola funziona anche se confrontiamo ‘A’ e ‘B’ (infatti questo lo possiamo dedurre dal momento che 2<3).

Ma come la mettiamo con il fatto che secondo questa regola di confronto ‘b’ < ‘A’ ?

Dobbiamo adottare una regola più complessa, ad esempio la case-insensitive collation.

Secondo questa regola dobbiamo prima calcolare c mod 2 per ogni carattere e poi confrontare i codici risultanti, quindi stabiliamo che ‘A’ < ‘b’ (e non il contrario come suggerirebbe il confronto binario).

La cosa si complica se utilizziamo caratteri ‘è’, ‘à’… anzi… ogni lingua ha le sue regole di precedenza. Quindi se al DB chiediamo di fare confronti di stringhe è necessario impostare l’algoritmo giusto per quella lingua.

Come esportare su file in modo che scriva null sulle colonne nulle

La sintassi generale è

 SELECT [elenco campi] INTO OUTFILE [nome file]
   FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '|' ESCAPED BY ''
   LINES TERMINATED BY 'n'
 FROM [schema.tabella];

Se si omette l’opzione ESCAPED BY, i null verranno esportati come \N, mentre così come è scritto, verranno esportati come null.

Questa cosa mi ha dato fastidio quando ho cercato di importare in Oracle tabelle di un database MySQL.

Lascia un commento

Your email address will not be published.