เปลี่ยนชุดอักขระและการเรียงในคอลัมน์ทั้งหมดในตารางทั้งหมดใน MySQL


18

ฉันต้องการรันคำสั่งเหล่านี้ในตารางทั้งหมดสำหรับคอลัมน์ทั้งหมด

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

เป็นไปได้ไหมที่จะใช้ระบบอัตโนมัตินี้ในทางใดทางหนึ่งใน MySQL? ฉันต้องการหลีกเลี่ยง mysqldump

ปรับปรุง: Richard Bronosky แสดงให้ฉันเห็นวิธี :-)

แบบสอบถามที่ฉันต้องการดำเนินการในทุกตาราง:

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

ตกลงฉันเข้าใจแล้ว ฉันกำลังเพิ่ม sintax ที่ถูกต้องให้กับคำตอบ กฎความคิดของคุณ
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%';

จากนั้นคุณสามารถทำการเปลี่ยนแปลงโดยอัตโนมัติด้วยสคริปต์ SQL, ขั้นตอนการจัดเก็บหรือด้วยภาษาการพัฒนาที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.