Ubah charset dan collation di semua kolom di semua tabel di MySQL

18

Saya perlu menjalankan pernyataan ini di semua tabel untuk semua kolom.

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

Apakah mungkin untuk mengotomatisasi ini dengan cara apa pun di dalam MySQL? Saya lebih suka menghindari mysqldump

Pembaruan: Richard Bronosky menunjukkan caranya :-)

Kueri yang perlu saya jalankan di setiap tabel:

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

Gila kueri untuk menghasilkan semua kueri lain:

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

Saya hanya ingin menjalankannya dalam satu database. Butuh waktu terlalu lama untuk mengeksekusi semua dalam satu lulus. Ternyata itu menghasilkan satu permintaan per bidang per tabel. Dan hanya satu permintaan per tabel yang diperlukan (berbeda dengan penyelamatan). Mendapatkan output pada file adalah bagaimana saya menyadarinya.

Cara menghasilkan output ke file:

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

Dan akhirnya untuk mengeksekusi semua pertanyaan:

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

Terima kasih Richard. Kamulah orangnya!

Disintegrator
sumber

Jawaban:

16

Pertama-tama, jangan hanya mengambil kata-kata saya untuk itu! Uji saran saya dengan ini:

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;

Jika Anda merasa senang dengan hasilnya, hapus klausa batas dan simpan output ke skrip SQL atau, dapatkan dan kirimkan output langsung ke mysql seperti yang saya tunjukkan di sini . Itu akan terlihat seperti ini:

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

Ketika Anda mulai berpikir tentang menggunakan SQL yang valid untuk menghasilkan SQL yang valid, itu mengubah seluruh permainan. Anda akan kagum dengan berapa banyak kegunaan yang Anda temukan untuk itu.

Bruno Bronosky
sumber
Hampir sampai! Tetapi tidak bisa mendapatkan sintaks yang benar
The Disintegrator
ok saya mengerti. Saya menambahkan sintax yang benar untuk jawabannya. Aturan ide Anda
The Disintegrator
4

Sebenarnya, Anda bisa menggunakan CONVERT TO pada sebuah tabel untuk mengkonversikan semua kolom di dalam tabel itu ke charset dan collation.

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

Juga, lebih masuk akal bagi saya untuk memilih database aktual yang Anda inginkan. Jadi ini:

... WHERE TABLE_SCHEMA = 'databasename';

daripada ini:

... WHERE TABLE_SCHEMA != 'information_schema';

Tapi saya kira jika Anda benar - benar ingin melakukannya di semua tabel, Anda bisa menggunakan yang pertama. Tampaknya agak berat bagiku. :)


sumber
1

Untuk mengubah susunan pada semua kolom yang saya gunakan

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

Anda dapat menggunakan information_schemadatabase untuk menemukan kolom dan tabel yang harus Anda ubah. Anda dapat menemukannya dengan:

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

Kemudian Anda dapat mengotomatiskan alter dengan skrip SQL, prosedur store atau dengan bahasa pengembangan pilihan Anda.

lg.
sumber