Teoretycznie możesz to zrobić:
- Znajdź zakresy Unicode, które chcesz przetestować.
- Ręcznie zakoduj początek i koniec w UTF-8.
- Użyj pierwszego bajtu każdego zakodowanego początku i końca jako zakresu dla REGEXP.
Uważam, że zakres CJK jest wystarczająco odległy od takich rzeczy jak symbol euro, że liczba fałszywych trafień i fałszywie ujemnych wyników będzie niewielka lub żadna.
Edytuj: Teraz zastosowaliśmy teorię w praktyce!
Krok 1: Wybierz zakres znaków. Proponuję \u3000-\u9fff; łatwe do przetestowania i powinno dać nam niemal doskonałe wyniki.
Krok 2: Zakoduj w bajtach. (strona Wikipedii utf-8)
Dla wybranego przez nas zakresu wartości zakodowane w UTF-8 zawsze będą miały 3 bajty, z których pierwszy to 1110xxxx, gdzie xxxx to najbardziej znaczące cztery bity wartości Unicode.
Dlatego chcemy dopasować bajty w zakresie od 11100011 do 11101001 lub od 0xe3 do 0xe9.
Krok 3: Utwórz nasze wyrażenie regularne za pomocą bardzo przydatnej (i właśnie odkrytej przeze mnie) funkcji UNHEX.
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Po prostu to wypróbowałem. Działa jak marzenie. :)