【 TiDB 使用环境】生产环境 or 测试环境 or POC
测试、生产环境
【 TiDB 版本】
v5.0.6
【遇到的问题】
在tidb中,语句select * from t_like where name like '房%'查询无返回数据,而再mysql里面可以正常返回数据
【复现路径】做过哪些操作出现的问题
【问题现象及影响】
TiDB中:
1、查看是否启用新排序规则
SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME=‘new_collation_enabled’;
±---------------+
| VARIABLE_VALUE |
±---------------+
| True |
±---------------+
1 row in set (0.01 sec)
2、查看字符集
show global variables like ‘%coll%’;
±-----------------------------------±-------------------+
| Variable_name | Value |
±-----------------------------------±-------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
| tidb_enable_collect_execution_info | ON |
±-----------------------------------±-------------------+
3、建表重现问题
表排序规则是utf8mb4_general_ci,不是tidb默认的utf8mb4_bin
CREATE TABLE t_like
(
id
int(11) NOT NULL,
name
varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
KEY idx_name
(name
),
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
insert into t_like values(1,‘房房房’),(2,‘子子子’);
select * from t_like;
±—±----------+
| id | name |
±—±----------+
| 1 | 房房房 |
| 2 | 子子子 |
±—±----------+
2 rows in set (0.01 sec)
select * from t_like where name like ‘房房%’;
Empty set (0.00 sec)
select * from t_like where name like ‘房房房%’;
Empty set (0.00 sec)
select * from t_like where name like ‘子子%’;
±—±----------+
| id | name |
±—±----------+
| 2 | 子子子 |
±—±----------+
1 row in set (0.01 sec)
select * from t_like where name like ‘子子子%’;
±—±----------+
| id | name |
±—±----------+
| 2 | 子子子 |
±—±----------+
1 row in set (0.01 sec)
如上所示查询汉字‘房’时无数据返回,应该要返回数据,汉字‘子’就正常返回
在MySQL中:
1、查看字符集
show global variables like ‘%coll%’;
±---------------------±-------------------+
| Variable_name | Value |
±---------------------±-------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
±---------------------±-------------------+
3 rows in set (0.00 sec)
2、建表重现问题
CREATE TABLE t_like
(
id
int(11) NOT NULL,
name
varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
KEY idx_name
(name
),
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
insert into t_like values(1,‘房房房’),(2,‘子子子’);
select * from t_like where name like ‘房房%’;
±—±----------+
| id | name |
±—±----------+
| 1 | 房房房 |
±—±----------+
1 row in set (0.00 sec)
select * from t_like where name like ‘房房房%’;
±—±----------+
| id | name |
±—±----------+
| 1 | 房房房 |
±—±----------+
1 row in set (0.00 sec)
如上所示查询汉字‘房’时正常数据返回
在模糊查询的汉字是‘房’时候会出现这个问题,应该还要其他汉字也会出现,但是没有验证出来,难道这个字有啥特殊的地方?这个不确定性比较麻烦
之后又在tidb中将t_like表的排序规则改为tidb默认的utf8mb4_bin,则查询时正常返回数据,但生产环境为了跟MySQL兼容,在参数、库和表级别排序规则都是utf8mb4_general_ci,无法修改。
【附件】