类似MySQL的json_解压

类似MySQL的json_解压,mysql,sql,sql-like,mysql-json,collate,Mysql,Sql,Sql Like,Mysql Json,Collate,我有一个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子句不区

我有一个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
子句不区分大小写。 但当我这么做的时候

其中用户名类似“userName1”

它返回0行。我不明白为什么它是这样工作的,
=
子句可以工作,尽管它没有那些双引号

如果我这样做

其中用户名类似于“%userName1%”
现在还返回该行,因为
%%
考虑了引号:

1,“userName1”

但当我这么做的时候

其中用户名类似于“%username1%”
它返回0行,因此与通常的MySQL
类似,它在某种程度上区分大小写

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

好的,我通过在
LIKE
子句之后添加
COLLATE utf8mb4\u general\u ci
解决了不区分大小写的问题


因此,这里的重点是找到一个有效的排序规则,这可以通过研究您使用的数据库来找到。

MySQL的默认排序规则是and。因此,在普通列中,默认情况下,非二进制字符串比较不区分大小写

然而,正如在

MySQL使用
utf8mb4
字符集和
utf8mb4\u-bin
排序规则来处理JSON上下文中使用的字符串

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

例如

其中用户名与XXX类似“…”
其中
XXX
应该是utf8mb4排序规则(例如您提到的
utf8mb4\u general\u ci

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

要进行相等比较,应使用
JSON\u UNQUOTE()
或unquoting提取运算符
->

例如

JSON_UNQUOTE(JSON_提取(有效负载,$.username'))
或者干脆

payload->'$.username'

JSON类型和函数的工作方式与普通数据类型不同。您似乎是新手。因此,我建议您在将其放入生产环境之前仔细阅读手册。

我认为默认情况下mysql不区分大小写。只有在执行binary Operation Like子句时才区分大小写但是如果它是json,那么当你需要MySQL在字符串中搜索时,重新考虑使用json。相反,它可能值得将该字段分成一个单独的列。
WHERE username LIKE '...' COLLATE YYY