SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
ще преброи броя на записите с китайски знаци в колона col
.
Проблеми:
- Не съм сигурен кои диапазони от шестнадесетичен символ представляват китайски.
- Тестът може включват корейски и японски. („CJK“)
- В MySQL 4-байтовите китайски знаци се нуждаят от
utf8mb4
вместоutf8
.
Разработка
Предполагам, че колоната в таблицата е CHARACTER SET utf8
. При utf8 кодиране китайските знаци започват с байт между шестнадесетичен E2 и E9, или EF, или F0. Тези, които започват с шестнадесетичен E, ще бъдат дълги 3 байта, но не проверявам дължината; F0 ще бъдат 4 байта.
Редовният израз започва с ^(..)*
, което означава "от началото на низа (^
), намерете 0 или повече (*
) 2-знака (..
) стойности. След това трябва да бъде или E
-нещо или F0A
. След това всичко може да се случи. E-нещо е по-точно E
последвано от някое от 2,3,4,5,6,7,8,9 или F.
Избрано на случаен принцип, виждам, че 草
кодира като 3 шестнадесетични байта E88D89
и 𠜎
кодира като 4 шестнадесетични байта F0A09C8E
.
Не знам по-добър начин да проверя низ за конкретен език.
Както открихте, REGEXP може да бъде доста бавен.
Това редовно изражение може да бъде прекомерно убито, тъй като някои некитайски знаци могат да бъдат уловени.