Unicode (hexadecimal) حرف حرفي في mysql
-
27-09-2019 - |
سؤال
هل هناك طريقة لتحديد حرفية حرف Unicode في MySQL؟
أرغب في استبدال حرف Unicode بشخصية ASCII ، مثل ما يلي:
Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y")
لكنني أستخدم أحرفًا أكثر غموضًا غير متوفرة في معظم الخطوط ، لذلك أريد أن أكون قادرًا على استخدام حرفيات أحرف Unicode ، شيء مثل
Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")
يتم استدعاء بيان SQL هذا من نص PHP - النموذج الأول ليس فقط غير قابل للقراءة ، ولكنه لا يعمل بالفعل!
المحلول 2
شكرًا على اقتراحاتك ، لكنني أعتقد أن المشكلة كانت أكثر في النظام.
هناك الكثير من المستويات التي يجب إلغاؤها ، ولكن بقدر ما أستطيع أن أقول ، (على هذا الخادم على الأقل) الأمر
set names utf8
يجعل العمل UTF-8 يعمل بشكل صحيح ، في حين
set character set utf8
لا.
في بيئتي ، يتم استدعاء هذه من PHP باستخدام PDO ، لأي الفرق الذي قد يحدث.
شكرا على كل حال!
نصائح أخرى
يمكنك تحديد حرفية سداسية عشرية (او حتى الحرفية الثنائية) استخدام 0x
, x''
, ، أو X''
:
select 0xC2A2;
select x'C2A2';
select X'C2A2';
ولكن كن حذرا أن نوع الإرجاع عبارة عن سلسلة ثنائية ، لذلك يعتبر كل بايت حرفًا. يمكنك التحقق من هذا مع char_length
:
select char_length(0xC2A2)
2
إذا أردت UTF-8 الأوتار بدلاً من ذلك ، تحتاج إلى استخدام convert
:
select convert(0xC2A2 using utf8mb4)
ويمكننا أن نرى ذلك C2 A2
يعتبر حرف واحد في UTF-8:
select char_length(convert(0xC2A2 using utf8mb4))
1
أيضًا ، لا داعي للقلق بشأن البايتات غير الصالحة لأن convert
سوف يزيلها تلقائيا:
select char_length(convert(0xC1A2 using utf8mb4))
0
كما يمكن أن نرى ، الإخراج هو 0
لان C1 A2
هو تسلسل بايت UTF-8 غير صالح.
يمكنك استخدام ال hex
و unhex
وظائف ، على سبيل المثال:
update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))
تم تحديد بناء جملة سلسلة MySQL هنا, ، كما ترون ، لا يوجد حكم لتسلسل الهروب الرقمي.
ومع ذلك ، أثناء تضمين SQL في PHP ، يمكنك حساب البايتات الصحيحة في PHP. تأكد من أن البايتات التي تضعها في SQL تتطابق فعليًا مجموعة حرف العميل.
هناك أيضا char
وظيفة سيسمح ذلك بما تريده (توفير أرقام بايت واسم charset) والحصول على char.