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.