tidb如何设置支持表名大小写

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
tidb如何设置支持表名大小写,比如: 表名 abc和 ABC 是两个表

tidb支持大小写表名,但是用小写来比较表名

TiDB 默认情况下对 Schema name 大小写不敏感,即 lower_case_table_names:2 。但上游 MySQL 大多为 Linux 系统,默认对大小写敏感。此时需要注意,在 DM 数据同步任务设置时将 case-sensitive 设置为 true ,保证可以正确同步上游的 Schema。
具体是 dm同步任务要怎么设置?

1 个赞

https://docs.pingcap.com/zh/tidb/dev/task-configuration-file-full

1 个赞

没找到如何支持表名大小写的资料

楼上大佬已经给出了资料~


没有找到。上面说的是大小写是数据迁移大小写敏感

注意审题,楼主说的是DM数据同步

是的,是数据迁移大小写敏感

存到数据库SCHEMA中全是大家的。

经测试,与官方文档描述一致,是不支持仅大小写不同的多个表名存在的。

  • lower_case_table_names
    • TiDB 默认:2,且仅支持设置该值为 2
    • MySQL 默认如下:
      • Linux 系统中该值为 0,表示表名和数据库名按照在 CREATE TABLECREATE DATABASE 语句中指定的字母大小写存储在磁盘上,且名称比较时区分大小写。
      • Windows 系统中该值为 1,表示表名按照小写字母存储在磁盘上,名称比较时不区分大小写。MySQL 在存储和查询时将所有表名转换为小写。该行为也适用于数据库名称和表的别名。
      • macOS 系统中该值为 2,表示表名和数据库名按照在 CREATE TABLECREATE DATABASE 语句中指定的字母大小写存储在磁盘上,但 MySQL 在查询时将它们转换为小写。名称比较时不区分大小写。
mysql> use test
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> create table abc (tid int);
Query OK, 0 rows affected (0.19 sec)

mysql> create table ABC (tid int);
ERROR 1050 (42S01): Table 'test.ABC' already exists
mysql> show variables like '%case%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| lower_case_file_system             | 1     |
| lower_case_table_names             | 2     |
| validate_password.mixed_case_count | 1     |
+------------------------------------+-------+
3 rows in set (0.00 sec)

mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v7.5.0 |
+--------------------+
1 row in set (0.00 sec)
mysql> select * from information_schema.tables where table_name='ABC';
Empty set (0.02 sec)

mysql> select * from information_schema.tables where table_name='abc';
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | TIDB_TABLE_ID | TIDB_ROW_ID_SHARDING_INFO | TIDB_PK_TYPE | TIDB_PLACEMENT_POLICY_NAME |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
| def           | test         | abc        | BASE TABLE | InnoDB |      10 | Compact    |          0 |              0 |           0 |               0 |            0 |         0 |           NULL | 2024-01-19 14:07:25 | NULL        | NULL       | utf8mb4_bin     |     NULL |                |               |           144 | NOT_SHARDED               | NONCLUSTERED | NULL                       |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
1 row in set (0.01 sec)

mysql> drop table abc;
Query OK, 0 rows affected (0.35 sec)

mysql> create table ABC (tid int);
Query OK, 0 rows affected (0.15 sec)

mysql> select * from information_schema.tables where table_name='ABC';
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | TIDB_TABLE_ID | TIDB_ROW_ID_SHARDING_INFO | TIDB_PK_TYPE | TIDB_PLACEMENT_POLICY_NAME |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
| def           | test         | ABC        | BASE TABLE | InnoDB |      10 | Compact    |          0 |              0 |           0 |               0 |            0 |         0 |           NULL | 2024-01-19 14:15:27 | NULL        | NULL       | utf8mb4_bin     |     NULL |                |               |           147 | NOT_SHARDED               | NONCLUSTERED | NULL                       |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+---------------+---------------------------+--------------+----------------------------+
1 row in set (0.02 sec)

mysql> select * from information_schema.tables where table_name='abc';
Empty set (0.01 sec)

mysql> 

1 个赞

玩的这么花嘛 :fearful:

不建议这么弄了

1 个赞

这么玩不太好吧。Linux的访问方式比较单一,大小写敏感没有太大问题。数据库系统要跟业务系统交互,多数情况下还有中间件,有时还会有备份、数据迁移等操作,搞大小写敏感弊大于利。

区分大小写,但凡一个字母错了就报错,不小心大小写写反了出问题更多,用mysql跟一些pg的国产数据库特地强调要不区分大小写

加双引号不行吗?

1 个赞

有点好奇,这样区分表名大小写的意义是什么?或者说要区分表名大小写的场景是什么?

case-sensitive 设置为 true

还不如不区分,无论应用还是数据库维护都容易混乱。

1 个赞

case-sensitive: false # schema/table 是否大小写敏感
但是感觉不如不弄大小写敏感,毕竟还有还要和应用配合,那边很可能不支持,万一部署在windows server呢