SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
bude počítat počet záznamů s čínskými znaky ve sloupci col
.
Problémy:
- Nejsem si jistý, jaké rozsahy hex představují čínštinu.
- Test může zahrnují korejštinu a japonštinu. ("CJK")
- V MySQL 4bajtové čínské znaky potřebují
utf8mb4
místoutf8
.
Vypracování
Předpokládám, že sloupec v tabulce je CHARACTER SET utf8
. V kódování utf8 začínají čínské znaky bajtem mezi hex E2 a E9 nebo EF nebo F0. Ty začínající hex E budou mít délku 3 bajty, ale nekontroluji délku; ty F0 budou mít 4 bajty.
Regulární výraz začíná ^(..)*
, což znamená "od začátku řetězce (^
), vyhledejte 0 nebo více (*
) 2 znaky (..
) hodnoty. Poté by mělo být buď E
-něco nebo F0A
. Poté se může stát cokoliv. E-něco je konkrétněji E
následuje kterékoli z 2,3,4,5,6,7,8,9 nebo F.
Náhodně vybráno, vidím, že 草
zakóduje jako 3 hex bajty E88D89
a 𠜎
zakóduje jako 4 hexadecimální bajty F0A09C8E
.
Neznám lepší způsob, jak zkontrolovat řetězec pro konkrétní jazyk.
Jak jste zjistili, REGEXP může být poměrně pomalý.
Tento regulární výraz může být přehnaný, protože mohou být zachyceny některé nečínské znaky.