Esportare Drupal da un sito locale ad un sito online.

Può succedere a volte che esportando drupal da uno spazio web ad un altro vi siano sull'ultimo dei problemi nella visualizzazione dei caratteri (di solito lettere accentate) o che semplicemente il database mysql ritorni un errore simile al seguente:
"Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation"
In questi casi il problema è quasi sicuramente da imputare alla collation.
Una breve introduzione: set di caratteri e collation
Un set di caratteri è un sistema col quale i diversi caratteri e simboli vengono memorizzati su un computer con un valore binario. In un insieme di caratteri (set di caratteri) un valore binario corrisponde quindi ad un simbolo preciso. Ad esempio possiamo avere un alfabeto composto da due lettere: "A", "a". A queste due lettere assegnamo un numero: "A" = 0, "a" = 1. La "A" è un simbolo e lo 0 è la codifica per tale simbolo. La "a" è un altro simbolo e la sua codifica è 1. La combinazione di queste due lettere e delle rispettive codifiche è un set di caratteri. MySQL dalla versione 4.1 possiede un supporto molto avanzato ai set di caratteri; è infatti possibile gestire i set di caratteri a livello server, database, tabella e colonna, client e connessione.Una collation è invece un insieme di regole utilizzate per confrontare i simboli che fanno parte di un set di caratteri. Collation si traduce con collazione, che significa confronto.Ad esempio possiamo fare in modo che "A" sia uguale ad "a". In questo caso dovremmo avere almeno due regole:

  1. considera la lettera minuscola "a" uguale alla lettera maiuscola "A".
  2. confronta le codifiche.

Abbiamo applicato una collation (confronto) non sensibile alle maiuscole.
Se con PhpMyAdmin vedete la seguente dicitura sotto la voce collation: latin1_general_cs vuol dire che si sta utilizzando il set di caratteri latin1, che tale collation è multilingua (general) e che tale collation considera come differenti le lettere maiuscole e minuscole (cs: case sensitive).
Le operazioni da fare per esportare il sito (files e database).
Supponiamo che abbiate un sito web in locale e che tale sito contenga già contenuti, moduli aggiuntivi e magari un tema che avete costruito appositamente. Ora per esportare il tutto online occorre esportare il database e caricare tutti i files del sito da locale a remoto.
Ecco la procedura da eseguire:

  • creare il database sul proprio spazio remoto
  • cambiare le impostazioni nel file settings.php
  • caricare da locale a remoto tutti i files che c'erano nella cartella locale della propria installazione di drupal
  • impostare a 777 la cartella /files/ sul sito remoto (CHMOD -R 777 /tua_cartella_drupal/files/)
  • guardare la collation del database ( cliccando su "Struttura") e memorizzarla.
  • esportare il database locale. In phpmyadmin andare quindi su "Esporta" e selezionare "Struttura" e "Dati".
  • in remoto, prima di andare ad accedere col browser all'indirizzo del sito web, importare il database, scegliendo lo stesso set di caratteri che si utilizzava sul database locale. In phpmyadmin andare su "Importa"e selezionare dal menù a tendina il set di caratteri che si utilizzava nella collation. Se ad esempio si utilizzava come collation utf8_general_ci scegliere dal menù a tendina utf8 come set di caratteri.
  • andare a controllare che la collation del database remoto sia uguale a quella utilizzata dal database locale. Portarsi quindi con phpmyadmin in "Operazioni" e in basso controllare la collation.
  • accedere all'indirizzo del proprio sito web e controllare che sia tutto uguale al sito locale (temi, moduli selezionati, caratteri accentati stampati in modo giusto e tutto il resto).

"Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation"
Mi è capitato una volta di dover migrare un sito web basato su drupal da un server MySQL 3.23 ad un server MySQL 4.1. Avevo ottenuto degli errori nella collation. Questo perchè MySQL 4.1 utilizza una collation predefinita che Drupal invece non utilizza. Le tabelle stanno utilizzando la collation latin1_swedish_ci e la connessione impostata da Drupal sta utilizzando invece utf8_general_ci.Per risolvere il problema, la collation su ogni tabella deve essere uft8_general_ci.
Alcune query utili
Per cambiare il set di caratteri:
ALTER DATABASE drupal_database CHARACTER SET utf8;
Per cambiare la collation:
ALTER DATABASE drupal_database COLLATE utf8_general_ci;
Per cambiare set di caratteri e collation ad una tabella
ALTER TABLE drupal_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;