sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo detectar caracteres chinos en MySQL?

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

contará el número de registros con caracteres chinos en la columna col .

Problemas:

  • No estoy seguro de qué rangos de hexadecimales representan el chino.
  • La prueba puede incluyen coreano y japonés. ("CJK")
  • En MySQL, los caracteres chinos de 4 bytes necesitan utf8mb4 en lugar de utf8 .

Elaboración

Supongo que la columna de la tabla es CHARACTER SET utf8 . En la codificación utf8, los caracteres chinos comienzan con un byte entre E2 hexadecimal y E9, EF o F0. Los que comienzan con E hexadecimal tendrán una longitud de 3 bytes, pero no estoy comprobando la longitud; los F0 serán de 4 bytes.

La expresión regular comienza con ^(..)* , que significa "desde el comienzo de la cadena (^ ), busque 0 o más (* ) 2 caracteres (.. ) valores. Después de eso debería ser E -algo o F0A . Después de eso, cualquier cosa puede ocurrir. El E-algo es, más concretamente, E seguido de cualquiera de 2,3,4,5,6,7,8,9 o F.

Elegido al azar, veo que codifica como los 3 bytes hexadecimales E88D89 , y 𠜎 codifica como los 4 bytes hexadecimales F0A09C8E .

No conozco una mejor manera de verificar una cadena para un idioma específico.

Como descubrió, REGEXP puede ser bastante lento.

Esta expresión regular podría ser excesiva, ya que se pueden capturar algunos caracteres no chinos.