docker创建mysql8、并设置表名和字段不区分大小写配置

本文详细介绍了如何使用Docker拉取并安装MySQL8.0镜像,包括设置自定义密码、不区分大小写参数以及解决sql_mode问题。通过修改my.cnf文件,添加指定的sql_mode,然后保存并重启容器以使配置生效。此外,还提供了将容器commit为新镜像的方法,以及直接下载已配置好的镜像链接。

1.拉取 MySQL 镜像

docker pull mysql:latest

2.安装运行mysql

docker run -itd --name mysql8.0 \
-p 3306:3306  -e MYSQL_ROOT_PASSWORD=root \
-v /home/workspace/mysql:/var/lib/mysql --restart=always \
-e TZ="Asia/Shanghai" mysql --lower_case_table_names=1

注意修改 MYSQL_ROOT_PASSWORD=root ,将root换成自己想要的密码。

--lower_case_table_names=1 这个参数是设置不区分大小写的

3.更新my.cnf(mysql 高版本 sql_mode=only_full_group_by 问题解决方法).

进入到mysql8.0容器

    docker exec -it mysql8.0 bash

安装VIM

apt-get update
apt-get install vim

在/etc/mysql/目录修改my.cnf配置文件

vim /etc/mysql/my.cnf

增加sql_mode

sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

保存my.cnf并重启mysql容器就生效了。

修改后可以将容器commit打包为一个新的镜像,这以后就用这个打包后的镜像,都自动配置了 。

这种如果觉得麻烦的话,可以将mysql的my.cnf配置文件挂载到宿主机目录,直接在宿主机上编辑文件。

my.cnf配置文件如下:

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'


# Custom config should go here
!includedir /etc/mysql/conf.d/

如果不想弄,我自己打包的镜像可以下载直接导入用: 

        镜像下载地址:

https://download.youkuaiyun.com/download/houjiezhuang/62121430https://download.youkuaiyun.com/download/houjiezhuang/62121430        镜像如何导入、运行:

使用Portainer导入docker镜像并运行_houjiezhuang的博客-优快云博客使用Portainer导入docker镜像并运行https://blog.youkuaiyun.com/houjiezhuang/article/details/121898686

MySQL 中,默认情况下,**、列、字符串比较是否区分大小写**是由同的配置决定的。你提到“设置 MySQL 区分大小写”,通常是指 **字符串比较(如 `WHERE name = 'Alice'`)区分大小写**,也可能是希望 **区分大小写**。 下面我将从多个维度详细说明如何在 **MySQL 8.0 + Ubuntu 22.04** 环境中设置 **区分大小写(Case Insensitive)**,提供完整配置验证方法。 --- ## ✅ 一、控制大小写的几个关键点 | 类型 | 默认行为 | 控制方式 | |------|----------|---------| | **数据库/** | Linux 下默认区分大小写 | 通过 `lower_case_table_names` 控制 | | **字段值比较(字符串)** | 取决于字符集排序规则 | 使用 `utf8mb4_general_ci` 或 `utf8mb4_0900_as_cs` | | **查询中的 WHERE 条件匹配** | 依赖排序规则(Collation) | 推荐使用 `_ci` 结尾的排序规则 | --- ## 🛠️ 二、设置字符串比较区分大小写(最常见需求) ### 方法:使用 `utf8mb4_general_ci` 或 `utf8mb4_unicode_ci` 排序规则 > `_ci` = Case Insensitive(区分大小写) > `_cs` / `_bin` = 区分大小写 #### 1. 创建数据库时指定排序规则 ```sql CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` #### 2. 创建时指定 ```sql USE mydb; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) ) COLLATE=utf8mb4_general_ci; ``` #### 3. 验证是否区分大小写 ```sql INSERT INTO users (name) VALUES ('Alice'), ('alice'), ('ALICE'); -- 查询所有 alice(无论大小写) SELECT * FROM users WHERE name = 'alice'; ``` 如果返回三条记录,说明 **区分大小写生效了!** --- ## 🔧 三、修改已有/字段的排序规则 如果你已经建好了,可以修改其排序规则: ```sql -- 修改整个 ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 或只修改某个字段 ALTER TABLE users MODIFY name VARCHAR(100) COLLATE utf8mb4_general_ci; ``` --- ## 💡 四、全局设置默认排序规则(可选) 编辑 MySQL 配置文件,让所有新建数据库都使用区分大小写的规则。 ### 1. 编辑配置文件 ```bash sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf ``` ### 2. 在 `[mysqld]` 段落下添加: ```ini [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci # 或推荐更现代的兼容性排序: # collation-server = utf8mb4_unicode_ci # 如果需要区分大小写(见下文),必须加上: lower_case_table_names = 1 ``` > ⚠️ 注意:`utf8mb4_0900_ai_ci` 是 MySQL 8.0 的默认排序规则,它也是 `_ci`(区分大小写),但属于新标准。如果你想保持传统行为,建议改为 `utf8mb4_general_ci` 或 `utf8mb4_unicode_ci`。 ### 3. 重启 MySQL 生效 ```bash sudo systemctl restart mysql ``` ### 4. 验证全局设置 ```sql SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server'; ``` 输出应为: ``` character_set_server | utf8mb4 collation_server | utf8mb4_general_ci ``` --- ## 🔒 五、设置区分大小写(Linux 特别注意) > ❗ 默认情况下,在 Linux 上 MySQL区分大小写的(Windows macOS 区分)。 > 比如 `CREATE TABLE MyUser` `myuser` 被认为是两个。 要统一成 **区分大小写**,必须设置: ### 1. 修改配置文件 ```bash sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf ``` 在 `[mysqld]` 中加入: ```ini lower_case_table_names = 1 ``` > ⚠️ 必须在初始化数据之前设置! > 如果你已经有数据且大小写混用,修改此参数可能导致找! ### 2. 含义说明 | 值 | 含义 | |----|------| | `0` | 区分大小写(Linux 默认) | | `1` | 区分大小写以小写存储 | | `2` | SQL 语句区分,但保留原始大小写存储(推荐) | ✅ 推荐生产环境设为 `1` ### 3. 重启服务 ```bash sudo systemctl restart mysql ``` --- ## 🧪 六、测试验证 ### 1. 测试字符串比较是否区分大小写 ```sql SELECT 'ABC' = 'abc'; -- 返回 1(true),区分大小写 ``` ### 2. 测试排序规则效果 ```sql SELECT * FROM users WHERE name LIKE 'a%'; -- 应该能查出 Alice, ALICE, alice ``` ### 3. 测试是否区分大小写 ```sql CREATE TABLE TestTable (id INT); SELECT * FROM testtable; -- 成功执行 → 区分大小写 ``` --- ## ⚠️ 注意事项与坑点 | 项目 | 说明 | |------|------| | **能动态修改 `lower_case_table_names`** | 必须在初始安装时设定,否则会出错或数据损坏 | | **已存在的会自动转为小写** | 修改后旧仍保留原,建议提前统一命规范 | | **避免混合使用大小写** | 最好始终用小写命字段 | | **Docker 环境同样适用** | 只需挂载配置文件设置该参数即可 | --- ## ✅ 总结:实现“MySQL 区分大小写”的最终方案 ```ini # /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] # 字符集排序规则(字符串比较区分大小写) character-set-server = utf8mb4 collation-server = utf8mb4_general_ci # 区分大小写(Linux 必加) lower_case_table_names = 1 # 日志其他 log-error = /var/log/mysql/error.log ``` 然后重启: ```bash sudo systemctl restart mysql ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值