MySQL 赞 json_extract

MySQL LIKE with json_extract

我有一个 MySQL 查询,我在其中按 json 字段进行过滤:

SELECT id, username 
FROM   (SELECT id, 
               Json_extract(payload, '$.username') AS username 
        FROM   table1) AS tmp 
WHERE  username = 'userName1'; 

它 returns 1 行,看起来像:

1, "userName1" 看到没有在子句中的引用了吗?

我需要的是使 WHERE 子句不区分大小写。 但是当我这样做时

WHERE username LIKE 'userName1';

它 returns 0 行。我不明白为什么它会这样工作,= 子句虽然没有那些双引号但仍然有效。

如果我这样做

WHERE username LIKE '%userName1%'; 现在也是 returns 行,因为 %% 考虑了引号:

1, "userName1"

但是当我这样做时

WHERE username LIKE '%username1%'; 它 returns 0 行,所以不像通常的 MySQL LIKE 它区分大小写。

我做错了什么以及如何以不区分大小写的方式过滤 json 负载? 编辑========================================= 猜测这里应该使用COLLATE,但到目前为止我还不明白如何让它起作用。

好的,我可以通过在 LIKE 子句后添加 COLLATE utf8mb4_general_ci 来解决大小写不敏感问题。

所以这里的重点是找到一个工作排序规则,反过来可以通过研究你使用的数据库找到它。

MySQL 的默认排序规则是 latin1_swedish_ci before 8.0 and utf8mb4_0900_ai_ci since 8.0。因此 non-binary 字符串比较在普通列中默认为 case-insensitive。

但是,正如MySQL manual for JSON type

中提到的

MySQL handles strings used in JSON context using the utf8mb4 character set and utf8mb4_bin collation.".

因此,您的 JSON 值在 utf8mb4_bin 归类中,您需要对任一操作数应用不区分大小写的归类以使比较不区分大小写。

例如

WHERE username COLLATE XXX LIKE '...'

其中 XXX 应该是 utf8mb4 排序规则(例如您提到的 utf8mb4_general_ci。)。

WHERE username LIKE '...' COLLATE YYY

其中 YYY 应该是与您连接的字符集相匹配的排序规则。

对于相等比较,您应该 unquote the JSON valueJSON_UNQUOTE() 或不引用提取运算符 ->>

例如

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

或者干脆

payload->>'$.username'

JSON 类型和函数的工作方式不同于普通数据类型。看来你是新手。所以我建议大家在投入生产环境之前仔细阅读手册。