簡體   English   中英

MySQL LIKE 與 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'; 

它返回 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_ciutf8mb4_0900_ai_ci ,從 8.0開始是 utf8mb4_0900_ai_ci 。 因此,在普通列中,非二進制字符串比較默認不區分大小寫。

但是,如JSON 類型的 MySQL 手冊中所述

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM