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

MySQL LIKE com json_extract


O agrupamento padrão do MySQL é latin1_swedish_ci antes de 8.0 e utf8mb4_0900_ai_ci desde 8.0 . Portanto, as comparações de strings não binárias não diferenciam maiúsculas de minúsculas por padrão em colunas comuns.

No entanto, conforme mencionado no Manual do MySQL para o tipo JSON

Portanto, seu valor JSON está em utf8mb4_bin ordenação e você precisa aplicar uma ordenação que não diferencia maiúsculas de minúsculas a qualquer operando para tornar a comparação insensível a maiúsculas e minúsculas.

Por exemplo.
WHERE username COLLATE XXX LIKE '...'

onde XXX deve ser um agrupamento utf8mb4 (como o utf8mb4_general_ci você mencionou.).

Ou
WHERE username LIKE '...' COLLATE YYY

onde YYY deve ser um agrupamento que corresponda ao conjunto de caracteres de sua conexão.

Para comparação de igualdade, você deve retire o valor JSON com JSON_UNQUOTE() ou o operador de extração sem aspas ->>

Por exemplo.
JSON_UNQUOTE(JSON_EXTRACT(payload, '$.username'))

Ou simplesmente
payload->>'$.username'

O tipo e as funções JSON funcionam de maneira diferente dos tipos de dados comuns. Parece que você é novo nisso. Portanto, sugiro que você leia o manual cuidadosamente antes de colocá-lo em um ambiente de produção.