[英]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';
它返回 1 行,如下所示:
1, "userName1"
看到子句中沒有的引號了嗎?
我需要的是使WHERE
子句不區分大小寫。 但是當我這樣做時
WHERE username LIKE 'userName1';
它返回 0 行。 我不明白為什么它會這樣工作, =
子句雖然沒有那些雙引號,但它仍然有效。
如果我做
WHERE username LIKE '%userName1%';
現在也返回該行,因為%%
考慮了引號:
1, "userName1"
但是當我這樣做時
WHERE username LIKE '%username1%';
它返回 0 行,因此與通常的LIKE
不同,它在某種程度上區分大小寫。
我在做什么錯以及如何以不區分大小寫的方式過濾 json 有效負載? EDIT=========================================== 猜測應該使用COLLATE
在這里,但到目前為止我不明白如何使它工作。
MySQL 的默認排序規則 在 8.0 latin1_swedish_ci
是utf8mb4_0900_ai_ci
,從 8.0開始是 utf8mb4_0900_ai_ci 。 因此,在普通列中,非二進制字符串比較默認不區分大小寫。
MySQL 使用
utf8mb4
字符集和utf8mb4_bin
排序規則處理 JSON 上下文中使用的字符串。”。
因此,您的 JSON 值在utf8mb4_bin
排序規則中,您需要對任一操作數應用不區分大小寫的排序規則以使比較不區分大小寫。
例如
WHERE username COLLATE XXX LIKE '...'
其中XXX
應該是 utf8mb4 排序規則(例如您提到的utf8mb4_general_ci
。)。
或者
WHERE username LIKE '...' COLLATE YYY
其中YYY
應該是與您連接的字符集匹配的排序規則。
對於相等比較,您應該使用JSON_UNQUOTE()
或取消引用提取運算符取消引用 JSON 值->>
例如
JSON_UNQUOTE(JSON_EXTRACT(payload, '$.username'))
或者干脆
payload->>'$.username'
JSON 類型和函數的工作方式與普通數據類型不同。 看來你是新手。 因此,我建議您在將其投入生產環境之前仔細閱讀手冊。
好的,我能夠通過在LIKE
子句之后添加COLLATE utf8mb4_general_ci
來解決不區分大小寫的問題。
所以這里的重點是找到一個有效的排序規則,而它又可以通過研究您使用的數據庫來找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.