Làm cách nào để thay đổi bộ ký tự mặc định của bảng MySQL?


96

Có một MySQL tablecó định nghĩa này được lấy từ 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  

Tôi muốn thay đổi default charsetbảng này từ latin1thành utf8. Làm thế nào để làm điều đó ?


3
Tên chính xác cho "UTF8" trong MySQL là "utf8mb4", bộ ký tự "utf8" bị hỏng, nó chỉ hỗ trợ tối đa 3 ký tự byte. Xem hướng dẫn mysql để biết chi tiết, hoặc google "mysql" và "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Câu trả lời:


202

Nếu bạn muốn thay đổi bảng default character setvà tất cả các cột ký tự thành một bộ ký tự mới, hãy sử dụng một câu lệnh như sau:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Vì vậy, truy vấn sẽ là:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
Ngược lại, nếu bạn chỉ sử dụng ALTER TABLE tbl CHARACTER SET utf8cú pháp theo đề xuất của người khác, bạn sẽ chỉ thay đổi mã hóa mặc định cho bảng; các cột hiện tại sẽ không được chuyển đổi như chúng sẽ làm nếu bạn sử dụng câu trả lời này.
eaj

7
Nếu bạn muốn áp dụng sự thay đổi này cho tất cả các bảng không được mã hóa trong ut8 trong một cơ sở dữ liệu, bạn có thể sử dụng truy vấn này và thực hiện các truy vấn kết quả: 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
điều này không thay đổi bộ ký tự mặc định . để thay đổi mặc định làm như eak đã nóiALTER TABLE tbl CHARACTER SET utf8
Kế toán م

7
Tôi muốn nói thêm rằng thông thường bạn không muốn sử dụng utf8 mà thay vào đó utf8mb4 để có được những gì bạn có thể mong đợi utf8. Để giải thích: trong MySQL utf8 thực sự chỉ là một tập con của utf8, tốt hơn sẽ được đặt tên là utf8mb3. Nó chỉ có thể mã hóa tối đa 3 byte ký tự utf8 thay vì tối đa 4 byte được chỉ định. Điều này có nghĩa là nhiều biểu tượng cảm xúc sẽ không thể mã hóa được và sẽ bị mất nếu bạn cố gắng viết chúng vào DB. Xem ví dụ. medium.com/@adamhooper/… để biết chi tiết.
dwt

6
cho multibyte bạn có thể sử dụngALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

18

Thay đổi bộ ký tự mặc định của bảng:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Để thay đổi bộ ký tự cột chuỗi hãy thực hiện truy vấn này:

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

10
Bạn không bao giờ nên sử dụng utf8_general_ci: đơn giản là nó không hoạt động. Đó là sự quay lại những ngày xưa tồi tệ của tính năng ASCII từ năm mươi năm trước. Không thể thực hiện đối sánh không phân biệt chữ hoa chữ thường Unicode mà không có bản đồ chữ cái gấp từ UCD. Ví dụ, “Σίσυφος” có ba dấu hiệu khác nhau trong đó; hoặc cách viết thường của “TSCHüẞ” là “tschüβ”, nhưng chữ hoa của “tschüβ” là “TSCHÜSS”. Bạn có thể đúng, hoặc bạn có thể nhanh. Do đó, bạn phải sử dụng utf8_unicode_ci, bởi vì nếu bạn không quan tâm đến tính đúng đắn, thì việc làm cho nó nhanh vô cùng là điều tầm thường.
Yohanes AI

1
Bộ ký tự MySQL UTF8 bị hỏng, bạn cần sử dụng utf8mb4!
Samuel Åslund 17/12/18

5

Lệnh ALTER TABLEMySQL sẽ thực hiện thủ thuật. Lệnh sau sẽ thay đổi bộ ký tự mặc định của bảng của bạn và bộ ký tự của tất cả các cột của nó thành UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Lệnh này sẽ chuyển đổi tất cả các cột giống văn bản trong bảng sang bộ ký tự mới. Các bộ ký tự sử dụng số lượng dữ liệu khác nhau cho mỗi ký tự, vì vậy MySQL sẽ chuyển đổi kiểu của một số cột để đảm bảo có đủ chỗ để phù hợp với cùng một số ký tự như kiểu cột cũ.

Tôi khuyên bạn nên đọc tài liệu MySQL ALTER TABLE trước khi sửa đổi bất kỳ dữ liệu trực tiếp nào.


1
Có, nó thực hiện thủ thuật, nhưng có một điều khác với chuyển đổi thành cách: nó không thể tự động xóa tùy chọn bộ ký tự cũ khỏi các cột.
tech_me

3

Nếu ai đó đang tìm kiếm một giải pháp hoàn chỉnh để thay đổi bộ ký tự mặc định cho tất cả các bảng cơ sở dữ liệu và chuyển đổi dữ liệu, thì đây có thể là một:

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 ;

Bạn có thể đặt mã này bên trong tệp, ví dụ chg_char_set.sqlvà thực thi nó bằng cách gọi nó từ MySQL terminal:

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

Sau đó gọi thủ tục xác định với các tham số đầu vào mong muốn, ví dụ:

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

Khi bạn đã kiểm tra kết quả, bạn có thể bỏ các quy trình đã lưu trữ đó:

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

Có một điều kiện bị thiếu khiến chúng tôi cũng phải chọn các chế độ xem. Đó là WHERE table_schema = DATABASE (); => WHERE table_schema = DATABASE () AND table_type = 'BASE TABLE'; Nhưng cảm ơn!! Đây là những gì tôi cần!
nguyenhoai890

2

Bạn có thể thay đổi giá trị mặc định bằng một ký tự alter table set default charsetnhưng điều đó sẽ không thay đổi bộ ký tự của các cột hiện có. Để thay đổi điều đó, bạn cần sử dụng a alter table modify column.

Việc thay đổi bộ ký tự của một cột chỉ có nghĩa là cột đó sẽ có thể lưu trữ nhiều ký tự hơn. Ứng dụng của bạn nói chuyện với db bằng ứng dụng khách mysql nên bạn cũng có thể cần phải thay đổi mã hóa ứng dụng.


Tôi có thể nếu nó không được cho bàn phím hạn chế trên iPod touch :-)
Joni

iPod Touch / iPhone cũng phảimột số nhược điểm. :-P Không bao giờ nhận ra rằng họ đang mất tích cho đến khi bạn đề cập đến nó. ;-)
Aufwind

Nhấn và giữ nút cho ký tự trích dẫn để xem ký tự trích dẫn.
Chloe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.