当前位置:   article > 正文

MySQL 数据迁移中 lower_case_table_names 参数影响

lower_case_table_names

记一次 SQLServer 迁移至 MySQL 遇到的一个关于 lower_case_table_names 参数的问题。


前言

将 SQLServer 数据库迁移至 MySQL 迁移过后,驼峰命名的表都变成了小写,例如:DooBeDooBa 变成了 doobedooba 本篇文章分析下原因和解决方法。

一、原因分析

MySQL 对大小写是否敏感,由 lower_case_table_names 参数来控制,修改此参数需要重启数据库才能生效,该参数由三个选项:

  • lower_case_table_names = 0:表名区分大小写,且按照用户指定存储。

    mysql> create table CmVotingRecord(
        ->     Id int auto_increment primary key ,
        ->     NameInfo varchar(20)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into CmVotingRecord value (1, '1');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into cmvotingrecord value (1, '1');
    ERROR 1146 (42S02): Table 'test.cmvotingrecord' doesn't exist
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | CmVotingRecord |
    +----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    可以看到我们创建 CmVotingRecord 表,MySQL 也是按照 CmVotingRecord 存储的,使用小写则无法操作该表。

  • lower_case_table_names = 1:表不区分大小写,使用小写存储。

    root@mysql 14:25:  [rep_test]>create table CmVotingRecord(
    ->     Id int auto_increment primary key ,
    ->     NameInfo varchar(20)
    -> );
    Query OK, 0 rows affected (0.02 sec)
    
    root@mysql 14:25:  [rep_test]>show tables;
    +--------------------+
    | Tables_in_rep_test |
    +--------------------+
    | cmvotingrecord     |
    +--------------------+
    1 row in set (0.01 sec)
    
    root@mysql 14:25:  [rep_test]>insert into CmVotingRecord value (1, '1');
    Query OK, 1 row affected (0.00 sec)
    
    root@mysql 14:25:  [rep_test]>insert into cmvotingrecord value (2, '1');
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    可以看到我们创建 CmVotingRecord 表,MySQL 则是按照 cmvotingrecord 小写存储的,使用 大写/小写 都可以操作该表。

  • lower_case_table_names = 2:表不区分大小写,按照用户指定存储。

    mysql> select @@lower_case_table_names;
    +--------------------------+
    | @@lower_case_table_names |
    +--------------------------+
    |                        2 |
    +--------------------------+
    1 row in set (0.00 sec)
    
    mysql> create table CmVotingRecord(
        ->     Id int auto_increment primary key ,
        ->     NameInfo varchar(20)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show tables;
    +------------------+
    | Tables_in_test02 |
    +------------------+
    | CmVotingRecord   |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql>
    mysql> insert into CmVotingRecord value (1, '1');
    Query OK, 1 row affected (0.00 sec)
    
    mysql>
    mysql> insert into cmvotingrecord value (2, '1');
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    可以看到我们创建 CmVotingRecord 表,MySQL 是按照 CmVotingRecord 用户指定大小存储的,使用 大写/小写 都可以操作该表。

在不同系统上运行,会有不同的默认值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/449321
推荐阅读
相关标签