mysql - una - ¿Cómo cambiar la intercalación de todas las filas de latin1_swedish_ci a utf8_unicode_ci?
mysql collation (2)
Realmente puedes hacer esto dentro de MySQL, usando un procedimiento.
Basado en https://stackoverflow.com/a/12718767/1612273 . Utiliza la base de datos actual, ¡así que asegúrate de hacerlo en la correcta!
delimiter //
DROP PROCEDURE IF EXISTS convert_database_to_utf8 //
CREATE PROCEDURE convert_database_to_utf8()
BEGIN
DECLARE table_name VARCHAR(255);
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR
SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = DATABASE() AND t.table_type=''BASE TABLE'';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
tables_loop: LOOP
FETCH cur INTO table_name;
IF done THEN
LEAVE tables_loop;
END IF;
SET @sql = CONCAT("ALTER TABLE ", table_name, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END LOOP;
CLOSE cur;
END //
delimiter ;
call convert_database_to_utf8();
Usé ignorantemente la codificación de caracteres predeterminada latin1_swedish_ci para todas las filas varchar en mi base de datos durante el desarrollo y he determinado que esta es la raíz de los problemas de codificación de caracteres que he tenido. Además de eso, parece que la mayoría de las personas en estos días recomiendan que se use utf8_unicode_ci.
Me gustaría convertir la codificación de caracteres para todas las filas de mi base de datos de latin1_swedish_ci a utf8_unicode_ci, pero la única forma de hacerlo es cambiarlo fila por fila en phpMyAdmin, lo cual es realmente lento.
¿Existe una forma más rápida, como una consulta que se pueda ejecutar y que cambie la intercalación de todas las filas varchar / text de latin1_swedish_ci a utf8_unicode_ci?
Si las columnas están usando el conjunto de caracteres de la tabla por defecto, solo es una consulta por tabla para convertir:
ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Si el conjunto de caracteres se establece individualmente en cada columna, AFAIK no hay manera de hacerlo en todas las columnas de todas las tablas en la base de datos directamente en MySql, pero puede escribir un pequeño programa en el idioma que elija.
Su programa consultará la tabla INFORMATION_SCHEMA.COLUMNS
y verá la columna CHARACTER_SET_NAME
:
SELECT * FROM `INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_SCHEMA = ''dbname'' AND CHARACTER_SET_NAME = ''latin1''
Para cada fila de resultados es trivial sintetizar y ejecutar una consulta ALTER TABLE
en el lugar que cambia el conjunto de caracteres y la intercalación de manera apropiada:
ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
En la consulta anterior, t
, col
y TEXT
serían los valores de las TABLE_NAME
, COLUMN_NAME
y DATA_TYPE
del conjunto de resultados INFORMATION_SCHEMA.COLUMNS
.