#1024程序员节 | 征文#
在这里插入图片描述

在docker中的MySQL容器,怎么让他不区分数据库大小写,数据库大小写不敏感

在这里插入图片描述

前言

如果你的是docker的MySQL容器,在启动运行容器时,没有指定。
唯一的解决办法,就是重新运行一个新的容器。
当前既然有唯一,也有唯二,不过,这个解决办法,就不建议了,因为容器重新启动就失效了。
在此之前,你可以先查询你的lower_case_table_names 的值是什么?

查询lower_case_table_names 的值

SHOW VARIABLES LIKE 'lower_case_table_names';
  • 查询数据库是否支持大小写
  • lower_case_table_names 被设置为 1,即表名不区分大小写
  • 如果值为 1,则表示表名和列名在 MySQL 中不区分大小写
  • 如果值为 0 或 2,则表示表名和列名在 MySQL 中区分大小写

查询版本mysql的版本信息

SELECT VERSION();

更详细查看版本的方法请看文章:
我docker拉取mysql镜像时用的是latest,我该怎么看我的镜像版本是多少?可以通过一下三种方法查看

docker里的mysql容器,默认的日志文件和数据库文件放在什么位置

请看文章:docker里的mysql容器,默认的日志文件和数据库文件放在什么位置?并且可以通过sql命令查看

(唯二办法1)设置全局变量-直接使用命令设置不区分大小写

强制执行

SET GLOBAL lower_case_table_names=1;

会提示提示

 SET GLOBAL lower_case_table_names=1
> 1238 - Variable 'lower_case_table_names' is a read only variable
  • 在 MySQL 中,lower_case_table_names 是一个全局变量,但它在运行时是只读的,因此不能通过 SET GLOBAL 命令动态更改。这个变量需要在 MySQL 服务启动时设置,通常是在 MySQL 的配置文件中设置。
  • 如果你正在使用 MySQL 5.7 或更高版本,并且希望在 Docker 容器中设置 lower_case_table_names,最好的方法仍然是通过配置文件来实现。

(唯二办法2)设置数据字典的 lower_case_table_names

设置数据字典的 lower_case_table_names: 你可以通过 SQL 命令来设置数据字典的 lower_case_table_names:

SET @@global.lower_case_table_names = 1;

但是请注意,这个设置在 MySQL 服务重启后会恢复为默认值。


1.直接安装的MySQL数据库,不区分大小写解决办法

MySQL 的配置文件my.cnfmy.ini来设置,lower_case_table_names 的值为1

[mysqld]
lower_case_table_names=1

查询lower_case_table_names 的值

SHOW VARIABLES LIKE 'lower_case_table_names';
  • 查询数据库是否支持大小写
  • lower_case_table_names 被设置为 1,即表名不区分大小写
  • 如果值为 1,则表示表名和列名在 MySQL 中不区分大小写
  • 如果值为 0 或 2,则表示表名和列名在 MySQL 中区分大小写

my.cnfmy.ini在什么位置

我是在根目录下,我的系统是windows10;
截图如下:
在这里插入图片描述

my.ini内容如下

[mysql]
default-character-set=utf8

[mysqld]
port=3306
basedir=D:/CodeTools/phpstudy_pro/Extensions/MySQL5.7.26/
datadir=D:/CodeTools/phpstudy_pro/Extensions/MySQL5.7.26/data/
character-set-server=utf8
default-storage-engine=MyIsam
max_connections=100
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
innodb_buffer_pool_size=64M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=120
innodb_log_buffer_size=4M
innodb_log_file_size=256M
interactive_timeout=120
join_buffer_size=2M
key_buffer_size=32M
log_error_verbosity=1
max_allowed_packet=16M
max_heap_table_size=64M
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=32M
read_buffer_size=512kb
read_rnd_buffer_size=4M
server_id=1
skip-external-locking=on
sort_buffer_size=256kb
table_open_cache=256
thread_cache_size=16
tmp_table_size=64M
wait_timeout=120

[client]
port=3306
default-character-set=utf8


2.宝塔的mysql数据库的 my.cnfmy.ini在什么位置

MySQL的配置文件通常位于/etc/my.cnf或者/etc/mysql/my.cnf中。
你也可以通过命令搜索

find / -name my.cnf

我在测试中它的位置是:/etc/my.cnf

3.docker的mysql容器的 my.cnfmy.ini在什么位置

位置:/etc/mysql/my.cnf

  • 在 MySQL 容器内部,默认的配置文件位置如下:
  • 主配置文件通常位于 /etc/mysql/my.cnf
  • 可以放置额外的配置文件在 /etc/mysql/conf.d/ 目录下。
  • 通过将你的配置文件挂载到 /etc/mysql/conf.d/ 目录,你可以轻松地覆盖默认的配置。

4.docker的mysql容器

4.1 镜像启动容器,使用环境变量,让数据库不区分大小写

运行命令

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_LOWER_CASE_TABLE_NAMES=1 -d mysql:5.7
  • some-mysql是容器名称
  • -e MYSQL_LOWER_CASE_TABLE_NAMES=1 设置了 MySQL 表名不区分大小写
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw 设置了密码是my-secret-pw
  • -d 是后台运行
  • mysql:5.7是容器名称和版本

需要注意

  • 需要注意的是,从 MySQL 5.7 开始,环境变量 MYSQL_LOWER_CASE_TABLE_NAMES 已经不再支持。取而代之的是,你应该通过配置文件来设置 lower_case_table_names 选项。
  • 如果你仍然希望使用环境变量的方式来设置 lower_case_table_names,可以从 MySQL 8.0 开始,通过环境变量 MYSQL_INIT_COMMAND 来执行一条 SQL 命令来设置这个参数。这可以通过在容器启动时执行一条 SQL 命令来实现。
docker run --name some-mysql \
           -e MYSQL_ROOT_PASSWORD=my-secret-pw \
           -e MYSQL_INIT_COMMAND="SET GLOBAL lower_case_table_names=1;" \
           -d mysql:5.7

这条命令将在 MySQL 启动时执行 SQL 命令 SET GLOBAL lower_case_table_names=1;,从而设置 lower_case_table_names1,使得表名不区分大小写。

4.2【推荐】 镜像启动容器,挂载配置文件,让数据库不区分大小写

创建一个包含 my.cnf 文件的目录,并将该目录挂载到 Docker 容器中 MySQL 期望读取配置文件的位置。

4.2.1.创建配置文件 创建一个 my.cnf 文件,并设置 lower_case_table_names:

下面是my.cnf 文件的内容

[mysqld]
lower_case_table_names=1

4.2.2.启动 Docker 容器 使用 -v 参数挂载配置文件到容器内:

docker run --name some-mysql -v /path/to/your/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
  • some-mysql是容器名称
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw 设置了密码是my-secret-pw
  • -d 是后台运行
  • mysql:5.7是容器名称和版本
  • -v /path/to/your/my.cnf:/etc/mysql/my.cnf :这里的 /path/to/your/my.cnf 是你主机上配置文件的位置,/etc/mysql/my.cnf 是容器内 MySQL 查找配置文件的位置。

注意事项

  • 当你使用 -v 挂载配置文件时,请确保主机上的文件路径是正确的,并且文件具有正确的权限。
  • 如果你在生产环境中使用这种方法,请确保你的容器有足够的权限访问挂载的卷,并且配置文件中的任何敏感信息都得到了妥善保护。
  • 如果你使用的是 MySQL 的官方镜像,请参考官方文档以获取最新的配置方法和细节。

4.2.3.验证设置是否生效

启动容器后,你可以通过登录 MySQL 并查询 lower_case_table_names 的值来验证设置是否生效:

docker exec -it some-mysql mysql -uroot -p
  • 在这个命令中,some-mysql 是容器的名称,mysql -uroot -p 是用来连接 MySQL 数据库的命令。
  • 运行这个命令后,你就可以执行sql语句了。

运行命令结果如下

C:\Users\Administrator>docker exec -it mysqltest mysql -uroot -p
Enter password:

直接输入密码即可;
这里需要输入密码,我的密码是123465
这里你输入密码的动作是看不见的,不过没关系,直接输入即可;

运行命令结果如下

C:\Users\Administrator>docker exec -it mysqltest mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 178
Server version: 9.0.1 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

执行以下命令-查询状态:
SHOW VARIABLES LIKE 'lower_case_table_names';
  • 查询数据库是否支持大小写
  • lower_case_table_names 被设置为 1,即表名不区分大小写
  • 如果值为 1,则表示表名和列名在 MySQL 中不区分大小写
  • 如果值为 0 或 2,则表示表名和列名在 MySQL 中区分大小写
    不过这些状态,在我测试中好像是不一样的。
    我的是windows系统,他显示的就是2,但不区分大小写
执行查询数据库表的命令-进行验证:
use mysql;
SELECT * FROM db;
use mysql;
SELECT * FROM DB;

这里查是数据库默认表,
直接sql后,如果可以正常显示表数据,则为正常;
截图如下:
图1
在这里插入图片描述
图2
在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐