Le classement par défaut de MySQL est latin1_swedish_ci
avant 8.0
et utf8mb4_0900_ai_ci
depuis 8.0
. Ainsi, les comparaisons de chaînes non binaires sont insensibles à la casse par défaut dans les colonnes ordinaires.
Cependant, comme mentionné dans le Manuel MySQL pour le type JSON
Par conséquent, votre valeur JSON est dans utf8mb4_bin
classement et vous devez appliquer un classement insensible à la casse à l'un ou l'autre des opérandes pour rendre la comparaison insensible à la casse.
Par exemple
WHERE username COLLATE XXX LIKE '...'
où XXX
doit être un classement utf8mb4 (comme le utf8mb4_general_ci
vous avez mentionné.).
Ou
WHERE username LIKE '...' COLLATE YYY
où YYY
doit être un classement qui correspond au jeu de caractères de votre connexion.
Pour une comparaison d'égalité, vous devez enlevez la valeur JSON
avec JSON_UNQUOTE()
ou l'opérateur d'extraction sans guillemets ->>
Par exemple
JSON_UNQUOTE(JSON_EXTRACT(payload, '$.username'))
Ou tout simplement
payload->>'$.username'
Le type et les fonctions JSON fonctionnent de manière différente des types de données ordinaires. Il semble que vous soyez novice. Je vous suggère donc de lire attentivement le manuel avant de le placer dans un environnement de production.