Alterar el conjunto de caracteres y la clasificación en todas las columnas en todas las tablas en MySQL


18

Necesito ejecutar estas declaraciones en todas las tablas para todas las columnas.

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;

¿Es posible automatizar esto de alguna manera dentro de MySQL? Preferiría evitar mysqldump

Actualización: Richard Bronosky me mostró el camino :-)

La consulta que necesitaba ejecutar en cada tabla:

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Consulta loca para generar todas las demás consultas:

SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';

Solo quería ejecutarlo en una base de datos. Se estaba tardando demasiado en ejecutar todo en una sola pasada. Resultó que estaba generando una consulta por campo por tabla. Y solo era necesaria una consulta por tabla (distinta del rescate). Obtener el resultado en un archivo fue como me di cuenta.

Cómo generar la salida a un archivo:

mysql -B -N --user=user --password=secret -e "SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';" > alter.sql

Y finalmente para ejecutar todas las consultas:

mysql --user=user --password=secret < alter.sql

Gracias Richard ¡Eres el hombre!

Respuestas:


16

En primer lugar, ¡no solo confíe en mi palabra! Prueba mi sugerencia con esto:

select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema' limit 10; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema' limit 10;

Si se siente bien con el resultado de eso, elimine las cláusulas de límite y guarde la salida en un script SQL o, disfrute y canalice la salida directamente a mysql de forma similar a lo que demuestro aquí . Eso se vería así:

mysql -B -N --host=prod-db1 --user=admin --password=secret -e "select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema'; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema';" | mysql --host=prod-db1 --user=admin --password=secret

Cuando empiezas a pensar en usar SQL válido para generar SQL válido, cambia todo el juego. Te sorprenderá cuántos usos le encuentras.


¡Casi ahí! Pero no puedo entender bien la sintaxis
— The Disintegrator

ok lo tengo Estoy agregando la sintaxis correcta a la respuesta. Su idea gobierna
— The Desintegrator

4

En realidad, puede usar CONVERT TO en una tabla para convertir todas las columnas dentro de esa tabla en el conjunto de caracteres y la clasificación.

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename';

Además, tiene más sentido para mí seleccionar la base de datos real en la que desea hacer esto. Así que esto:

... WHERE TABLE_SCHEMA = 'databasename';

En vez de esto:

... WHERE TABLE_SCHEMA != 'information_schema';

Pero supongo que si realmente quisieras hacerlo en todas las mesas, podrías usar el primero. Aunque parece un poco pesado para mí. :)


1

Para cambiar la clasificación en todas las columnas que usé

SELECT CONCAT(  'ALTER TABLE ',  `TABLE_NAME` ,  ' CHANGE `',  `COLUMN_NAME` ,  '` `',`COLUMN_NAME` ,  '` ',  `DATA_TYPE` ,  '(',  `CHARACTER_MAXIMUM_LENGTH` ,  ') CHARACTER SET utf8 COLLATE utf8_swedish_ci ;' ) FROM  `COLUMNS` WHERE  `TABLE_SCHEMA` =  <schema> AND  `COLLATION_NAME` !=  'utf8_swedish_ci' ORDER BY  `TABLE_NAME` ,  `ORDINAL_POSITION` ;

0

Puedes usar el information_schema base de datos para buscar la columna y la tabla que debe modificar. Puedes encontrarlos con:

SELECT table_name, column_name FROM information_schema.`COLUMNS`
WHERE table_schema='your database' AND collation_name LIKE 'latin%';

Luego puede automatizar el alter con un script SQL, procedimiento de almacenamiento o con su lenguaje de desarrollo preferido.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.