Mysql / Maria DB大小写敏感搜索

idfiyjo8  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(152)

我运行2台服务器- Maria DB v10在我的Mac和MySQL v5.6在Centos上。它们都有相同的数据库和行为是相同的,所以我的问题是不相关的操作系统或服务器版本。
数据库1中的表定义如下

CREATE TABLE `issue_head` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nme` longblob NOT NULL,
  `row_ts` bigint(20) NOT NULL,
  `created_user_id` bigint(20) NOT NULL,
  `assigned_user_id` bigint(20) DEFAULT NULL,
  `appID` bigint(20) NOT NULL,
  `severity` varchar(50) NOT NULL,
  `status` varchar(50) NOT NULL,
  `is_test_ind` int(11) NOT NULL DEFAULT 0,
  `price_est` decimal(15,2) DEFAULT NULL,
  `required_ts` bigint(20) DEFAULT NULL,
  `required_notif_ts` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id1` (`appID`,`status`,`row_ts`),
  KEY `id2` (`appID`,`row_ts`),
  KEY `id3` (`appID`,`assigned_user_id`,`row_ts`),
  KEY `id4` (`required_ts`,`required_notif_ts`)
) ENGINE=InnoDB AUTO_INCREMENT=1204 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_czech_ci;

db2 中的表定义如下

CREATE TABLE `aftn` (
  `id` bigint(20) NOT NULL,
  `druh_id` bigint(20) NOT NULL,
  `out_ind` bigint(20) NOT NULL,
  `row_dt` datetime NOT NULL,
  `chng_dt` datetime NOT NULL,
  `ack_dt` datetime DEFAULT NULL,
  `mess_id` char(7) DEFAULT NULL,
  `subj` varchar(500) DEFAULT NULL,
  `msg` longtext DEFAULT NULL,
  `status_id` bigint(20) NOT NULL,
  `rel_obj_id` bigint(20) DEFAULT NULL,
  KEY `aftn_id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_czech_ci;

因此,它们具有相同的字符集和相同的排序规则。不幸的是,从数据库1中选择的字符集是大小写敏感的,尽管排序规则是 *_ci。从 db2 中选择的字符集是大小写敏感的。使用以下示例

select * from issue_head where nme like 'test%' and appID = 23;

不返回任何内容,但如果我这样写:

select * from issue_head where nme like CONVERT('test%' USING utf8mb3) COLLATE utf8mb3_czech_ci and appID = 23;

返回所有行,不考虑大小写。
选择

select * from aftn where msg like 'gg%';

在 db2 上运行将返回所有行而不管大小写。
数据库1有什么问题,如何使其大小写不敏感?

6kkfgxo0

6kkfgxo01#

我可以重现这个问题。我正在用MySQL 8.0.32进行测试,这是我在笔记本电脑上安装的。

mysql> insert into issue_head set nme='TESTING', appid=23, row_ts = 23, created_user_id=23, severity='bad', status='on';
Query OK, 1 row affected (0.00 sec)

mysql> select * from issue_head where nme like 'test%' and appID = 23;
Empty set (0.00 sec)

我发现了这个解决方案:

mysql> select * from issue_head where nme like 'test%' collate utf8mb3_czech_ci and appID = 23;
+------+------------------+--------+-----------------+------------------+-------+----------+--------+-------------+-----------+-------------+-------------------+
| id   | nme              | row_ts | created_user_id | assigned_user_id | appID | severity | status | is_test_ind | price_est | required_ts | required_notif_ts |
+------+------------------+--------+-----------------+------------------+-------+----------+--------+-------------+-----------+-------------+-------------------+
| 1204 | 0x54455354494E47 |     23 |              23 |             NULL |    23 | bad      | on     |           0 |      NULL |        NULL |              NULL |
+------+------------------+--------+-----------------+------------------+-------+----------+--------+-------------+-----------+-------------+-------------------+

我看到你将nme列定义为LONGBLOB。这是没有字符集或排序规则的二进制数据,所以如果你不指定排序规则,它就无法使用不区分大小写的排序规则。

相关问题