# [Know Issue] new_collations_enabled_on_first_bootstrap 参数为 true，但是 SQL 行为不符合预期

## Key Words

collations, new_collations_enabled_on_first_bootstrap, upgrade, trim, 空格

## Description

集群从 v5.x 版本升级到 v6.x 版本，查询 new_collations_enabled_on_first_bootstrap 为 true，但是看起来集群没有支持新的 collation，对于 utf8mb4_general_ci 属性的表列存在大小写敏感问题。

```sql

MySQL [(test)]> show config where name like '%colla%';
+------+------------------+-------------------------------------------+-------+
| Type | Instance         | Name                                      | Value |
+------+------------------+-------------------------------------------+-------+
| tidb | 127.0.0.1:4000   | new_collations_enabled_on_first_bootstrap | true  |
+------+------------------+-------------------------------------------+-------+
1 row in set (0.02 sec)


MySQL [test]> CREATE TABLE t(a varchar(20) charset utf8mb4 collate utf8mb4_general_ci PRIMARY KEY);
Query OK, 0 rows affected (0.08 sec)

MySQL [test]> INSERT INTO t VALUES ('A');
Query OK, 1 row affected (0.00 sec)

MySQL [test]> INSERT INTO t VALUES ('a');
Query OK, 1 row affected (0.00 sec)

MySQL [test]> INSERT INTO t VALUES ('a ');
Query OK, 1 row affected (0.00 sec)

MySQL [(test)]> select 'a'='a ';
+----------+
| 'a'='a ' |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

```

## Root Cause

1. 旧框架下的排序规则:
在 4.0 版本之前，TiDB 中可以指定大部分 MySQL 中的排序规则，并把这些排序规则按照默认排序规则处理，即以编码字节序为字符定序，这会造成兼容性行为差异。对于例子中的 utf8mb4_general_ci ,在 MySQL 中，由于 utf8mb4_general_ci 大小写不敏感，报错 Duplicate entry 'a'，但是 版本之前，TiDB 则可以写入成功。对于'a ' 值的写入，在 TiDB 会执行成功，而在 MySQL 中，由于补齐空格比较，报错 Duplicate entry 'a '
2. new_collations_enabled_on_first_bootstrap 配置项在 v6.0 以后默认为 true，并且只有在初次初始化集群时生效，初始化集群后，无法通过更改该配置项打开或关闭新的 collation 框架；4.0 版本之前的 TiDB 集群升级到 4.0 或更高版本时，由于集群已经初始化过，该参数无论如何配置，都作为 false 处理。
3. 因此我们需要使用 mysql.tidb 来确认是否真正启用排序规则，而不是 new_collations_enabled_on_first_bootstrap 配置参数值。
详细说明[参考](https://docs.pingcap.com/zh/tidb/stable/character-set-and-collation#%E6%97%A7%E6%A1%86%E6%9E%B6%E4%B8%8B%E7%9A%84%E6%8E%92%E5%BA%8F%E8%A7%84%E5%88%99%E6%94%AF%E6%8C%81)

## Diagnostic Steps

1.使用如下 SQL 确认集群参数配置:

```sql

SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME='new_collation_enabled';

```

2.查看表的排序规则属性:

```sql
show create table table_name;

```

3.使用如下 SQL 确认集群是否真正启用 new collation:

```sql
select 'a'='a ';
select 'A'='a';
```

## Resolution

N/A

## Workaround

1. 对于升级到 v6.x 版本的集群，如果希望启用 new collation，建议新创建集群，然后将旧集群数据导出并导入到新集群中。
2. 对于新创建 v6.x 版本的集群，如果不希望启用 new collation，在初始化前指定 new_collations_enabled_on_first_bootstrap 为 false。
3. 如果是新旧版本行为不统一的问题，比如希望对启用 new collation 的集群指定表排序规则的方式向下兼容旧集群行为，可以参考如下方案：

```sql
mysql> create table binary_collate(a varchar(10)) default collate=binary;
Query OK, 0 rows affected (0.10 sec)

mysql> insert into binary_collate values('a');
Query OK, 1 row affected (0.01 sec)

mysql>  insert into binary_collate values('a ');
Query OK, 1 row affected (0.00 sec)
```

## Affected Versions

N/A
