Mysql

是否可以以不區分大小寫的方式在 MySQL JSON 數組中進行搜尋?

  • September 22, 2020

例如與表:

create table test (id int primary key, tags json);
insert into test (id, tags) values (1, '["Lorem ipsum", "dolor", "sit"]'), (2, '["foo", "bar"]');

這將匹配:

select id from test where json_search(tags, 'one', 'Lorem%') is not null

但這不會:

select id from test where json_search(tags, 'one', 'lorem%') is not null

理想情況下,我希望能夠匹配這兩種情況。

在 5.7.16 Percona XtraDB 集群上執行

其他情況,當您不能更改數據並且必須有正確的結果時:

select 
   id 
from test 
where json_search(UPPER(tags), 'one', UPPER('lorem%')) is not null

當然會慢一些,所以需要測試真實的數據大小

此問題與搜尋值不是 _ci 字元集有關。只要您的數據表排序規則是 _ci 並且您的搜尋參數也是 _ci,Json_search() 就允許不區分大小寫的搜尋。

要使用準備好的語句在儲存過程中解決此問題,我必須執行以下操作

SET @theQuery = "select *
from `theTable`
where
json_search( 
 `theTable`.`myJsonColumn`, 
 'all', 
 CONVERT( ? USING utf8) COLLATE utf8_unicode_ci, 
 NULL, 
 '$.KeyName' 
) IS NOT NULL";

prepare stmt from @theQuery;
execute stmt using @searchValue;
deallocate prepare stmt;

如果您需要了解有關 json_search 中參數的更多資訊,請參閱 json_Search 文件中的說明。

請注意,?Select-Query 內部是使用 @searchValue 參數的準備語句中的參數。

Mysql 文件 - json_search()

Mysql doc - 排序規則

這比進行lower() 或upper() 轉換更有效,並且正如我注意到的,如果您使用lower() 或upper(),則無法指定要搜尋的鍵。

引用自:https://dba.stackexchange.com/questions/165447