问题背景
MySQL 5.7 数据库由于历史原因设置的字符集为utf8 ,排序规则为utf8_general_ci ,
表是新建的,默认字符集设置为ut8mb4,排序规则为 ut8mb4_general_ci,
- utf8_bin/utf8mb4:将字符串中的每一个字符以十六进制方式存储数据,区分大小写。
- utf8_general_ci/utf8mb4_general_ci:不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
需求如下:
-
数据库t_test_json 表中 request_param 是一个jSON类型的字段,
-
user_name 值是:{“user_name”:“ABC”}, 查询匹配使用小写abc进行匹配,需要命中。
-
不可使用like 语法处理。
最开始使用这种写法,匹配结果发现是大小写敏感的,
SELECT
*
FROM
t_test_json
WHERE
request_param -> '$.user_name' = 'abc'
数据库存的是ABC, 查询匹配用abc匹配,未命中。
修复解决方案
- 使用-> 语法含义:
- 使用了
->
运算符来提取JSON对象中request_param键的值,并将其作为JSON对象进行匹配。->
运算符返回的是一个JSON对象,而不是字符串,因此无法直接使用LIKE进行模糊匹配。- 使用
->>
语法含义
- 使用了
->>
运算符来提取JSON对象中request_param键的值,并将其作为字符串进行模糊匹配。->>
运算符返回的是一个字符串,因此可以使用LIKE进行模糊匹配。
因此,这两个查询语句在语法和匹配的方式上是不同的,可能会导致不同的结果。
修复方案如下所示:
SELECT
*
FROM
t_test_json
WHERE
request_param ->> '$.user_name' = 'abc' COLLATE utf8mb4_general_ci
数据库存的是ABC, 查询匹配用abc匹配,命中。