Ändern Sie den Zeichensatz und die Sortierung in allen Spalten aller Tabellen in MySQL

18

Ich muss diese Anweisungen in allen Tabellen für alle Spalten ausführen.

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

Ist es möglich, dies in MySQL auf irgendeine Weise zu automatisieren? Ich würde es vorziehen, mysqldump zu vermeiden

Update: Richard Bronosky hat mir den Weg gezeigt :-)

Die Abfrage, die ich in jeder Tabelle ausführen musste:

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

Verrückte Abfrage, um alle anderen Abfragen zu generieren:

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

Ich wollte es nur in einer Datenbank ausführen. Es dauerte zu lange, um alles in einem Durchgang auszuführen. Es stellte sich heraus, dass eine Abfrage pro Feld und Tabelle generiert wurde. Und nur eine Abfrage pro Tabelle war erforderlich (anders als bei der Rettung). Die Ausgabe auf eine Datei zu bekommen war, wie ich es realisiert habe.

So generieren Sie die Ausgabe in eine Datei:

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

Und zum Schluss alle Abfragen ausführen:

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

Danke Richard. Du bist der Mann!

Der Desintegrator
quelle

Antworten:

16

Nehmen Sie zuallererst nicht einfach mein Wort dafür! Testen Sie meinen Vorschlag mit diesem:

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;

Wenn Sie mit dem Ergebnis zufrieden sind, entfernen Sie die limit-Klauseln und speichern Sie die Ausgabe in einem SQL-Skript oder leiten Sie die Ausgabe direkt an mysql, ähnlich dem, was ich hier demonstriere . Das würde so aussehen:

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

Wenn Sie über die Verwendung von gültigem SQL nachdenken, um gültiges SQL zu generieren, ändert sich das gesamte Spiel. Sie werden erstaunt sein, wie viele Anwendungen Sie dafür finden.

Bruno Bronosky
quelle
Fast dort! Aber die Syntax stimmt nicht
The Disintegrator
ok ich habe es verstanden Ich füge der Antwort die richtige Sintax hinzu. Ihre Idee regiert
The Disintegrator
4

Tatsächlich können Sie CONVERT TO für eine Tabelle verwenden, um alle Spalten in dieser Tabelle in den Zeichensatz und die Sortierung zu konvertieren.

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

Außerdem ist es für mich sinnvoller, die tatsächliche Datenbank auszuwählen, für die Sie dies tun möchten. Also das:

... WHERE TABLE_SCHEMA = 'databasename';

lieber als das:

... WHERE TABLE_SCHEMA != 'information_schema';

Aber ich denke, wenn du es wirklich auf allen Tischen machen wolltest, könntest du das erstere verwenden. Scheint mir allerdings ein bisschen schwer zu fallen. :)


quelle
1

Um die Sortierung für alle von mir verwendeten Spalten zu ändern

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
quelle
0

Sie können die information_schemaDatenbank verwenden, um die zu ändernde Spalte und Tabelle zu finden. Sie finden sie mit:

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

Anschließend können Sie die Änderung mit einem SQL-Skript, einer Speicherprozedur oder mit Ihrer bevorzugten Entwicklungssprache automatisieren.

lg.
quelle