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 value 与 JSON_UNQUOTE()
或不引用提取运算符 ->>
例如
JSON_UNQUOTE(JSON_EXTRACT(payload, '$.username'))
或者干脆
payload->>'$.username'
JSON 类型和函数的工作方式不同于普通数据类型。看来你是新手。所以我建议大家在投入生产环境之前仔细阅读手册。
我有一个 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 andutf8mb4_bin
collation.".
因此,您的 JSON 值在 utf8mb4_bin
归类中,您需要对任一操作数应用不区分大小写的归类以使比较不区分大小写。
例如
WHERE username COLLATE XXX LIKE '...'
其中 XXX
应该是 utf8mb4 排序规则(例如您提到的 utf8mb4_general_ci
。)。
或
WHERE username LIKE '...' COLLATE YYY
其中 YYY
应该是与您连接的字符集相匹配的排序规则。
对于相等比较,您应该 unquote the JSON value 与 JSON_UNQUOTE()
或不引用提取运算符 ->>
例如
JSON_UNQUOTE(JSON_EXTRACT(payload, '$.username'))
或者干脆
payload->>'$.username'
JSON 类型和函数的工作方式不同于普通数据类型。看来你是新手。所以我建议大家在投入生产环境之前仔细阅读手册。