MySQL 大小写问题

场景

在做mysql 查询的时候,注意到一个问题,mysql 默认是不区分大小写的
通过简单的查询,发现
通过关键字 binary 可以强制区分大小写
参考每日所得-- 分页查询优化 和 mysql 区分大小写问题

那为什么MySQL不区分大小写呢
参考文档 mysql 不区分大小写 技术原理

文章总结

1、是否区分是 取决于 字符集和校对(Collation)部分 所做的工作
2、取决于字符集中是否声明了大小写敏感

声明之后,开销增加
参考 https://www.cnblogs.com/niuben/p/11250247.html

配置参数

Mysql中控制数据库名和表名的大小写敏感由参数lower_case_table_names控制
在这里插入图片描述

lower_case_file_system

此变量描述数据目录所在的文件系统上文件名的区分大小写。 OFF表示文件名区分大小写,ON表示它们不区分大小写。此变量是只读的,因为它反映了文件系统属性并设置它对文件系统没有影响。

lowercasetable_names

该参数为静态,可设置为0、1、2。

0 --大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm。 SQL语句也会原样解析。

1 --大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。

2 --大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上。 但SQL语句将库表名转换成小写

On Windows the default value is 1. On macOS, the default value is 2. On Linux, a value of 2 is not supported; the server forces the value to 0 instead.

在Windows上,默认值为1。在macOS上,默认值为2。在Linux上不支持值2;服务器强制该值为0。

并且官网也提示说:如果在数据目录驻留在不区分大小写的文件系统(例如Windows或macOS)上的系统上运行MySQL,则不应将lowercasetable_names设置为0。

### MySQL 大小写敏感性配置及规则 在 MySQL 中,大小写敏感性涉及多个方面,包括数据库名、表名、字段名以及字段值等。以下是对这些方面的详细说明和相关配置。 #### 1. 数据库名和表名的大小写敏感性 数据库名和表名的大小写敏感性主要由操作系统的文件系统特性以及 MySQL 的配置参数 `lower_case_table_names` 决定[^1]。 - 在 Windows 系统上,默认情况下,文件系统是大小写不敏感的,因此数据库名和表名也是大小写不敏感的。 - 在 Linux 或 macOS 系统上,默认情况下,文件系统是大小写敏感的,但可以通过设置 `lower_case_table_names` 参数来改变这一行为。 `lower_case_table_names` 参数有以下三种可能的值: - **0**:表名存储时区分大小写,比较时也区分大小写(适用于大小写敏感的文件系统)。 - **1**:表名存储时转换为小写,比较时不区分大小写(适用于大小写不敏感的文件系统)。 - **2**:表名按指定的大小写存储,但比较时转换为小写(适用于混合文件系统)[^3]。 #### 2. 字段名的大小写敏感性 字段名在 MySQL 中是大小写不敏感的。这意味着无论字段名是以大写还是小写形式定义,查询时都可以使用任意大小写形式访问该字段。 #### 3. 字段值的大小写敏感性 字段值的大小写敏感性取决于字符集及其排序规则(collation)。例如,对于字符串类型的字段,如果使用的排序规则是大小写敏感的,则查询时会区分大小写;否则不会区分大小写。 常见的字符集和排序规则包括: - **utf8_general_ci**:大小写不敏感(ci 表示 case-insensitive)。 - **utf8_bin**:大小写敏感,并且二进制比较。 - **utf8mb4_general_ci**:大小写不敏感。 - **utf8mb4_bin**:大小写敏感。 可以通过以下方式查看或修改字段的排序规则: ```sql -- 查看字段的排序规则 SHOW FULL COLUMNS FROM your_table; -- 修改字段的排序规则 ALTER TABLE your_table MODIFY your_column VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin; ``` #### 4. 配置文件中的相关设置 MySQL大小写敏感性可以通过配置文件(如 `my.cnf` 或 `my.ini`)进行全局设置。关键参数包括: - **lower_case_table_names**:控制数据库名和表名的大小写敏感性。 - **default-character-set** 和 **collation-server**:控制默认字符集和排序规则。 配置示例: ```ini [mysqld] lower_case_table_names=1 default-character-set=utf8mb4 collation-server=utf8mb4_general_ci ``` #### 5. 示例代码 以下是一个简单的示例,展示如何创建表并设置字段的排序规则: ```sql CREATE TABLE example ( id INT PRIMARY KEY, name VARCHAR(50) COLLATE utf8mb4_bin -- 大小写敏感 ); -- 插入数据 INSERT INTO example (id, name) VALUES (1, 'Test'); -- 查询区分大小写 SELECT * FROM example WHERE name = 'test'; -- 返回空结果 SELECT * FROM example WHERE name = 'Test'; -- 返回一行结果 ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值