我可以在 MySQL 中使用 JSON_EXTRACT 进行不区分大小写的搜索吗?

Dav*_*ein 7 mysql json

我正在运行SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = 'hello world'的意图hello world是来自用户的数据,我会将其展平为全部小写。我的数据库中的实际值是“Hello World”,但每次搜索都返回空值。

如果我做 a SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable,它肯定会返回小写为hello world. 不确定我在这里缺少什么。

获取实际值的查询:

SELECT JSON_EXTRACT(metadata, "$.title") FROM mytable 得到我 "Hello World"

SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable 得到我 "hello world"

试图找到正确行的查询

让我有价值

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "Hello World"

SELECT * FROM mytable WHERE metadata->"$.title" = "Hello World"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "%hello world%"

什么都不给我

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "hello world"

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") LIKE "%hello world%"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") = "hello world"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "hello"

所以看起来结果是返回值,包括引号。不过,这似乎不是问题,因为我在匹配案例时得到了结果。我也很困惑为什么一%开始就解决了我的问题。"和之间没有空格H。我自己输入了 JSON。

我还通过手动输入metadata直接更新了列{"title":"Hello World"}。MySQL 会自动在冒号后添加一个空格以使其成为{"title": "Hello World"},这很好,但只是检查任何空格的完整性。

Dav*_*ein 10

SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = JSON_QUOTE("hello world")并且SELECT * FROM mytable WHERE LOWER(metadata->"$.title") = JSON_QUOTE("hello world")有效,但我不确定为什么JSON_QUOTE在使用LOWER与不需要它进行精确搜索时需要使用它。

如果有人能解释原因,我很乐意将它们标记为答案。


ake*_*ney 5

我在使用like. 我通过将 JSON 函数的输出转换为CHAR.

本文提到 JSON 函数返回一个utf8mb4 string. 这让我相信返回的是不同的数据类型(可能是字节数组)而不是VARCHAR. 这将解释为什么不区分大小写的文本搜索失败。

select
json_unquote(json_extract(json, '$.reservation.status')) as status,
json_unquote(json_extract(json, '$.reservation.status')) like '%cancelled%' as case_sensitive,
cast(json_unquote(json_extract(json, '$.reservation.status')) as CHAR) like '%cancelled%' as case_insensitive
from myTable
Run Code Online (Sandbox Code Playgroud)

此查询的输出是:

|---------------------|------------------|---------------------|
|        status       |  case_sensitive  |  case_insensitive   |
|---------------------|------------------|---------------------|
|      Cancelled      |        0         |         1           |
|---------------------|------------------|---------------------|
|        New          |        0         |         0           |
|---------------------|------------------|---------------------|
Run Code Online (Sandbox Code Playgroud)