优秀的编程知识分享平台

网站首页 > 技术文章 正文

MySQL踩坑系列之3 唯一索引之表名大小写

nanyue 2024-08-03 18:02:54 技术文章 7 ℃


目录

    • 背景
    • 复现
    • 如何避免


背景

某天有个做研发的同学找到我,说数据库表从某个地方迁移到了新地方发现,明明表存在,结果程序读不到了。一听这个,直觉就告诉我是表名称大小写的问题。

  • 复现

场景1:

(vt_dba@localhost) [test2023013101] >pager grep t1;
PAGER set to 'grep t1'
(vt_dba@localhost) [test2023013101] >show tables;
| t1                       |
1 row in set (0.01 sec)

(vt_dba@localhost) [test2023013101] >select * from T1;
Empty set (0.00 sec)

场景2:

(vt_dba@localhost) [vt_unibase_test] >pager grep t1;
PAGER set to 'grep t1'
(vt_dba@localhost) [vt_unibase_test] >show tables;
| t1                        |
17 rows in set (0.00 sec)

(vt_dba@localhost) [vt_unibase_test] >select * from T1;
ERROR 1146 (42S02): Table 'vt_unibase_test.T1' doesn't exist

同样的场景下,为什么一个可以一个不可以呢?,其实就是参数lower_case_table_names在做怪。我们看看参数的解释,大家就明白了。

1.lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的
2.lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
3.lower_case_table_names=2 表名存储为给定的大小写但是比较的时候是小写的
4.unix,linux下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 2

如何避免

1.养成良好的编码习惯,数据库里的东西,库名、表名、字段名都使用小写,以避免参数配置不当的场景引发问题。
2.初始化部署的时候,将参数lower_case_table_names 设置成1,以避免引发问题。
最近发表
标签列表