tidb字符集默认排序规则问题

tidb 4.0.13

tidb字符集默认排序规则是严格区分大小写的,现在业务上数据要忽略大小写,有可以修改的全局参数来控制排序规则吗?

我查的文档说new_collations_enabled_on_first_bootstrap这个参数可以控制,但是必须要重建集群,在集群初始换的时候来控制,不知是否是这样?

假如我不想重建集群,有办法能修改tidb的排序规则不区分大小写吗?

1 个赞

目前如果不想重新建集群,没有办法修改 TiDB 不区分大小,还是重建集群才能满足需求。

只需要这一个参数new_collations_enabled_on_first_bootstrap控制吗?
还需要其他参数吗?

HI,可以参考一下这个帖子 new_collations_enabled_on_first_bootstrap tiup 安装时如何配置

我重建了集群,开启了new_collation_enabled,修改了排序规则为utf8mb4_general_ci,
但是当我创建一个表之后,表的编码规则依然是utf8mb4_bin,这是为什么?

mysql> SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME=‘new_collation_enabled’;
±---------------+
| VARIABLE_VALUE |
±---------------+
| True |
±---------------+
1 row in set (0.00 sec)

mysql> show global variables like ‘collation%’;
±---------------------±-------------------+
| Variable_name | Value |
±---------------------±-------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
±---------------------±-------------------+

CREATE DATABASE test_0624 /*!40100 DEFAULT CHARACTER SET utf8mb4 */

CREATE TABLE test20210624 (
id bigint(20) NOT NULL AUTO_INCREMENT,
name char(10),
PRIMARY KEY (id)
) ENGINE=InnoDB

mysql> use test_0624
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>
mysql>
mysql> show table status like ‘test20210624’\G
*************************** 1. row ***************************
Name: test20210624
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 12
Data_length: 12
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 2
Create_time: 2021-06-24 13:19:07
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_bin
Checksum:
Create_options:
Comment:
1 row in set (0.02 sec)

需要在建库的时候显示的指定字符集和排序规则,没办法全局指定,这个我之前提过,但是最新版也还是这样

我也发现这个问题了,不知道是官方认为这样是对的,还是说是bug没修复

https://asktug.com/t/topic/68873/23,估计目前没有在恢复

有解决方案吗?我现在也遇到这个问题,重建集群,但dm全量同步是依然是使用默认字符集,没有继承mysql的字符集

重新发一个新问题

重建集群,DM同步事先在tidb创建你需要的字符集的库表,然后通过DM同步数据,DM在同步的过程中如果发现库表存在会报错忽略,不影响数据的同步

你全量同步数据能继承mysql的字符集吗?我这没报错,但只有新建的表才会继承mysql的字符集,旧表还是tid默认的字符集

我这mysql是utf8,迁到tidb都换成utf8mb4了,所以,迁移之前在tidb中先创建库表为utf8mb4,所以不需要mysql原来的字符集以及编码规则了

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。