ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL大小写敏感、MySQL设置字段大小写敏感 [打印本页]

作者: 熊熊出没    时间: 2024-6-13 22:16
标题: MySQL大小写敏感、MySQL设置字段大小写敏感
以下内容基于Mysql:8.0.20进行讲解。
所谓的大小写敏感指的是指的是大写与小写是两个两个值,而大小写不敏感指的是小写跟大写看做是一个值。
一、MySQL大小写敏感规则

Linux下:

Windows下:

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

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

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

lower_case_table_names:

在大小写不敏感的操作体系(Windows和macOS)中,不能将lower_case_table_names设置为0。假如需要在这些体系中设置大小写敏感,可以通过修改配置文件my.ini来更改lower_case_table_names的值。例如,在Windows下,可以将lower_case_table_names设置为2,并重启MySQL服务。
在创建表时,可以通过设置字段属性binary或使用collate规则来控制字段内容的大小写敏感性。例如,将字段标记为binary或设置collate为utf8_bin可以实现二进制大小写敏感。假如建表时未指定collate规则,也可以通过修改字段的collate属性来实现大小写敏感。
总结如下:

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

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

可以通过 show variables like “%case%”; 检察当前Mysql关于大小写的设置,下面是我再Windows下执行的结果

根据上面对lower_case_table_names属性的讲解,我们发现windows中的值为1不区分大小写,而且创建的表名在数据库中是以小写存储的。
lower_case_file_system
该参数是用于描述mysql的数据目录data地点的操作体系是否为大小写敏感,该参数为boolean类型,但无法修改。

比如跑在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
  1. vim /etc/my.cnf
  2. [mysqld]
  3. basedir=/usr/local/mysql                         #  基本路径
  4. datadir=/usr/local/mysql/data                   #数据路径 (先在/usr/local/mysql建data目录)
  5. socket=/usr/local/mysql/data/mysql.sock         # socket文件
  6. symbolic-links=0
  7. log-error=/usr/local/mysql/data/mysqld.log      #错误日志
  8. pid-file=/usr/local/mysql/data/mysqld.pid       #pid文件
  9. **lower_case_table_names = 1**  **#添加这行**
  10. [mysql]
  11. socket=/usr/local/mysql/data/mysql.sock
  12. [mysqldump]
  13. socket=/usr/local/mysql/data/mysql.sock
复制代码
(3)执行初始化命令
  1. /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --lower-case-table-names=1
复制代码
(4)检查变量的值
跳过授权表启动
  1. mysqld_safe  --defaults-file=/etc/my.cnf  --skip-grant-tables &
复制代码
免密登录
  1. mysql -uroot -p 不需要输入密码直接回车
  2. show variables like '%lower_case_table_names%';
复制代码
三、MySQL列名大小写不敏感

列名与列的别名在全部的环境下均是忽略大小写的 ,不管是Linux体系还是Windows体系下MySQL的列名都默认不区分大小写.
该测试在Windows下测试(配置为默认配置)

四、lower_case_table_name与校对规则


MySQL常用排序规则有:utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
   _bin : 按二进制方式比较字符串,区分大小写和重音符号。
_ai_ci:按照特定语言或地区方式比较字符串,不区分大小写和重音符号。
_unicode_ci: 按 Unicode 标准方式比较字符串,不区分大小写和重音符号。
_general_ci:按一样平常方式比较字符串,不区分大小写和重音符号。
  
关于校对规则参考另一篇文章《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、验证校对规则影响大小写敏感

  1. 建表:
  2. create table test1(name varchar(100), primary key(name));
  3. create table test2(name varchar(100), primary key(name)) collate utf8_bin;   
  4. 给表test1插入数据:
  5. insert into test1(name) values('abc');
  6. insert into test1(name) values('ABD');
  7. insert into test1(name) values('ZBC');
  8. 给表test2插入数据:
  9. insert into test2(name) values('abc');
  10. insert into test2(name) values('ABD');
  11. insert into test2(name) values('ZBC');
  12. 查表:
  13. select * from test1 where name like 'a%';
  14. select * from test2 where name like 'a%';
复制代码

可以看出表1大小写不敏感,所以查询时包罗a与A的都能查询出来;表2大小写敏感,所以只能查询出a的。
4.1、验证校对规则影响排序

  1. 查表:
  2. select * from test1;
  3. select * from test2 ;
复制代码

可以看出区分大小写之后,双方的排序规则也不一样了。
五、设置字段内容大小写敏感

   不管是windows还是Linux体系,mysql在任何体系上字符串内容默认是不区分大小写的。若想要字段内容区分大小写,可以设置字段编码大小写敏感。
  5.1、检察和修改某个表的编码集

检察
  1. show  create table  表名;
  2. 或者
  3. show table status from <数据库名/schema> like '<表名>';
  4. 示例:show table status from test  like 'tbl_test';
复制代码
修改
  1. alter table 表名  character set  编码格式  collate    utf8_general_ci(编码规则);
复制代码
如下sql:
  1. drop table if exists tbl_test;
  2. create table tbl_test(
  3.         id int primary key auto_increment,
  4.         name varchar(30) CHARACTER SET utf8 COLLATE utf8_bin unique not null,
  5.         age int comment '年龄',
  6.         address varchar(50) comment '住址',
  7.         update_time datetime default null
  8. ) comment '测试表';
  9. -- 查询建表ddl语句
  10. show create table  tbl_test;
复制代码

COLLATE后缀含义:

所以上面这个表团体字段的默认编码是utf8mb4_0900_ai_ci不区分大小写,但是其中的name字段编码为utf8mb3_bin区分大小写。
mysql中的编码参考另一篇文章《MySQL字符集、字符编码、排序规则、MySQL设置字符编码、设置表字段编码》
5.2、检察和修改某个字段的编码集

检察
  1. 方式一:
  2. show create table  表名;
  3. 示例见上面的图片
  4. 方式二:
  5. show full  columns  from 表名 where field='字段名'
  6. 例:show full  columns from  tb  where  field='id'
复制代码
修改
  1. alter table 表名   modify  字段名  字段数据类型  character set 字符编码 not null;
  2. 例: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字段大小写敏感
  1. drop table if exists tbl_test;
  2. create table tbl_test(
  3.         id int primary key auto_increment,
  4.         name varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin unique not null,
  5.         age int comment '年龄',
  6.         address varchar(50) comment '住址',
  7.         update_time datetime default null
  8. ) comment '测试表';
复制代码

方式二:建表后修改字段大小写敏感
  1. alter table 表名   modify  字段名  字段数据类型  character set 字符编码 not null;
  2. 示例: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的含义和由来》




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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4