栏目头部广告

MySQL区分大小写参数配置

一、背景简述

在云环境中,我们经常会遇到以下几个场景:

1、MySQL5.7及以下修改区分大小写参数,导致大写表无法识别,影响业务对表/库的操作,间接导致备份失败;

2、MySQL8.0修改区分大小写参数,导致MySQL服务器无法启动。

lower_case_table_names 值
◆ 0  表名存储为给定的大小;比较是区分大小写的
◆ 1  表名存储在磁盘是小写的;比较的时候是不区分大小写
◆ 2  表名存储为给定的大小写;比较的时候是小写的
注:Unix、Linux下lower_case_table_names默认值为0;Windows下默认值是1;Mac OS X下默认是2

二、MySQL区分大小写配置

2.1 MySQL5.7及以下版本

(1)异常分析

让我们先来回答背景中的第一个问题,假设MySQL默认是区分大小写的,即小写的表a与大写的表A是完全不同的两个表。那么为了区分表a与表A,两张表的元数据信息肯定是不同的!!!换句话来说,如果表a与表A的元数据完全相同,那么MySQL靠什么去识别或者区分a与A呢?所以当你去直接修改lower_case_table_names参数的时候,不会报错a表与A表冲突。

进一步思考,不难发现,既然表a与表A的识别元数据不同,如果我们把区分大小写改成不区分大小写,会出现什么问题呢?没错,表a可以被MySQL识别,当MySQL读取表A的时候,会报错表不存在!!!

(2)解决方案

先补充一个知识点:MySQL区分大小写lower_case_table_names参数是一个静态参数,即必须修改配置文件,重启才能生效。那么为了保证我的业务库从区分大小写修改成不区分大小写 后,业务能够稳定运行,需要该怎么做呢?我想你肯定想到了,既然在区分大小写的模式下,a表与A表元数据识别是不同的,那么我把她修改成不区分大小写模式下,MySQL能够识别的不就行了?答案是:对的。

所以,如果你想将区分大小写修改成不区分大小写,必须先将所有大写表或库名全部修改成小写,然后再更改lower_case_table_names参数,即可完美解决问题!!!当然上述案例中的,需要将大A修改成小a之外的任何不重复的字符串即可,因为小a已经存在了。

[mysqld]
lower_case_table_names=1

2.2 MySQL8.0版本

(1)MySQL8.0修改lower_case_table_names

云业务环境中,我们经常会遇到用户直接按照MySQL5.7及以下的方法修改已经完成初始化的MySQL8.0的lower_case_table_names参数,最终导致云数据库启动失败!!!下面就让我们一起来谈讨分析一下~

(2)异常分析

通过对官网文档的翻阅,不难发现MySQL8.0安装初始化之后是不支持更改lower_case_table_names参数的,官网介绍是:In MySQL 8.0, the lower_case_table_names variable can only be configured when the MySQL server is initialized.

官网参考链接:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html

MySQL区分大小写参数配置(图1)

(3)解决方案

解决方案:在初始化的时候就要配置好lower_case_table_names这个变量的值!!!这样初始化完成后,lower_case_table_names值就是你定义的默认值!!!

[mysqld]
lower_case_table_names=1

注:如上述初始化之前,固化配置文件lower_case_table_names参数值!!!

作者:UStarGao
链接:https://www.starcto.com/mysql/256.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`