كيف يمكنني العثور على أحرف غير ASCII في الخلية؟

StackOverflow https://stackoverflow.com/questions/401771

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أعمل مع قاعدة بيانات MySQL يحتوي على بعض البيانات التي تم استيرادها من إكسل . يحتوي على البيانات عدم ASCII حرفا (شرطات م، الخ)، وكذلك إرجاع خفية أو يغذي الخط. هل هناك طريقة للعثور على هذه السجلات باستخدام ماي؟

هل كانت مفيدة؟

المحلول

وهذا يعتمد بالضبط ما كنت تعرف باسم "ASCII"، ولكن أود أن أقترح محاولة البديل من استعلام مثل هذا:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';

وهذا الاستعلام سيعود جميع الصفوف حيث يحتوي columnToCheck أية أحرف غير الأبجدية الرقمية. إذا كان لديك الشخصيات الأخرى التي تكون مقبولة، وإضافتها إلى فئة حرف في التعبير العادي. على سبيل المثال، إذا النقطة والفاصلة، والواصلات لا بأس، تغيير الاستعلام إلى:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';

الصفحة الأكثر صلة من وثائق الخلية هو على الارجح <م> 12.5.2 التعبير العادية .

نصائح أخرى

والخلية يوفر إدارة شاملة مجموعة الأحرف التي يمكن أن تساعد مع هذا النوع من المشاكل.

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)

والإرادة وظيفة CONVERT(col USING charset) يتحول الأحرف unconvertable إلى أحرف الاستبدال. ثم، فإن النص المحول وغير محول يكون غير متكافئ.

وانظر هذا لمزيد من المناقشة. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html

ويمكنك استخدام أي اسم مجموعة الأحرف التي ترغب في مكان ASCII. على سبيل المثال، إذا كنت ترغب في معرفة أي الأحرف لن تجعل بشكل صحيح في صفحة الرموز 1257 (ليتوانيا، لاتفيا، استونيا) استخدام CONVERT(columnToCheck USING cp1257)

ويمكنك تحديد ASCII وجميع الشخصيات التي لها قيمة عشرية من 0-127 (0x00 - 0x7F) والعثور على أعمدة مع أحرف غير ASCII باستخدام الاستعلام التالي

SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

وكان هذا الاستعلام أشمل ويمكنني أن تصل.

وربما هذا هو ما كنت تبحث عن:

select * from TABLE where COLUMN regexp '[^ -~]';

ويجب أن إرجاع كافة الصفوف حيث يحتوي عمود أحرف غير ASCII (أو أحرف ASCII غير القابلة للطباعة مثل السطر الجديد).

وحرف واحد في عداد المفقودين من الأمثلة الجميع فوق هو حرف إنهاء (\ 0). هذا غير مرئية لانتاج وحدة الخلية وليس اكتشافها من قبل أي من الاستفسارات المذكورة حتى الآن. الاستعلام للعثور عليه هو ببساطة:

select * from TABLE where COLUMN like '%\0%';

واستنادا إلى الإجابة الصحيحة، ولكن مع الأخذ في الاعتبار أحرف التحكم ASCII كذلك، الحل الذي عملت بالنسبة لي هو هذا:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";

ويفعل الشيء نفسه: البحث عن انتهاكات مجموعة ASCII في عمود، ولكن يتيح لك البحث عن أحرف التحكم أيضا، لأنه يستخدم تدوين ست عشري للحصول على نقاط التعليمات البرمجية. وبما أنه لا توجد مقارنة أو التحويل (على عكس @ الجواب تصنيفه رقم)، وهذا ينبغي أن يكون أسرع بكثير أيضا. (خاصة إذا الخلية لا الإنهاء المبكر على الاستعلام باستخدام التعابير المنطقية، والتي من المؤكد أنه ينبغي.)

وكما أنه يتجنب الحقول التي هي ذات طول صفري العودة. إذا كنت ترغب في نسخة قليلا، أطول قد تؤدي بشكل أفضل، يمكنك استخدام هذا بدلا من ذلك:

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";

وانه يقوم الاختيار منفصل لطول لتجنب النتائج ذات طول صفري، دون النظر لهم لتمرير التعابير المنطقية. اعتمادا على عدد الإدخالات ذات طول صفري لديك، وهذا يمكن أن يكون أسرع بكثير.

لاحظ أنه إذا مجموعة الأحرف الافتراضية الخاصة بك هو شيء غريب حيث 0x00-0xFF لا تعيين لنفس القيم كما ASCII (هناك مثل مجموعة أحرف في وجود في أي مكان؟)، وهذا سيعود إيجابية كاذبة. خلاف ذلك، والتمتع!

وحاول استخدام هذا الاستعلام للبحث عن السجلات الشخصية الخاصة

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'

و @الجواب زنده وكانت الوحيدة التي غطت أعمدة مع مزيج من أسكي وشخصيات غير أسكي، ولكن كان عليه أيضا أن الشيء عرافة مشكلة. أنا استخدم هذا:

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''

في أوراكل يمكننا استخدام أدناه.

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;

على هذا السؤال يمكننا أيضا استخدام هذا الأسلوب:

سؤال من حديقة الحيوان SQL:
البحث عن كافة تفاصيل الجائزة التي فاز بها بيتر غرونبيرغ

والأحرف غير ASCII

والجواب: حدد * من حيث نوبل الفائز like'P٪ GR٪ _٪ بيرغ '؛

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