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.