我需要在列表中计算中文的数量。例如,如果"北京实业"发生,这是中文的四个字符,但我只计算一次,因为它出现在列中。
有没有具体的代码来解决这个问题?
答案 0 :(得分:2)
SELECT COUNT(*)
FROM tbl
WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'
将计算col
列中包含中文字符的记录数。
问题:
utf8mb4
而不是utf8
。<强>精化强>
我假设表中的列是CHARACTER SET utf8
。在utf8编码中,中文字符以十六进制E2和E9之间或EF或F0之间的字节开头。以十六进制E开头的那些将是3个字节长,但我没有检查长度; F0将为4个字节。
正则表达式以^(..)*
开头,意思是“从字符串的开头(^
),找到0或更多(*
)2个字符(..
)在此之后应该是E
- 某事或F0A
。之后,任何事情都可能发生。更具体地说,E-something是E
后跟2,3中的任何一个, 4,5,6,7,8,9或F。
随机选择,我看到草
编码为3个十六进制字节E88D89
,而编码为4个十六进制字节
F0A09C8E
。
我不知道检查特定语言字符串的更好方法。
如您所见,REGEXP可能相当慢。
这个正则表达式可能会过度杀戮,因为可能会捕获一些非中文字符。