سؤال

أحاول تحويل بعض جداول MySQL من LATIN1 إلى UTF8. أنا أستخدم الأمر التالي ، والذي يبدو أنه يعمل في الغالب.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ومع ذلك ، في جدول واحد أحصل على خطأ حول إدخال مفتاح مكرر. يحدث هذا بسبب فهرس فريد في حقل "الاسم". يبدو عند التحويل إلى UTF8 ، يتم فهرسة أي شخصيات "خاصة" على أنها مكافئة في اللغة الإنجليزية المستقيمة. على سبيل المثال ، يوجد بالفعل سجل ذو قيمة حقل اسم "Dru". عند التحويل إلى UTF8 ، يعتبر سجل مع "Drü" مكررًا. الشيء نفسه مع "باتريك" و "Påtrìçk".

إليك كيفية إعادة إنتاج القضية:

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
هل كانت مفيدة؟

المحلول

سبب الأوتار 'Drü' و 'Dru' تقييم نفس هو أنه في utf8_general_ci ترتيب ، فهي تعتبر "نفس". الغرض من أ التجميع بالنسبة لمجموعة الأحرف ، فإن توفير مجموعة من القواعد التي تكون متماثلة عندما تكون الأوتار هي نفسها ، عندما تكون واحدة قبل الآخر ، وما إلى ذلك.

إذا كنت تريد مجموعة مختلفة من قواعد المقارنة ، فأنت بحاجة إلى اختيار ترتيب مختلف. يمكنك رؤية المجموعات المتاحة ل utf8 تم تعيين الشخصية عن طريق الإصدار SHOW COLLATION LIKE 'utf8%'. هناك مجموعة من المجموعات المخصصة للنص الموجود في الغالب بلغة محددة ؛ هناك أيضا utf8_bin تصادم الذي يقارن جميع الأوتار كسلاسل ثنائية (أي يقارنها كتسلسلات من 0S و 1S).

نصائح أخرى

UTF8_GENERAL_CI هو لهجة غير حساسة.

يستخدم UTF8_BIN أو ترتيب خاص باللغة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top