解决方案: MySQL JSON字段匹配值忽略大小写不敏感匹配结果

问题背景

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匹配,命中。

猜你喜欢

转载自blog.csdn.net/hadues/article/details/130895617
今日推荐