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

东方建设集团有限公司网站教育培训学校

东方建设集团有限公司网站,教育培训学校,吉林省城乡建设委员会网站,怎么样可以建设网站目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读: 数据库中增…

目录

  • 前言
  • 1. 基本知识
  • 2. Demo讲解
    • 2.1 ONLY_FULL_GROUP_BY
    • 2.2 STRICT_TRANS_TABLES
    • 2.3 NO_ZERO_IN_DATE
    • 2.4 NO_ENGINE_SUBSTITUTION
    • 2.5 ANSI_QUOTES

前言

了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维

对于基本的命令行以及优化推荐阅读:

  1. 数据库中增删改常用语法语句(全)
  2. Mysql优化高级篇(全)

1. 基本知识

SQL_MODE 是 MySQL 中用于设置 SQL 语法和行为的系统变量

控制 MySQL 的 SQL 解析和执行的方式,使其与 SQL 标准或其他数据库系统的行为一致
通过设置 SQL_MODE,可以改变 MySQL 处理特定 SQL 操作的方式

  • MySQL 5.7
    默认 SQL_MODE 包括:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION

  • MySQL 8.0
    默认 SQL_MODE 包括:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION

相比之下,MySQL 8.0 中没有太大变化,但 NO_AUTO_CREATE_USER 被移除了,因为 MySQL 8.0 取消了自动创建用户的特性

2. Demo讲解

常见的 SQL_MODE 设置和示例,以帮助理解其影响

2.1 ONLY_FULL_GROUP_BY

控制对于 GROUP BY 子句的处理方式
在默认情况下,MySQL 允许在 SELECT 查询中使用 GROUP BY 子句时,对于不在 GROUP BY 子句中的非聚合列进行隐式处理,可能导致意外的结果

ONLY_FULL_GROUP_BY 关闭的情况下,MySQL可能会随意选择一行来代表每个分组,而不是严格按照 SQL 标准进行操作,如下:

 this is incompatible with sql_mode=only_full_group_by

截图如下:

在这里插入图片描述

对此设置为ONLY_FULL_GROUP_BY 模式

-- 开启 ONLY_FULL_GROUP_BY 模式
SET sql_mode = 'ONLY_FULL_GROUP_BY';-- 查询每个学生的平均成绩
SELECT name, AVG(salary) AS avg_salary FROM employees GROUP BY name;

在这里插入图片描述

2.2 STRICT_TRANS_TABLES

STRICT_TRANS_TABLES 模式下,如果插入的数据有问题(如超出字段长度或类型不匹配),MySQL 会报错并回滚事务

-- 设置 SQL_MODE 为 STRICT_TRANS_TABLES
SET sql_mode = 'STRICT_TRANS_TABLES';-- 创建表
CREATE TABLE demo_strict (id INT,name VARCHAR(5)
);-- 尝试插入超长数据
INSERT INTO demo_strict VALUES (1, 'TooLongName');

执行结果下:

INSERT INTO demo_strict VALUES (1, 'TooLongName');
[Err] 1406 - Data too long for column 'name' at row 1

截图如下:

在这里插入图片描述

2.3 NO_ZERO_IN_DATE

-- 设置 SQL_MODE 为 NO_ZERO_IN_DATE, NO_ZERO_DATE
SET sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE';-- 创建表
CREATE TABLE demo_date (id INT,date_field DATE
);-- 尝试插入无效日期
INSERT INTO demo_date VALUES (1, '2020-00-00');

但在执行的过程中是可以成功的,但查询的时候日期显示未0000-00-00
为了避免这种插入无效日期,应该更改为:

-- 确保启用严格模式和日期模式
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE';-- 创建表
CREATE TABLE demo_date (id INT,date_field DATE
);-- 尝试插入无效日期
INSERT INTO demo_date VALUES (1, '2020-00-00');

最终结果如下:

[Err] 1292 - Incorrect date value: '2020-00-00' for column 'date_field' at row 1

截图如下:

在这里插入图片描述
确保输出包含 STRICT_TRANS_TABLES 和日期相关的模式:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,...

2.4 NO_ENGINE_SUBSTITUTION

指定的存储引擎不可用,则会报错,而不是使用默认的存储引擎

-- 设置 SQL_MODE 为 NO_ENGINE_SUBSTITUTION
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';-- 尝试创建不存在的存储引擎的表
CREATE TABLE demo_engine (id INT
) ENGINE=NON_EXISTENT_ENGINE;

报错结果如下:[Err] 1286 - Unknown storage engine 'NON_EXISTENT_ENGINE'

截图如下:

在这里插入图片描述

2.5 ANSI_QUOTES

双引号用于标识符,而不是字符串

-- 设置 SQL_MODE 为 ANSI_QUOTES
SET sql_mode = 'ANSI_QUOTES';-- 尝试使用双引号作为标识符
CREATE TABLE "demo_quotes" ("id" INT,"name" VARCHAR(50)
);-- 插入数据
INSERT INTO "demo_quotes" ("id", "name") VALUES (1, 'John Doe');

截图如下:

在这里插入图片描述

成功插入

http://www.hkea.cn/news/526052/

相关文章:

  • 网站没有被百度收录搜索引擎排名优化公司
  • 手机网站转换小程序晋江怎么交换友情链接
  • 专业做网站的公司疫情放开最新消息今天
  • 不用写代码做网站软件长沙优化网站
  • o2o商城网站建设方案广告策划案优秀案例
  • 日照做网站的那家做的好百度网页链接
  • 建设云个人证件查询系统上海seo培训
  • 网站流量提供商杭州seo排名
  • 做装饰工程的在什么网站投标自建站
  • 地球人--一家只做信誉的网站帮忙推广的平台
  • 网站建设外包协议天津网站排名提升
  • 邯郸教育行业网站建设百度推广代理商查询
  • 政府网站有哪些网站seo最新优化方法
  • 做广告牌子seo外链工具
  • 微信页面设计网站兰州网络推广技术
  • 上门做网站搜狗站长工具
  • wordpress用户邮箱验证码百度seo搜索引擎优化培训
  • 360极速怎么屏蔽网站新闻热点大事件
  • 购物app开发价格表站长工具seo排名
  • 微餐饮网站建设营销型网站建设方案
  • 高端网站建设公司好不好2020国内搜索引擎排行榜
  • 网站建设服务公司选哪家比较好?苏州优化收费
  • 中国建设银行河南省分行网站推广信息哪个平台好
  • 网站建设官网免费模板杭州seo优化
  • 绍兴网站建设谷歌搜索引擎在线
  • 网站的会员认证怎么做黑龙江新闻头条最新消息
  • 做网站如何分工百度推广登录平台客服
  • 网站建设如何提案万网域名注册信息查询
  • 创意二维码制作网站企业网络营销推广案例
  • 论坛型网站怎么做百度高级检索入口