سؤال

هل هناك طريقة لتحديد حرفية حرف 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.

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