SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
sẽ đếm số lượng bản ghi có các ký tự Trung Quốc trong cột col
.
Vấn đề:
- Tôi không chắc những phạm vi hex đại diện cho tiếng Trung Quốc.
- Bài kiểm tra có thể bao gồm tiếng Hàn và tiếng Nhật. ("CJK")
- Trong MySQL, các ký tự tiếng Trung 4 byte cần
utf8mb4
thay vìutf8
.
Công phu
Tôi giả sử cột trong bảng là CHARACTER SET utf8
. Trong mã hóa utf8, các ký tự Trung Quốc bắt đầu bằng một byte giữa hex E2 và E9, hoặc EF, hoặc F0. Những cái bắt đầu bằng hex E sẽ dài 3 byte, nhưng tôi không kiểm tra độ dài; những cái F0 sẽ là 4 byte.
Regexp bắt đầu bằng ^(..)*
, nghĩa là "từ đầu chuỗi (^
), định vị 0 hoặc nhiều hơn (*
) 2 ký tự (..
) các giá trị. Sau đó phải là E
-một cái gì đó hoặc F0A
. Sau đó, bất cứ điều gì có thể xảy ra. Đặc biệt hơn, E-something là E
tiếp theo là bất kỳ trong số 2,3,4,5,6,7,8,9 hoặc F.
Được chọn ngẫu nhiên, tôi thấy rằng 草
mã hóa dưới dạng 3 byte hex E88D89
và 𠜎
mã hóa dưới dạng 4 byte hex F0A09C8E
.
Tôi không biết cách tốt hơn để kiểm tra một chuỗi cho một ngôn ngữ cụ thể.
Như bạn đã thấy, REGEXP có thể khá chậm.
Bản regexp này có thể bị giết quá mức, trong đó một số ký tự không phải tiếng Trung có thể bị bắt.