IE盒子

搜索
查看: 110|回复: 0

一次说清楚mysql的lower_case_table_names参数设置和 ...

[复制链接]

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-3-6 08:29:04 | 显示全部楼层 |阅读模式
[root@iZwz9gZ w-db]# docker exec fb24e0ff  /usr/bin/mysqldump -h127.0.0.1 -uroot --password=xxx ow_code_platform  > backup_low_code_platform20230216.sqlmysqldump: [Warning] Using a password on the command line interface can be insecure.mysqldump: Got error: 1066: Not unique table/alias: 'act_evt_log' when using LOCK TABLES
今天在手动备份mysql的某个数据库时发生了Got error: 1066: Not unique table/alias的错误。
原因是:
1. 这个数据库里面有大些字母的表名称和小写字母的表名
2. 大写表和小写表的名字是相同的(例如:act_evt_log和ACT_EVT_LOG)
3. mysql的参数lower_case_table_names = 1        遇到这种情况,是因为在mysql的配置文件my.cnf中设置的变量lower_case_table_names取值不同,对数据库表名的大小写处理不同。
规则如下:
系统变量lower_case_table_names有三个值:分别是0、1、2.
1. 设置成0:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时大小写敏感。
  例如:代码里访问select * from ACT_EVT_LOG;执行的时候就是访问ACT_EVT_LOG这张表。
       代码里访问select * from act_evt_log;执行的时候就是访问act_evt_log这张表。
2. 设置成1:表名转小写后存储到硬盘,比较时大小写不敏感。
  例如:代码里访问select * from ACT_EVT_LOG;或者select * from act_evt_log;执行的时候都是访问act_evt_log这张表。
3. 设置成2:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时统一转小写比较。
    例如:代码里访问select * from ACT_EVT_LOG;执行的时候就是访问act_evt_log这张表。那么如何解决上面的问题的?
我的思路是,首先调整参数lower_case_table_names=0,这样才能保证对大小写表格的读写能够被区分开。在my.cnf文件中新增一行: lower_case_table_names = 0
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

user = mysql
port = 3306
........
lower_case_table_names = 0然后重启MySQL服务。查询参数值:
mysql> show variables like 'lower_case_table_names';
lower_case_table_names 0这个时候再运行mysqldump就会把所有表格倒出来,不管表名字的大小写。
在这个状态下,也可以进行表格的改名、删除操作。
例如:
ALTER TABLE old_table_name  RENAME TO new_table_name; 建议表名字都用小写。
在把大写表名都改成小写的或者清理删除完大写表名后,可以将lower_case_table_names参数改成1。
这样就可以保证都是访问的小写表名的表了。

另外,windows、mac和linux下新安装的mysql版本,lower_case_table_names的初始默认值是不一样的。
1. linux系统:
   lower_case_table_names = 0; (默认为0)
   数据库名与表名是严格区分大小写的;
   表的别名是严格区分大小写的;
   列名与列的别名在所有的情况下均是忽略大小写的;
   变量名也是严格区分大小写的;

2. mac系统:
   lower_case_table_names = 2;(默认为2)

3. windows系统:
     lower_case_table_names = 1;(默认为1)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表