Về lý thuyết, bạn có thể làm điều này:
- Tìm các dải unicode mà bạn muốn kiểm tra.
- Mã hóa phần đầu và phần cuối thành UTF-8 theo cách thủ công.
- Sử dụng byte đầu tiên của mỗi phần bắt đầu và kết thúc được mã hóa làm dải ô cho REGEXP.
Tôi tin rằng phạm vi CJK đủ xa so với những thứ như biểu tượng đồng euro, vì vậy các trường hợp dương tính giả và âm tính giả sẽ rất ít hoặc không có.
Chỉnh sửa: Bây giờ chúng tôi đã đưa lý thuyết vào thực hành!
Bước 1: Chọn phạm vi ký tự. Tôi đề nghị \ u3000- \ u9fff; dễ kiểm tra và sẽ cho chúng tôi kết quả gần như hoàn hảo.
Bước 2: Mã hóa thành từng byte. (trang Wikipedia utf-8)
Đối với phạm vi đã chọn của chúng tôi, các giá trị được mã hóa utf-8 sẽ luôn là 3 byte, giá trị đầu tiên là 1110xxxx, trong đó xxxx là bốn bit quan trọng nhất của giá trị unicode.
Do đó, chúng tôi muốn mach byte trong phạm vi 11100011 đến 11101001 hoặc 0xe3 đến 0xe9.
Bước 3: Tạo regexp của chúng tôi bằng cách sử dụng hàm UNHEX rất tiện dụng (và vừa được tôi phát hiện).
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
Chỉ cần thử nó ra. Hoạt động như một sự quyến rũ. :)