Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como detectar caracteres chineses no MySQL?

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

irá contar o número de registros com caracteres chineses na coluna col .

Problemas:
  • Não tenho certeza de quais intervalos hexadecimais representam o chinês.
  • O teste pode incluem coreano e japonês. ("CJK")
  • No MySQL, os caracteres chineses de 4 bytes precisam de utf8mb4 em vez de utf8 .

Elaboração

Estou assumindo que a coluna na tabela é CHARACTER SET utf8 . Na codificação utf8, os caracteres chineses começam com um byte entre hexadecimal E2 e E9, ou EF ou F0. Aqueles que começam com hex E terão 3 bytes de comprimento, mas não estou verificando o comprimento; os F0 serão de 4 bytes.

O regexp começa com ^(..)* , significando "desde o início da string (^ ), localize 0 ou mais (* ) 2 caracteres (.. ) valores. Depois disso deve ser E -algo ou F0A . Depois disso, tudo pode acontecer. O E-algo é, mais especificamente, E seguido por qualquer um de 2,3,4,5,6,7,8,9 ou F.

Selecionado aleatoriamente, vejo que codifica como os 3 bytes hexadecimais E88D89 e 𠜎 codifica como os 4 bytes hexadecimais F0A09C8E .

Não conheço uma maneira melhor de verificar uma string para um idioma específico.

Como você descobriu, o REGEXP pode ser bastante lento.

Esse regexp pode ser exagerado, pois alguns caracteres não chineses podem ser capturados.