I teorien kunne du gøre dette:
- Find de unicode-områder, du vil teste for.
- Kod starten og slutningen manuelt til UTF-8.
- Brug den første byte af hver af de kodede start og slut som et interval for en REGEXP.
Jeg mener, at CJK-intervallet er langt nok væk fra ting som euro-symbolet til, at de falske positive og falske negativer ville være få eller ingen.
Rediger: Vi har nu omsat teori i praksis!
Trin 1: Vælg tegnintervallet. Jeg foreslår \u3000-\u9fff; let at teste for og burde give os næsten perfekte resultater.
Trin 2: Indkode til bytes. (Wikipedia utf-8 side)
For vores valgte område vil utf-8-kodede værdier altid være 3 bytes, hvoraf den første er 1110xxxx, hvor xxxx er de vigtigste fire bits af unicode-værdien.
Derfor ønsker vi at mache bytes i området 11100011 til 11101001 eller 0xe3 til 0xe9.
Trin 3: Lav vores regexp ved hjælp af den meget praktiske (og lige nu opdaget af mig) UNHEX-funktion.
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Har lige prøvet det. Virker som en charme. :)