类似MySQL的json_解压
我有一个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子句不区
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