Linux数据库表名大小写敏感引发的异常
我的问题
最近跑了几个项目,用的是Linux数据库,总是出现找不到表的问题,百度一下,原来是表名大小写敏感问题。
变量lower_case_table_names
为什么本地开发没问题,但是测试环境就提示表不存在呢?因为本地的windows开发环境,默认是大小写不敏感。而测试环境的linux是敏感的。
我们在Linux执行命令,查看自己电脑中的Linux系统变量可以看到:
show variables like '%lower_case_table_names%';
变量lower_case_table_names的取值
取值范围有三个,分别是0、1、2.
-
设置成
0
:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时大小写敏感。 -
设置成
1
:表名转小写后存储到硬盘,比较时大小写不敏感。 -
设置成
2
:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时统一转小写比较。
这个选项不仅仅适用于表名的大小写敏感,同样适用于数据库名和表别名。
解决方案1:修改变量lower_case_table_names(不要试了,会出现重启失败问题)
#修改mysql配置文件
vi /etc/my.cnf
#增加如下配置选项
[mysqld]
lower_case_table_names=1
#重启mysql服务
systemctl restart mysqld
mysql docker 容器中的配置文件位置:
/etc/mysql/my.cnf
如果 docker
中没有 vim
,执行以下命令
apt-get update
apt-get install vim
解决方案2:重新安装mysql,并指定lower_case_table_names=1(可行)
重新启动mysql,如果是第一次安装,那么docker后面直接加--lower-case-table-names=1是可以的。
如果不是第一次装,需要卸载掉原有的mysql,-v /home/mysql/data:/var/lib/mysql 这里指定一个新的,干净的数据仓库。然后再--lower-case-table-names=1即可。原有:
原有:
docker run --name mysql --restart=always \
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/mysql/data:/var/lib/mysql \
-p 3317:3306 \
-e MYSQL_ROOT_PASSWORD="root" \
-e TZ=Asia/Shanghai \
-d mysql:8.0
修改:
docker run --name mysql --restart=always \
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/mysql/data2:/var/lib/mysql \
-p 3317:3306 \
-e MYSQL_ROOT_PASSWORD="root" \
-e TZ=Asia/Shanghai \
-d mysql:8.0 --lower-case-table-names=1
其中/home/mysql/data2为新建的目录即可, 但是这种做法,最好数据要备份,防止丢失。