Изменить кодировку и сопоставление во всех столбцах во всех таблицах в MySQL

18

Мне нужно выполнить эти операторы во всех таблицах для всех столбцов.

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

Можно ли каким-либо образом автоматизировать это в MySQL? Я предпочел бы избежать mysqldump

Обновление: Ричард Броноски показал мне путь :-)

Запрос, который мне нужно было выполнить в каждой таблице:

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

Сумасшедший запрос для генерации всех остальных запросов:

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';

Я только хотел выполнить это в одной базе данных. Это заняло слишком много времени, чтобы выполнить все за один проход. Оказалось, что он генерирует один запрос на поле на таблицу. И только один запрос на таблицу был необходим (в отличие от спасения). Как я понял это, получил вывод файла.

Как сгенерировать вывод в файл:

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

И, наконец, выполнить все запросы:

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

Спасибо, Ричард. Ты мужчина!

Дезинтегратор
источник

Ответы:

16

Прежде всего, не поверьте мне на слово! Проверьте мое предложение с этим:

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;

Если вы чувствуете себя хорошо с результатом этого, удалите предложения limit и сохраните вывод в сценарий SQL или, сделайте фантазию и направьте вывод непосредственно в mysql, как показано здесь . Это будет выглядеть так:

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

Когда вы начинаете думать об использовании действительного SQL для генерации действительного SQL, это меняет всю игру. Вы будете поражены тем, сколько использований вы найдете для него.

Бруно Броноски
источник
Почти готово! Но не могу понять правильный синтаксис
The Disintegrator
хорошо, я понял. Я добавляю правильный синтаксис в ответ. Ваша идея правит
Дезинтегратор
4

На самом деле, вы можете использовать CONVERT TO для таблицы, чтобы преобразовать все столбцы в этой таблице в набор символов и параметры сортировки.

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';

Кроме того, для меня более разумно выбрать базу данных, на которой вы хотите это сделать. Итак, это:

... WHERE TABLE_SCHEMA = 'databasename';

а не это:

... WHERE TABLE_SCHEMA != 'information_schema';

Но я думаю, что если вы действительно хотите сделать это на всех столах, вы можете использовать первый. Кажется, мне немного тяжело. :)


источник
1

Чтобы изменить параметры сортировки для всех столбцов, которые я использовал

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` ;
RBH
источник
0

Вы можете использовать information_schemaбазу данных, чтобы найти столбец и таблицу, которую нужно изменить. Вы можете найти их с:

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

Затем вы можете автоматизировать изменение с помощью сценария SQL, хранимой процедуры или с вашим предпочтительным языком разработки.

LG.
источник