SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
telt het aantal records met Chinese karakters in kolom col
.
Problemen:
- Ik weet niet zeker welke reeksen van hex Chinees vertegenwoordigen.
- De test mag inclusief Koreaans en Japans. ("CJK")
- In MySQL hebben 4-byte Chinese karakters
utf8mb4
nodig in plaats vanutf8
.
Uitwerking
Ik neem aan dat de kolom in de tabel CHARACTER SET utf8
is . In utf8-codering beginnen Chinese karakters met een byte tussen hex E2 en E9, of EF, of F0. Degenen die beginnen met hex E zullen 3 bytes lang zijn, maar ik controleer de lengte niet; de F0 zijn 4 bytes.
De regexp begint met ^(..)*
, wat betekent "vanaf het begin van de tekenreeks (^
), zoek 0 of meer (*
) 2 tekens (..
) waarden. Daarna moet ofwel E
. zijn -iets of F0A
. Daarna kan er van alles gebeuren. Het E-iets is, meer specifiek, E
gevolgd door 2,3,4,5,6,7,8,9 of F.
Willekeurig gekozen, ik zie dat 草
codeert als de 3 hex bytes E88D89
, en 𠜎
codeert als de 4 hex bytes F0A09C8E
.
Ik ken geen betere manier om een string voor een specifieke taal te controleren.
Zoals je hebt ontdekt, kan de REGEXP nogal traag zijn.
Deze regexp kan overkill zijn, in die zin dat sommige niet-Chinese karakters kunnen worden vastgelegd.