MySQL'deki tüm tablolardaki tüm sütunlarda karakter kümesini ve harmanlamayı değiştirme


18

Tüm sütunlar için tüm tablolarda bu ifadeleri yürütmek gerekiyor.

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

Bunu MySQL içinde herhangi bir şekilde otomatikleştirmek mümkün müdür? MySQLDump önlemek istiyorum

Güncelleme: Richard Bronosky bana yolu gösterdi :-)

Her tabloda yürütmek için gereken sorgu:

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

Diğer tüm sorguları oluşturmak için çılgın sorgu:

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

Sadece bir veritabanında yürütmek istedim. Hepsini bir geçişte gerçekleştirmek çok uzun sürüyordu. Tablo başına alan başına bir sorgu oluşturduğu ortaya çıktı. Ve tablo başına sadece bir sorgu gerekliydi (kurtarmaya özgü). Bir dosyada çıktı almak bunu nasıl fark ettiğim oldu.

Bir dosyaya çıktı nasıl oluşturulur:

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

Ve son olarak tüm sorguları yürütmek için:

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

Teşekkürler Richard. Sen adamsın!

Yanıtlar:


16

Her şeyden önce, sadece benim sözüme güvenmeyin! Önerimi şu şekilde test et:

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;

Bunun sonucuyla iyi hissediyorsanız, sınır yan tümcelerini kaldırın ve çıktıyı bir SQL komut dosyasına kaydedin veya çıktıyı burada gösterdiğim gibi doğrudan mysql'e süsleyin ve doğrudan yönlendirin . Bu şöyle görünecektir:

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

Geçerli SQL oluşturmak için geçerli SQL kullanmayı düşünmeye başladığınızda, oyunun tamamı değişir. Bunun için kaç kullanım bulduğunuza şaşıracaksınız.


Neredeyse! Ancak sözdizimi doğru alınamıyor
The Disintegrator

tamam anladım. Cevaba doğru sintaks ekliyorum. Fikriniz Kurallar
The Disintegrator

4

Aslında, tablodaki tüm sütunları karakter kümesine ve harmanlamaya dönüştürmesi için bir tablodaki CONVERT TO işlevini kullanabilirsiniz.

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

Ayrıca, bunu yapmak istediğiniz gerçek veritabanını seçmek benim için daha mantıklı. Yani bu:

... WHERE TABLE_SCHEMA = 'databasename';

bunun yerine:

... WHERE TABLE_SCHEMA != 'information_schema';

Ama sanırım bunu gerçekten tüm masalarda yapmak istiyorsan, ilkini kullanabilirsin. Gerçi bana biraz ağır geliyor. :)


1

Kullandığım tüm sütunlardaki harmanlamayı değiştirmek için

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_schemaDeğiştirmeniz gereken sütun ve tabloyu bulmak için veritabanını kullanabilirsiniz . Bunları şurada bulabilirsiniz:

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

Ardından, değiştirmeyi bir SQL komut dosyası, depolama yordamı veya tercih ettiğiniz geliştirme diliyle otomatikleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.