In theorie zou je dit kunnen doen:
- Zoek de unicode-bereiken waarvoor u wilt testen.
- Coder handmatig het begin en einde in UTF-8.
- Gebruik de eerste byte van elk van de gecodeerde begin- en eindpunten als een bereik voor een REGEXP.
Ik geloof dat het CJK-bereik ver genoeg verwijderd is van zaken als het eurosymbool, zodat er weinig of geen valse positieven en valse negatieven zouden zijn.
Bewerken: We hebben de theorie nu in de praktijk gebracht!
Stap 1: Kies het tekenbereik. Ik stel voor \u3000-\u9fff; gemakkelijk te testen en zou ons bijna perfecte resultaten moeten geven.
Stap 2: Coderen in bytes. (Wikipedia utf-8-pagina)
Voor ons gekozen bereik zijn de utf-8-gecodeerde waarden altijd 3 bytes, waarvan de eerste 1110xxxx is, waarbij xxxx de meest significante vier bits van de unicode-waarde is.
We willen dus bytes bewerken in het bereik 11100011 tot 11101001, of 0xe3 tot 0xe9.
Stap 3: Maak onze regexp met behulp van de zeer handige (en zojuist door mij ontdekte) UNHEX-functie.
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Heb het net uitgeprobeerd. Werkt perfect. :)