تثبيت الترميزات
-
26-09-2019 - |
سؤال
لقد انتهى بي الأمر مع ترميزات الأحرف المسلحة في أحد أعمدة MySQL الخاصة بنا.
عادة لدي
√ © بدلاً من é
√∂ بدلاً من Ö
√ ≠ بدلا من í
وهلم جرا...
متأكد إلى حد ما من أن شخصًا ما هنا سيعرف ما حدث وكيفية إصلاحه.
تحديث:بناءً على إجابة Bobince وبما أن لدي هذه البيانات في ملف قمت بما يلي
#!/user/bin/env python
import codecs
f = codecs.open('./file.csv', 'r', 'utf-8')
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8')
for line in f:
f2.write(line.encode('macroman').decode('utf-8')),
وبعد ذلك
load data infile 'file-fixed.csv'
into table list1
fields terminated by ','
optionally enclosed by '"'
ignore 1 lines;
استيراد البيانات بشكل صحيح.
Update2:المطرقة ، فقط للاكتمال هنا هي التفاصيل المطلوبة ...
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
ال SHOW CREATE TABLE
للجدول الذي أستورده DEFAULT CHARSET=utf8
EDIT3:
في الواقع مع الإعدادات أعلاه load
لم يكن افعل الشيء الصحيح (لم أتمكن نظرت كما لو تم تحميله بشكل صحيح ؛ أفترض بسبب خطأ ، ولكن المطابقة العميل والاتصال والنتائج charsets) ، لذلك قمت بتحديث الإعدادات إلى:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
تم تحميل البيانات مرة أخرى ، ثم حصلت أخيرًا على تحميل البيانات بشكل صحيح (مماثلة للبيانات الموجودة).
المحلول
تم ترميز النص الخاص بك على UTF-8 ثم إعادة ترميزه ، خطأً ، ماك رومان.
لن تتمكن من إصلاح هذا داخل قاعدة البيانات ، لأن MySQL لا يعرف الترميز الروماني MAC. يمكنك كتابة برنامج نصي للسير في كل صف من كل جدول متضرر وإصلاح النص عن طريق عكس دورة الترميز/فك شفرة. بيثون هو احتمال ، ولديه مجموعة جيدة من الترميزات:
>>> print u'é'.encode('macroman').decode('utf-8')
é
>>> print u'ö'.encode('macroman').decode('utf-8')
ö
>>> print u'í'.encode('macroman').decode('utf-8')
í
بدلاً من ذلك ، إذا لم يكن هناك محتوى غير ASCII لا يتأثر بهذه المشكلة ، فيمكنك محاولة استخدام mysqladmin
لتصدير تفريغ SQL ، ثم قم بتحويله مرة واحدة ، إما باستخدام برنامج نصي على النحو الوارد أعلاه ، أو ، إذا كان لديك محرر نصية (من المفترض على MAC) يمكنه القيام بذلك ، وتحميل البرنامج النصي على أنه UTF-8 ثم حفظه كـ MAC روماني. وأخيرا أعد استيراد تفريغ باستخدام mysql < dump.sql
.