MySQL - Come modificare la Collation di tutte le Tabelle e-o Colonne di un Database
MySQL - How to convert all Database Tables and Columns to a specific Collation
Mediante un semplice query builder basato sull'istruzione CONCAT.
Significato del termine Collation, che spesso viene impropriamente confuso con il Character Set.
A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.
E' buona norma utilizzare la stessa Collation su tutte le tabelle che abbiamo la necessità di collegare tra loro attraverso query JOIN, UNION, ricerche FULL-TEXT, ricerche basate su LIKE e via dicendo. Quando questo non accade, c'è un concreto rischio di ricevere errori come il seguente:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation
Modificare la Collation di un Database
ALTER DATABASE DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Modificare la Collation di tutte le Tabelle di uno o più Database
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME,' COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='DBNAME' AND TABLE_TYPE = 'BASE TABLE';
IMPORTANTE: La query di cui sopra non farà altro che generare una serie di query, che poi sarà necessario eseguire a loro volta per effettuare la modifica sul Database.
Modificare la Collation di tutte le Tabelle e di tutte le Colonne di uno o più Database
Il comando di cui sopra modificherà la Collation di tutte le tabelle, ma non il character set utilizzato per memorizzare i valori delle colonne testuali (varchar, text et al.) ivi contenute. Per modificare anche il contenuto delle colonne, è necessario eseguire anche questa query:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS mySQL
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA= "DBNAME" AND TABLE_TYPE="BASE TABLE"
Anche in questo caso, la query produrrà una serie di query da eseguire per effettuare la modifica: prima di eseguirli, in questo, potrebbe essere necessario disabilitare temporaneamente il controllo delle chiavi esterne nel seguente modo:
SET foreign_key_checks = 0;
Se lo fate, ricordatevi di ripristinarlo al termine dell'operazione.
Prima di effettuare ciascuna di queste operazioni è fortemente consigliabile eseguire un backup completo del Database: è opportuno ricordare che l'istruzione ALTER TABLE (per convertire il valore delle colonne testuali da un character set all'altro), MySQL proverà ad effettuare la conversione attraverso un mapping dei caratteri: qualora i set di caratteri risultassero incompatibili, si potrebbe verificare una perdita di dati.