MySQL中的校对集/大小写敏感/sql_mode实践

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL中的校对集/大小写敏感/sql_mode实践

校对集:数据比较方式。必须在无数据前进行声明,如果有了数据再进行数据修改,那么修改无效!

主要使用的有如下格式:

  • _bin:binary,二进制比较,取出二进制位,一位一位进行比较,区分大小写;
  • _cs:case sensitive,大小写敏感,区分大小写
  • _ci:case insensitive,大小写不敏感,不区分大小写。
  • _ai:accent insensitive,不区分重音;
  • _as:accent sensitive,区分重音;

【1】查看数据库所支持的校对集

show collation




20170507111636660.png

【2】对比不同校对集的效果

对比:使用utf8的_bin and _ci来验证不同校对集的效果;

① 创建两张使用不同校对集的表

CREATE TABLE `my_collate_bin` (
  `name` char(1) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
CREATE TABLE `my_collate_ci` (
  `name` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

② 分别插入数据

insert into my_collate_bin VALUES('a','A','B','b');
insert into my_collate_ci VALUES('a','A','B','b');

③ 比较

根据某个字段进行排序-order by 字段名[asc||desc] ;

select * from my_collate_bin ORDER BY name;
select * from my_collate_ci ORDER BY name;

20170507114120382.png

20170507114128194.png

可以看到图一是正常排序,图二未区分大小写(一般应用中,默认不区分大小写,使用utf8_general_ci)。


utf8_unicode_ci utf8_general_ci区别


二者对中文、英文来说没有实质区别。utf8_general_ci 校对速度快,但准确度稍差。utf8_unicode_ci 准确度高,但校对速度稍慢。一般情况下,用utf8_general_ci 就够了,但如果应用有德语、法语或者俄语,请一定使用utf8_unicode_ci 。

【3】大小写敏感

我们顺带说一下MySQL大小写敏感问题。主要涉及到环境变量:lower_case_table_names

show variables like '%lower_case_table_names%'


取值有三个:

  • 0:大小写敏感;
  • 1:大小写不敏感。创建的表、数据库都是以小写形式存放在磁盘上,对于SQL语句都是转换为小写对表和数据库进行查找。
  • 创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行。

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

  • 数据库名、表名、表的别名、变量名是严格区分大小写的;
  • 关键字、函数名称在SQL中不区分大小写;
  • 列名与列的别名在所有的情况下都是忽略大小写的;

MySQL在window环境下全部不区分大小写。

如果Linux下想要设置大小写不敏感,那么需要在my.cnf文件中[mysqld]下添加如下配置:

lower_case_table_names=1

然后重启数据库服务,切记在重启数据库实例之前需要将原来的数据库和表转换为小写,否则将找不到数据库名。

这种操作适合于MySQL5.7不适合MySQL8。在MySQL8下禁止在重新启动MySQL服务时将 lower_case_table_names 修改为不同于初始化MySQL服务时设置的 lower_case_table_names 值。如果非要将MySQL8设置为大小写不敏感,具体步骤如下:

  • 停止MySQL服务;
  • 删除数据目录,通常删除 /var/lib/mysql
  • my.cnf文件中添加 lower_case_table_names=1
  • 重新启动MySQL服务

【4】sql_mode

sql_mode会影响MySQL支持的SQL语法以及它执行的数据验证检查。通过设置sql_mode 可以完成不同严格程度的数据校验,有效地保障数据准确性。


MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。

MySQL5.6和MySQL5.7默认的sql_mode模式参数是不一样的:

  • 5.6的sql_mode默认为空,即NO_ENGINE_SUBSTITUTION。其实表示的是一个空值,相当于没有什么模式设置,可以理解为宽松模式。在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。
  • 5.7的sql_mode是STRICT_TRANS_TABLES,也就是严格模式。用于进行数据的严格校验,错误数据不能插入,将会报error错误并产生回滚。

查看当前会话的sql_mode

select @@session.sql_mode;
select @@global.sql_mode;

临时设置sql_mode

# 当前会话
set session sql_mode='STRICT_TRANS_TABLES';
# 全局
set global sql_mode='STRICT_TRANS_TABLES';

永久设置sql_mode

同样是修改mysql的配置文件,在[mysqld]下增加配置:

sql_mode=STRICT_TRANS_TABLES

针对生产环境禁止重启MySQL服务,所以解决措施通常是临时方式+永久方式来解决线上问题,这样即使某天MySQL服务重启了,我们的配置仍然生效。

image.png



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
mysql 简单的sql语句,入门级增删改查
介绍MySQL中的基本SQL语句,包括数据的增删改查操作,使用示例和简单的数据表进行演示。
mysql 简单的sql语句,入门级增删改查
|
15天前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
21天前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
168 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
21天前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
14天前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
35 7
|
11天前
|
关系型数据库 MySQL Unix
MySQL配置不区分大小写的方法
结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
31 3
|
20天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
30 2
|
23天前
|
SQL 关系型数据库 MySQL
SQL和MySQL
SQL和MySQL
37 1
|
5天前
|
SQL 存储 缓存
MySQL 是怎么执行 SQL 语句的?
MySQL 是怎么执行 SQL 语句的?
10 0
|
8天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")

热门文章

最新文章

下一篇
无影云桌面