如何在MySQL中检测汉字?

She*_*don 2 mysql utf-8 mysql-workbench chinese-locale

我需要计算一个列列表中的中文数量。例如,如果“????” 发生,这是中文的四个字符,但我只计算一次,因为它出现在列中。

有没有具体的代码来解决这个问题?

Ric*_*mes 5

SELECT COUNT(*)
    FROM tbl
    WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
Run Code Online (Sandbox Code Playgroud)

将计算列中包含汉字的记录数col

问题:

  • 我不确定什么范围的十六进制代表中文。
  • 测试可能包括韩语和日语。(“中日韩”)
  • 在 MySQL 中 4 字节汉字需要utf8mb4代替utf8.

细化

我假设表中的列是CHARACTER SET utf8. 在utf8编码中,汉字以十六进制E2和E9之间的一个字节开始,或者EF,或者F0。那些以十六进制 E 开头的将是 3 个字节长,但我没有检查长度;F0 的将是 4 个字节。

正则表达式开始用^(..)*,意思是“从字符串的开始(^),找到0个或多个(*)2字符(..)值,之后应该是E-something或F0A。在此之后,可能会发生什么。在E-东西,更具体地说,E后跟 2、3、4、5、6、7、8、9 或 F 中的任何一个。

随机挑选,我看到?编码为 3 hex bytes E88D89编码为 4 hex bytes F0A09C8E

我不知道检查特定语言的字符串的更好方法。

正如您发现的,REGEXP 可能相当慢。

这个正则表达式可能会被过度使用,因为可能会捕获一些非中文字符。