SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
conterà il numero di record con caratteri cinesi nella colonna col
.
Problemi:
- Non sono sicuro di quali intervalli di esadecimali rappresentino il cinese.
- Il test può includere coreano e giapponese. ("CJK")
- In MySQL i caratteri cinesi a 4 byte richiedono
utf8mb4
invece diutf8
.
Elaborazione
Presumo che la colonna nella tabella sia CHARACTER SET utf8
. Nella codifica utf8, i caratteri cinesi iniziano con un byte compreso tra esadecimale E2 ed E9, o EF o F0. Quelli che iniziano con esadecimale E saranno lunghi 3 byte, ma non sto controllando la lunghezza; quelli F0 saranno 4 byte.
L'espressione regolare inizia con ^(..)*
, che significa "dall'inizio della stringa (^
), individua 0 o più (*
) 2 caratteri (..
) i valori. Dopo dovrebbe essere E
-qualcosa o F0A
. Dopodiché, può succedere di tutto. L'E-qualcosa è, più specificamente, E
seguito da uno qualsiasi dei 2,3,4,5,6,7,8,9 o F.
Scelto a caso, vedo quel 草
codifica come 3 byte esadecimali E88D89
e 𠜎
codifica come 4 byte esadecimali F0A09C8E
.
Non conosco un modo migliore per controllare una stringa per una lingua specifica.
Come hai scoperto, il REGEXP può essere piuttosto lento.
Questa espressione regolare potrebbe essere eccessiva, in quanto alcuni caratteri non cinesi potrebbero essere catturati.