Em teoria, você poderia fazer isso:
- Encontre os intervalos unicode que você deseja testar.
- Codifique manualmente o início e o fim em UTF-8.
- Use o primeiro byte de cada início e fim codificados como um intervalo para um REGEXP.
Eu acredito que a faixa CJK está longe o suficiente de coisas como o símbolo do euro que os falsos positivos e falsos negativos seriam poucos ou nenhum.
Editar: Agora colocamos a teoria em prática!
Etapa 1: Escolha o intervalo de caracteres. Sugiro \u3000-\u9fff; fácil de testar e deve nos dar resultados quase perfeitos.
Etapa 2: Codifique em bytes. (página da Wikipédia utf-8)
Para o intervalo escolhido, os valores codificados em utf-8 sempre serão 3 bytes, sendo o primeiro 1110xxxx, onde xxxx são os quatro bits mais significativos do valor unicode.
Assim, queremos mach bytes no intervalo de 11100011 a 11101001, ou 0xe3 a 0xe9.
Etapa 3: Faça nosso regexp usando a função UNHEX muito útil (e só agora descoberta por mim).
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Acabei de experimentar. Funciona como um encanto. :)