Linux数据库表名大小写敏感引发的异常

我的问题

最近跑了几个项目,用的是Linux数据库,总是出现找不到表的问题,百度一下,原来是表名大小写敏感问题。

变量lower_case_table_names

为什么本地开发没问题,但是测试环境就提示表不存在呢?因为本地的windows开发环境,默认是大小写不敏感。而测试环境的linux是敏感的。
我们在Linux执行命令,查看自己电脑中的Linux系统变量可以看到:

show variables like '%lower_case_table_names%';

变量lower_case_table_names的取值

取值范围有三个,分别是0、1、2.

  1. 设置成0:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时大小写敏感。

  2. 设置成1:表名转小写后存储到硬盘,比较时大小写不敏感。

  3. 设置成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为新建的目录即可, 但是这种做法,最好数据要备份,防止丢失。

posted @ 2022-03-23 12:06  蔡地像徐坤  阅读(312)  评论(0编辑  收藏  举报