Теоретически вы можете сделать это:
- Найдите диапазоны Юникода, для которых вы хотите проверить.
- Вручную закодируйте начало и конец в UTF-8.
- Используйте первый байт каждого закодированного начала и конца в качестве диапазона для REGEXP.
Я считаю, что диапазон CJK достаточно далек от таких вещей, как символ евро, что ложных срабатываний и ложных отрицаний будет мало или их нет.
Редактировать: Теперь мы применили теорию на практике!
Шаг 1: Выберите диапазон символов. Я предлагаю \ u3000- \ u9fff; легко проверять и давать почти идеальные результаты.
Шаг 2: Кодировать в байты. (Wikipedia utf-8 page)
Для нашего выбранного диапазона кодированные значения utf-8 всегда будут составлять 3 байта, первое из которых - 1110xxxx, где xxxx - старшие четыре бита значения Юникода.
Таким образом, мы хотим обработать байты в диапазоне от 11100011 до 11101001 или от 0xe3 до 0xe9.
Шаг 3: Сделайте наше регулярное выражение, используя очень удобную (и только что обнаруженную мной) функцию UNHEX.
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Только что попробовал. Работает как шарм. :)