Змінення діаграми та порівняння у всіх стовпцях усіх таблиць 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;

Якщо ви відчуваєте себе добре з результатом цього, видаліть обмежувальні пропозиції та збережіть висновок у 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

добре, я зрозумів. Я додаю у відповідь правильний синтаксис. Правила вашої ідеї
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` ;

0

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

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

Тоді ви можете автоматизувати alter за допомогою SQL-скрипту, зберігати процедуру або за допомогою бажаної мови розробки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.