Změna CHARSET a COLLATION u celé MySQL databáze
Webdesign, CMS
04.10.22
Pokud potřebujete změnit CHARSET a COLLATION na něco jednotného u databáze, všech tabulek a u veškerých VARCHAR a (MEDIUM)TEXT fieldů, tento jednoduchý skript to zajistí.
Výsledek dotazu stačí spustit :-)
-- database name to run script on
SET @DBNAME = 'syntex';
-- requested charset
SET @CHSET = 'utf8mb4';
-- requested collation
SET @COLL = 'utf8mb4_general_ci';
-- DATABASE collation
SELECT
CONCAT('ALTER DATABASE `',@DBNAME,'` CHARACTER SET ',@CHSET,' COLLATE ',@COLL,';') as _sql
UNION ALL
-- TABLE collations
SELECT
CONCAT('ALTER TABLE `', T.table_name, '` CHARACTER SET ',@CHSET,' COLLATE ',@COLL,';')
as _sql
FROM information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
JOIN information_schema.TABLES AS T ON T.table_collation = C.collation_name
WHERE T.table_schema = @DBNAME
AND (C.CHARACTER_SET_NAME != @CHSET OR C.COLLATION_NAME != @COLL)
UNION ALL
-- VARCHAR and TEXT fields collations
SELECT CONCAT(
'ALTER TABLE `', c.table_name, '` MODIFY `', c.column_name, '` ', c.DATA_TYPE,
IF(c.DATA_TYPE = 'varchar', CONCAT( '(', c.CHARACTER_MAXIMUM_LENGTH, ')'), ''),
' CHARACTER SET ',@CHSET,' COLLATE ', @COLL,
(CASE WHEN c.IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';' )
as _sql
FROM information_schema.COLUMNS c
JOIN information_schema.TABLES t ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME
WHERE c.TABLE_SCHEMA = @DBNAME
AND t.TABLE_TYPE LIKE '%TABLE%'
AND (c.DATA_TYPE = 'varchar' OR c.DATA_TYPE LIKE '%text%')
AND (c.CHARACTER_SET_NAME != @CHSET OR c.COLLATION_NAME != @COLL);