2010-11-01 25 views
16

Tôi đang cố chuyển đổi một số bảng mysql từ latin1 sang utf8. Tôi đang sử dụng lệnh sau, mà dường như chủ yếu là làm việc.Chuyển đổi bảng mysql từ latin1 sang utf8

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Tuy nhiên, trên một bảng tôi gặp lỗi về mục nhập khóa trùng lặp. Điều này là do một chỉ mục duy nhất trên trường "tên". Có vẻ như khi chuyển sang utf8, bất kỳ ký tự "đặc biệt" nào được lập chỉ mục dưới dạng tương đương bằng tiếng Anh thẳng. Ví dụ, đã có một bản ghi với giá trị trường tên là "Dru". Khi chuyển đổi sang utf8, bản ghi có "Drü" được coi là trùng lặp. Tương tự với "Patrick" và "Påtrìçk".

Dưới đây là làm thế nào để tạo lại vấn đề:

CREATE TABLE `example` ( `name` char(20) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (`name`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO example (name) VALUES ('Drü'),('Dru'),('Patrick'),('Påtrìçk'); 

ALTER TABLE example convert to character set utf8 collate utf8_general_ci; 
ERROR 1062 (23000): Duplicate entry 'Dru' for key 1 

Trả lời

20

Lý do tại sao các chuỗi 'Drü''Dru' đánh giá giống nhau là trong collation utf8_general_ci, chúng được tính là "giống nhau". Mục đích của một collation cho một bộ ký tự là cung cấp một tập hợp các quy tắc như khi các chuỗi là như nhau, khi một loại trước khác, và như vậy.

Nếu bạn muốn có một bộ quy tắc so sánh khác nhau, bạn cần phải chọn một đối chiếu khác nhau. Bạn có thể xem các collations có sẵn cho bộ ký tự utf8 bằng cách phát hành SHOW COLLATION LIKE 'utf8%'. Có một loạt các collations dành cho văn bản mà chủ yếu là trong một ngôn ngữ cụ thể; đó cũng là collation utf8_bin so sánh tất cả các chuỗi như chuỗi nhị phân (tức là so sánh chúng như chuỗi 0 và 1).

3

UTF8_GENERAL_CI là giọng vô cảm.

Sử dụng UTF8_BIN hoặc đối chiếu theo ngôn ngữ cụ thể.