จะเปลี่ยนชุดอักขระเริ่มต้นของตาราง MySQL ได้อย่างไร?


100

มี MySQL tableซึ่งมีคำจำกัดความนี้มาจากSQLYog Enterprise:

Table              Create Table                                             
-----------------  ---------------------------------------------------------
etape_prospection  CREATE TABLE `etape_prospection` (                       
                     `etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT,      
                     `type_prosp_id` int(10) NOT NULL DEFAULT '0',          
                     `prosp_id` int(10) NOT NULL DEFAULT '0',               
                     `etape_prosp_date` datetime DEFAULT NULL,              
                     `etape_prosp_comment` text,                            
                     PRIMARY KEY (`etape_prosp_id`),                        
                     KEY `concerne_fk` (`prosp_id`),                        
                     KEY `de_type_fk` (`type_prosp_id`)                     
                   ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1  

ฉันต้องการที่จะเปลี่ยนdefault charsetของตารางนี้จากไปlatin1 utf8ต้องทำอย่างไร?


3
ชื่อที่ถูกต้องสำหรับ "UTF8" ใน MySQL คือ "utf8mb4" ชุดอักขระ "utf8" ใช้งานไม่ได้รองรับอักขระไม่เกิน 3 ไบต์เท่านั้น ดูรายละเอียดในคู่มือ mysql หรือ google "mysql" และ "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

คำตอบ:


210

หากคุณต้องการเปลี่ยนตารางdefault character setและคอลัมน์อักขระทั้งหมดให้เป็นชุดอักขระใหม่ให้ใช้คำสั่งดังนี้:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

ดังนั้นแบบสอบถามจะเป็น:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

23
ในทางตรงกันข้ามหากคุณใช้ALTER TABLE tbl CHARACTER SET utf8ไวยากรณ์ตามที่ผู้อื่นแนะนำคุณจะเปลี่ยนเฉพาะการเข้ารหัสเริ่มต้นสำหรับตาราง คอลัมน์ที่มีอยู่จะไม่ถูกแปลงตามที่ต้องการหากคุณใช้คำตอบนี้
eaj

8
หากคุณต้องการใช้การเปลี่ยนแปลงนี้กับตารางทั้งหมดที่ไม่ได้เข้ารหัสใน ut8 ในฐานข้อมูลคุณสามารถใช้แบบสอบถามนี้และดำเนินการค้นหาผลลัพธ์: SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
Maxooo

3
นี่ไม่ใช่การเปลี่ยนชุดอักขระเริ่มต้น เพื่อเปลี่ยนค่าเริ่มต้นให้ทำตามที่คุณเอกกล่าวALTER TABLE tbl CHARACTER SET utf8
นักบัญชี

7
ฉันต้องการเพิ่มว่าโดยปกติคุณไม่ต้องการใช้ utf8 แต่ใช้ utf8mb4 แทนเพื่อให้ได้สิ่งที่คุณคาดหวังว่า utf8 จะเป็น เพื่ออธิบาย: ใน MySQL utf8 เป็นเพียงส่วนย่อยของ utf8 ซึ่งจะดีกว่าชื่อ utf8mb3 สามารถเข้ารหัสอักขระ utf8 ได้สูงสุด 3 ไบต์แทนที่จะเป็น 4 ไบต์ที่ระบุ ซึ่งหมายความว่าอีโมจิจำนวนมากจะไม่สามารถเข้ารหัสได้และจะสูญหายไปหากคุณพยายามเขียนลงในฐานข้อมูล ดูเช่น medium.com/@adamhooper/…สำหรับรายละเอียด
dwt

7
สำหรับหลายไบต์คุณสามารถใช้ได้ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

19

เปลี่ยนชุดอักขระเริ่มต้นของตาราง:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

ในการเปลี่ยนชุดอักขระคอลัมน์สตริงดำเนินการค้นหานี้:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;

12
คุณไม่ควรเคยใช้ utf8_general_ci มันก็ไม่ได้ผล เป็นการย้อนกลับไปสู่วันเก่าที่เลวร้ายของ ASCII stooopeeedity เมื่อห้าสิบปีก่อน การจับคู่แบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ของ Unicode ไม่สามารถทำได้หากไม่มีแผนที่พับจาก UCD ตัวอย่างเช่น“ Σίσυφος” มีซิกมาสที่แตกต่างกันสามแบบ หรือตัวพิมพ์เล็กของ“ TSCHüẞ” คือ“ tschüβ” อย่างไร แต่ตัวพิมพ์ใหญ่ของ“ tschüβ” คือ“ TSCHÜSS” คุณพูดถูกหรือจะเร็วก็ได้ ดังนั้นคุณต้องใช้ utf8_unicode_ci เพราะถ้าคุณไม่สนใจเกี่ยวกับความถูกต้องมันก็เป็นเรื่องเล็กน้อยที่จะทำให้มันเร็วอย่างไม่สิ้นสุด
Yohanes AI

2
ชุดอักขระ MySQL UTF8 เสียคุณต้องใช้ utf8mb4!
Samuel Åslund

5

ALTER TABLEคำสั่ง MySQL ควรทำเคล็ดลับ คำสั่งต่อไปนี้จะเปลี่ยนชุดอักขระเริ่มต้นของตารางของคุณและชุดอักขระของคอลัมน์ทั้งหมดเป็น UTF8

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

คำสั่งนี้จะแปลงคอลัมน์ที่เหมือนข้อความทั้งหมดในตารางเป็นชุดอักขระใหม่ ชุดอักขระใช้จำนวนข้อมูลที่แตกต่างกันต่ออักขระดังนั้น MySQL จะแปลงประเภทของคอลัมน์บางคอลัมน์เพื่อให้แน่ใจว่ามีที่ว่างเพียงพอที่จะใส่จำนวนอักขระเดียวกันกับประเภทคอลัมน์เก่า

ขอแนะนำให้คุณอ่านเอกสารALTER TABLE MySQLก่อนที่จะแก้ไขข้อมูลสดใด ๆ


1
ใช่มันทำเคล็ดลับ แต่สิ่งหนึ่งที่แตกต่างกับการแปลงเป็นวิธี: ไม่สามารถลบตัวเลือกชุดอักขระเก่าออกจากคอลัมน์โดยอัตโนมัติ
tech_me

3

หากมีคนกำลังค้นหาโซลูชันที่สมบูรณ์สำหรับการเปลี่ยนชุดอักขระเริ่มต้นสำหรับตารางฐานข้อมูลทั้งหมดและการแปลงข้อมูลอาจเป็นอย่างใดอย่างหนึ่ง:

DELIMITER $$

CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255))
BEGIN
  SET @tquery = `sql_text`;
  PREPARE `stmt` FROM @tquery;
  EXECUTE `stmt`;
  DEALLOCATE PREPARE `stmt`;
END$$

CREATE PROCEDURE `change_character_set`(IN `charset` VARCHAR(64), IN `collation` VARCHAR(64))
BEGIN
DECLARE `done` BOOLEAN DEFAULT FALSE;
DECLARE `tab_name` VARCHAR(64);
DECLARE `charset_cursor` CURSOR FOR 
    SELECT `table_name` FROM `information_schema`.`tables`
    WHERE `table_schema` = DATABASE() AND `table_type` = 'BASE TABLE';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = TRUE;

SET foreign_key_checks = 0;
OPEN `charset_cursor`;
`change_loop`: LOOP
FETCH `charset_cursor` INTO `tab_name`;
IF `done` THEN
    LEAVE `change_loop`;
END IF;
CALL `exec_query`(CONCAT(
  'ALTER TABLE `',
  tab_name,
  '` CONVERT TO CHARACTER SET ',
  QUOTE(charset),
  ' COLLATE ',
  QUOTE(collation),
  ';'
));
CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;'));
CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;'));
END LOOP `change_loop`;
CLOSE `charset_cursor`;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

คุณสามารถวางรหัสนี้ไว้ในไฟล์เช่นchg_char_set.sqlและเรียกใช้งานได้เช่นโดยเรียกจากเทอร์มินัล MySQL:

SOURCE ~/path-to-the-file/chg_char_set.sql

จากนั้นเรียกขั้นตอนที่กำหนดด้วยพารามิเตอร์อินพุตที่ต้องการเช่น

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

เมื่อคุณทดสอบผลลัพธ์แล้วคุณสามารถวางขั้นตอนที่เก็บไว้เหล่านั้นได้:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;

มีเงื่อนไขที่ขาดหายไปซึ่งทำให้เราต้องเลือกมุมมองด้วย มันคือ WHERE table_schema = DATABASE (); => WHERE table_schema = ฐานข้อมูล () และ table_type = 'ฐานตาราง'; แต่ขอบคุณ!! นี่คือสิ่งที่ฉันต้องการ!
nguyenhoai890

2

คุณสามารถเปลี่ยนค่าเริ่มต้นโดยใช้alter table set default charsetแต่จะไม่เปลี่ยนชุดอักขระของคอลัมน์ที่มีอยู่ ในการเปลี่ยนที่คุณต้องใช้ไฟล์alter table modify column.

การเปลี่ยนชุดอักขระของคอลัมน์หมายความว่าจะสามารถจัดเก็บอักขระได้หลากหลายขึ้น แอปพลิเคชันของคุณพูดคุยกับฐานข้อมูลโดยใช้ไคลเอนต์ mysql ดังนั้นคุณอาจต้องเปลี่ยนการเข้ารหัสไคลเอ็นต์ด้วย


ฉันจะถ้ามันไม่ใช่สำหรับคีย์บอร์ดแบบ จำกัด บน iPod touch :-)
Joni

ดี iPod Touch / iPhone จะต้องมีบางข้อเสียเปรียบ :-P ไม่เคยตระหนักว่าพวกเขาหายไปจนกว่าคุณจะพูดถึงมัน ;-)
Aufwind

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