2010-11-01 23 views
16

Bazı mysql tablolarını latin1'den utf8'e dönüştürmeye çalışıyorum. Çoğunlukla işe yarayan aşağıdaki komutu kullanıyorum.Mysql tablolarını latin1'den utf8'ye dönüştürme

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Ancak, bir tabloda yinelenen anahtar girişi hakkında bir hata alıyorum. Bu bir "isim" alanında benzersiz bir dizin neden olur. Utf8 'e dönüştürülürken, herhangi bir "özel" karakterin, düz ingilizce eşdeğerleri olarak dizine eklendiği görülmektedir. Örneğin, zaten bir "Dru" ad alanı değeri olan bir kayıt var. Utf8'e dönüştürülürken, "Drü" ile bir kayıt bir kopya olarak kabul edilir. "Patrick" ve "Påtrìçk" ile aynı.

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 

cevap

20

'Drü' ve 'Dru' dizelerinin aynı olarak değerlendirmesinin nedeni, utf8_general_ci harmanlamada "aynı" olarak sayılır. Bir karakter kümesi için harmanlama'un amacı dizgiler aynı olduğunda, diğerinden önce sıralandığında, vb. Bir dizi kural sağlamaktır.

Farklı bir karşılaştırma kuralları kümesi istiyorsanız, farklı bir harmanlama seçmeniz gerekir. karakter kümesinin kullanılabilir harmanlarını SHOW COLLATION LIKE 'utf8%' göndererek görebilirsiniz. Genellikle belirli bir dilde yazılmış metin için hazırlanmış bir dizi harmanlama vardır; Ayrıca tüm dizeleri ikili dizgilerle karşılaştıran utf8_bin harmanlaması vardır (yani, 0 ve 1'lerin dizileri olarak karşılaştırır).

3

UTF8_GENERAL_CI vurgu duyarsız: Burada

sorunu yeniden oluşturmak için nasıl.

UTF8_BIN veya dile özgü bir harmanlama kullanın.

İlgili konular