SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
列col
に漢字が含まれるレコードの数をカウントします 。
問題:
- 16進数のどの範囲が中国語を表すかわかりません。
- テストは可能性があります 韓国語と日本語を含みます。 ("CJK")
- MySQLでは、4バイトの漢字には
utf8mb4
が必要です。utf8
の代わりに 。
詳細strong>
表の列はCHARACTER SET utf8
であると想定しています。 。 utf8エンコーディングでは、漢字は16進数のE2とE9、またはEF、またはF0の間のバイトで始まります。 16進数のEで始まるものは3バイトの長さになりますが、長さはチェックしていません。 F0のものは4バイトになります。
正規表現は^(..)*
で始まります 、「文字列の先頭から(^
)、0個以上を検索します(*
)2文字(..
)値。その後はE
のいずれかになります -何かまたはF0A
。その後、何でも起こり得ます。 E-何かは、より具体的には、E
その後に2、3、4、5、6、7、8、9、またはFのいずれかが続きます。
ランダムに選んだ草
3つの16進バイトとしてエンコードE88D89
、および𠜎
4つの16進バイトとしてエンコードしますF0A09C8E
。
特定の言語の文字列をチェックするためのより良い方法がわかりません。
お気づきのとおり、REGEXPはかなり遅くなる可能性があります。
この正規表現は、一部の非漢字がキャプチャされる可能性があるという点で、やり過ぎになる可能性があります。