当前位置: 首页 > news >正文

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录
  • 一、MySQL大小写敏感规则
  • 二、设置数据库及表名大小写敏感
    • 2.1、查询库名及表名是否大小写敏感
    • 2.2、修改库名及表名大小写敏感
  • 三、MySQL列名大小写不敏感
  • 四、lower_case_table_name与校对规则
    • 4.1、验证校对规则影响大小写敏感
    • 4.1、验证校对规则影响排序
  • 五、设置字段内容大小写敏感
    • 5.1、查看和修改某个表的编码集
    • 5.2、查看和修改某个字段的编码集
    • 5.3、设置字段大小写敏感
    • 5.4、查询时设置字段大小写敏感/不敏感

以下内容基于Mysql:8.0.20进行讲解。

所谓的大小写敏感指的是指的是大写与小写是两个两个值,而大小写不敏感指的是小写跟大写看做是一个值。

一、MySQL大小写敏感规则

Linux下:

  • 数据库名与表名是严格区分大小写的;
  • 表的别名是严格区分大小写的;
  • 列名与列的别名在所有的情况下均是忽略大小写的;
  • 变量名也是严格区分大小写的;

Windows下:

  • 都不区分大小写。

Mac OS下,文件系统类型HFS+,非UFS卷:

  • 都不区分大小写。

MySQL中控制数据库名和表名的大小写敏感由参数lower_case_table_names控制,为0时表示区分大小写,为1时,表示将名字转化为小写后存储,不区分大小写。在不同的操作系统上,这个参数的默认值不同:

  • Unix(包括Linux)下,默认值为0,表示对数据库名和表名的大小写是敏感的。
  • Windows下,默认值为1,表示不敏感,即在存储和查找时会将名称转换为小写。
  • macOS下,默认值为2,表示存储区分大小写,但在查询时会转换为小写。

官网介绍:https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html
在这里插入图片描述

lower_case_table_names:

  • 0: 使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母在硬盘上保存表名和数据库名。名称比较对大小写敏感。在大小写不敏感的操作系统如windows或Mac OS x上我们不能将该参数设为0,如果在大小写不敏感的文件系统上将此参数强制设为0,并且使用不同的大小写访问MyISAM表名,可能会导致索引破坏。

  • 1: 表名在硬盘上以小写保存,名称比较对大小写不敏感。MySQL将所有表名转换为小写在存储和查找表上。该行为也适合数据库名和表的别名。该值为Windows的默认值。

  • 2: 表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母进行保存,但MySQL将它们转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注释:只在对大小写不敏感的文件系统上适用innodb表名用小写保存。

在大小写不敏感的操作系统(Windows和macOS)中,不能将lower_case_table_names设置为0。如果需要在这些系统中设置大小写敏感,可以通过修改配置文件my.ini来更改lower_case_table_names的值。例如,在Windows下,可以将lower_case_table_names设置为2,并重启MySQL服务。

在创建表时,可以通过设置字段属性binary或使用collate规则来控制字段内容的大小写敏感性。例如,将字段标记为binary或设置collateutf8_bin可以实现二进制大小写敏感。如果建表时未指定collate规则,也可以通过修改字段的collate属性来实现大小写敏感。

总结如下:

  • 在Unix系统中,数据库名和表名的大小写是敏感的。
  • 在Windows系统中,数据库名和表名的大小写不敏感,存储和查找时会转换为小写。
  • 在macOS系统中,数据库名和表名的大小写是敏感的,但在查询时会转换为小写。
  • 在大小写不敏感的系统中(Windows和macOS),不能将lower_case_table_names设置为0。
  • 可以通过修改配置文件或设置字段属性来控制大小写敏感性。

二、设置数据库及表名大小写敏感

2.1、查询库名及表名是否大小写敏感

可以通过 show variables like “%case%”; 查看当前Mysql关于大小写的设置,下面是我再Windows下执行的结果
在这里插入图片描述
根据上面对lower_case_table_names属性的讲解,我们发现windows中的值为1不区分大小写,而且创建的表名在数据库中是以小写存储的。

lower_case_file_system
该参数是用于描述mysql的数据目录data所在的操作系统是否为大小写敏感,该参数为boolean类型,但无法修改。

  • 0 – 大小写敏感
  • 1 – 大小写不敏感

比如跑在linux上的都是OFF或者0。

Linux默认参数结果:
在这里插入图片描述

2.2、修改库名及表名大小写敏感

mysql8.0更改lower_case_table_names

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.

解决方法:
方法一:在初始化的时候就要设置好这个变量的值
方法二:删除数据目录,重新初始化(执行命令前切记先备份好数据,此方法并没有亲自试验过,切记慎重使用)
(1)删除数据目录datadir=/usr/local/mysql/data

-- 切记先备份好数据
rm -rf /usr/local/mysql/data

(2)在配置文件中[mysqld]下添加lower_case_table_names = 1

vim /etc/my.cnf[mysqld]
basedir=/usr/local/mysql                         #  基本路径
datadir=/usr/local/mysql/data                   #数据路径 (先在/usr/local/mysql建data目录)
socket=/usr/local/mysql/data/mysql.sock         # socket文件
symbolic-links=0
log-error=/usr/local/mysql/data/mysqld.log      #错误日志
pid-file=/usr/local/mysql/data/mysqld.pid       #pid文件
**lower_case_table_names = 1**  **#添加这行**[mysql]
socket=/usr/local/mysql/data/mysql.sock
[mysqldump]
socket=/usr/local/mysql/data/mysql.sock

(3)执行初始化命令

/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --lower-case-table-names=1

(4)检查变量的值
跳过授权表启动

mysqld_safe  --defaults-file=/etc/my.cnf  --skip-grant-tables & 

免密登录

mysql -uroot -p 不需要输入密码直接回车show variables like '%lower_case_table_names%';

三、MySQL列名大小写不敏感

列名与列的别名在所有的情况下均是忽略大小写的 ,不管是Linux系统还是Windows系统下MySQL的列名都默认不区分大小写.
该测试在Windows下测试(配置为默认配置)
在这里插入图片描述

四、lower_case_table_name与校对规则

  • lower_case_table_name: 影响大小写敏感包括库名、表名、表别名等。
  • 校对规则(COLLATE):影响字段内容大小写敏感及排序规则。

MySQL常用排序规则有:utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci

_bin : 按二进制方式比较字符串,区分大小写和重音符号。
_ai_ci:按照特定语言或地区方式比较字符串,不区分大小写和重音符号。
_unicode_ci: 按 Unicode 标准方式比较字符串,不区分大小写和重音符号。
_general_ci:按一般方式比较字符串,不区分大小写和重音符号。

  • bin:binary case sensitive ,binary 以二进制方式,区分大小写
  • ci:即case insensitive,不区分大小写,即排序时 p 和 P相同 。
  • cs:case sensitive 区分大小写
  • ai: accent insensitive,指口音不敏感,不区分重音,即排序时 e,è,é,ê 和 相同。
  • as:accent sensitive,即口音敏感,区分重音,也就是说,排序时 e,è,é,ê 和 互不相同。
  • 0900: 是 Unicode 校对算法版本。

关于校对规则参考另一篇文章《MySQL字符集、字符编码、排序规则、MySQL设置字符编码、设置表字段编码》

大小写是否敏感

库名

表名

表别名

字段名

字段别名

字段内容

变量

lower_case_table_name = 0 utf8_general_ci

lower_case_table_name = 1 utf8_general_ci

lower_case_table_name = 0 utf8_bin

lower_case_table_name = 1 utf8_bin

4.1、验证校对规则影响大小写敏感

建表:
create table test1(name varchar(100), primary key(name));
create table test2(name varchar(100), primary key(name)) collate utf8_bin;   给表test1插入数据:
insert into test1(name) values('abc');
insert into test1(name) values('ABD');
insert into test1(name) values('ZBC');给表test2插入数据:
insert into test2(name) values('abc');
insert into test2(name) values('ABD');
insert into test2(name) values('ZBC');查表:
select * from test1 where name like 'a%';
select * from test2 where name like 'a%';

在这里插入图片描述
可以看出表1大小写不敏感,所以查询时包含a与A的都能查询出来;表2大小写敏感,所以只能查询出a的。

4.1、验证校对规则影响排序

查表:
select * from test1;
select * from test2 ;

在这里插入图片描述
可以看出区分大小写之后,两边的排序规则也不一样了。

五、设置字段内容大小写敏感

不管是windows还是Linux系统,mysql在任何系统上字符串内容默认是不区分大小写的。若想要字段内容区分大小写,可以设置字段编码大小写敏感。

5.1、查看和修改某个表的编码集

查看

show  create table  表名;
或者
show table status from <数据库名/schema> like '<表名>';示例:show table status from test  like 'tbl_test';

修改

alter table 表名  character set  编码格式  collate    utf8_general_ci(编码规则);

如下sql:

drop table if exists tbl_test;
create table tbl_test(id int primary key auto_increment,name varchar(30) CHARACTER SET utf8 COLLATE utf8_bin unique not null,age int comment '年龄',address varchar(50) comment '住址',update_time datetime default null
) comment '测试表';-- 查询建表ddl语句
show create table  tbl_test;

在这里插入图片描述
COLLATE后缀含义:

  • _ci: case insensitive 不区分大小写
  • _cs:case sensitive 区分大小写
  • _ai: accent insensitive 不区分重音
  • _as: accent sensitive 区分重音
  • _bin:binary case sensitive collation,binary 以二进制方式,区分大小写

所以上面这个表整体字段的默认编码是utf8mb4_0900_ai_ci不区分大小写,但是其中的name字段编码为utf8mb3_bin区分大小写。

mysql中的编码参考另一篇文章《MySQL字符集、字符编码、排序规则、MySQL设置字符编码、设置表字段编码》

5.2、查看和修改某个字段的编码集

查看

方式一:
show create table  表名;
示例见上面的图片方式二:
show full  columns  from 表名 where field='字段名'例:show full  columns from  tb  where  field='id'

修改

alter table 表名   modify  字段名  字段数据类型  character set 字符编码 not null;例:alter table  tb  modify  name varchar(10)  character  set  utf8  not null;

在这里插入图片描述

5.3、设置字段大小写敏感

大小写敏感就是大写的A与小写的a是两个值,通过A查询时只能查询出A而不能查询出a。

从上面4.1、4.2中我们也可以看出如何设置大小写敏感了,这里再总结一下。

方式一:建表时设置字段大小写敏感
如下sql: 设置name字段大小写敏感

drop table if exists tbl_test;
create table tbl_test(id int primary key auto_increment,name varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin unique not null,age int comment '年龄',address varchar(50) comment '住址',update_time datetime default null
) comment '测试表';

在这里插入图片描述
方式二:建表后修改字段大小写敏感

alter table 表名   modify  字段名  字段数据类型  character set 字符编码 not null;示例:alter table tbl_test   modify  name varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin unique not null;

这里的字符编码用了utf8mb3_bin,还有一种编码是utf8mb4_bin,具体区别在哪里可以参考文章《 MYSQL(8.0版本及以上)- utf8,utf8mb3和utf8mb4的含义和由来》

5.4、查询时设置字段大小写敏感/不敏感

方式一:查询时设置字段编码为敏感

SELECT * FROM test1 WHERE name like '%B%' COLLATE utf8mb4_bin;

方式二:查询时设置字段编码为不敏感

SELECT * FROM test1 WHERE name like '%B%' COLLATE utf8mb4_general_ci;

参考:
官网介绍:https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html

创作不易,欢迎打赏,你的鼓励将是我创作的最大动力。

在这里插入图片描述

相关文章:

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…...

项目搭建:guice,jdbc,maven

当然&#xff0c;以下是一个使用Guice、JDBC和Maven实现接口项目的具体例子。这个项目将展示如何创建一个简单的用户管理应用&#xff0c;包括用户信息的增删改查&#xff08;CRUD&#xff09;操作。 ### 1. Maven pom.xml 文件 首先确保你的pom.xml文件包含必要的依赖&#…...

第四届新生程序设计竞赛正式赛(C语言)

A: HNUCM的学习达人 SQ同学是HNUCM的学习达人&#xff0c;据说他每七天就能够看完一本书&#xff0c;每天看七分之一本书&#xff0c;而且他喜欢看完一本书之后再看另外一本。 现在请你编写一个程序&#xff0c;统计在指定天数中&#xff0c;SQ同学看完了多少本完整的书&#x…...

【分布式知识】Redis6.x新特性了解

文章目录 Redis6.x新特性1. 多线程I/O处理2. 改进的过期算法3. SSL/TLS支持4. ACL&#xff08;访问控制列表&#xff09;5. RESP3协议6. 客户端缓存7. 副本的无盘复制8. 其他改进 Redis配置详解1. 基础配置2. 安全配置3. 持久化配置4. 客户端与连接5. 性能与资源限制6. 其他配置…...

程序员需要具备哪些知识?

程序员需要掌握的知识广泛而深厚&#xff0c;这主要取决于具体从事的领域和技术方向。不过&#xff0c;有些核心知识是共通的&#xff0c;就像建房子的地基一样&#xff0c;下面来讲讲这些关键领域&#xff1a; 1. 编程语言&#xff1a; 无论你是搞前端、后端、移动开发还是嵌…...

实验四:MyBatis 的关联映射

目录&#xff1a; 一 、实验目的&#xff1a; 熟练掌握实体之间的各种映射关系。 二 、预习要求&#xff1a; 预习数据库原理中所讲过的一对一、一对多和多对多关系 三、实验内容&#xff1a; 1. 查询所有订单信息&#xff0c;关联查询下单用户信息(注意&#xff1a;因为一…...

【Leetcode】189.轮转数组

题目链接&#xff1a; 189.轮转数组 题目描述&#xff1a; 解题思路&#xff1a; 要想实现数组元素向右轮转k个位置&#xff0c;可是将数组三次反转来实现 以 nums [1,2,3,4,5,6,7], k 3 为例&#xff0c;最终要得到[5,6,7,1,2,3,4]: 第一次反转&#xff1a;将整个数组反转…...

【JavaSE】常见面试问题

1. 什么是 Java 中的多态&#xff1f; 多态是 Java 中面向对象的核心特性之一&#xff0c;指的是同一操作作用于不同类型的对象时表现出不同的行为。通过方法重载和方法重写实现。方法重载是同一方法名&#xff0c;根据参数不同做不同处理&#xff0c;属于编译时多态&#xff…...

【超详图文】多少样本量用 t分布 OR 正态分布

文章目录 相关教程相关文献预备知识Lindeberg-Lvy中心极限定理 t分布的来历实验不同分布不同抽样次数的总体分布不同自由度相同参数的t分布&正态分布 作者&#xff1a;小猪快跑 基础数学&计算数学&#xff0c;从事优化领域7年&#xff0c;主要研究方向&#xff1a;MIP求…...

leetcode hot100【Leetcode 416.分割等和子集】java实现

Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums &#xff0c;你需要将该数组分割成两个子集&#xff0c;使得两个子集的元素和相等。如果可以分割&#xff0c;返回 true &#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,…...

《算法导论》英文版前言To the teacher第4段研习录:有答案不让用

【英文版】 Departing from our practice in previous editions of this book, we have made publicly available solutions to some, but by no means all, of the problems and exercises. Our Web site, http://mitpress.mit.edu/algorithms/, links to these solutions. Y…...

Laravel关联模型查询

一&#xff0c;多表关联 文章表articles 和user_id,category_id关联 //with()方法是渴求式加载&#xff0c;缓解了1N的查询问题&#xff0c;仅需11次查询就能解决问题&#xff0c;可以提升查询速度。with部分没有就以null输出&#xff0c;所以可以理解为 多表 left join 查…...

Clickhouse 数据类型

文章目录 字符串类型数值类型日期时间类型枚举类型数组类型元组类型映射类型其它类型 字符串类型 数据类型描述备注String可变长度字符串无长度限制&#xff0c;适用于存储任意字符FixedString固定长度字符串定长字符串&#xff0c;长度在创建时指定&#xff0c;如 FixedStrin…...

物联网智能项目如何实现设备高效互联与数据处理?

一、硬件&#xff08;Hardware&#xff09; 设备互联的基础&#xff0c;涵盖传感器、执行器、网关和边缘计算设备。 传感器与执行器 功能&#xff1a; 采集环境数据&#xff08;如温度、湿度、运动等&#xff09;并执行控制命令。优化方向&#xff1a; 低功耗、高精度传感器以…...

【云服务器】搭建博客服务

未完待续 一、云服务器二、1panel安装及其容器三、Halo博客 一、云服务器 选择了狗云服务器&#xff1a;狗云-高性价比的服务器 安装系统&#xff1a;Ubuntu22.04 前期配置&#xff1a; 修改ssh端口&#xff1a; 二、1panel安装及其容器 三、Halo博客 主题&#xff1a;butt…...

如何抽象策略模式

策略模式是什么 策略设计模式&#xff08;Strategy Pattern&#xff09;是一种面向对象设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…...

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…...

node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie&#xff0c;token&#xff0c;session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤&#xff0c;⽐如⼏万条数据&#xff0c;放在⼀个⻚⾯显⽰的话显然不友好&#xff0c;这时候就需要采⽤分⻚…...

34 基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…...

【Linux】用户操作命令

声明&#xff1a;以下内容均学习自《Linux就该这么学》一书 1、管理员root Linux系统的管理员之所以是root&#xff0c;并不是因为它的名字叫root&#xff0c;而是因为该用户的身份号码UID&#xff08;User IDentification&#xff09;的数值是0。UID相当于身份证号码&#x…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...