iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的SQL模式介绍
  • 489
分享到

MySQL的SQL模式介绍

2024-04-02 19:04:59 489人浏览 八月长安
摘要

这篇文章主要讲解了“Mysql的sql模式介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的SQL模式介绍”吧! M

这篇文章主要讲解了“Mysqlsql模式介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的SQL模式介绍”吧!

MySQL服务器能够在运行在不同的SQL模式下,并且能在不同客户端下设置不同的SQL模式,可以通过sql_mode系统参数来设定SQL模式。
SQL模式会影响MySQL支持的SQL语法和数据的验证。

MariaDB [test]> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTioN |
+--------------------------------------------+
1 row in set (0.08 sec)

NO_AUTO_CREATE_USER
防止通过GRANT语句创建没有密码的数据库账户。在通过GRANT创建用户时,必须在IDENTIFIED BY后指定非空的密码。建议使用CREATE USER语句创建数据库账户,尽量避免使用GRANT语句来创建数据库账户。

NO_ENGINE_SUBSTITUTION
当执行CREATE TABLE 或 ALTER TABLE语句,指定了一个不支持或没有编译的存储引擎时,控制如何自动替换默认的存储引擎。
当NO_ENGINE_SUBSTITUTION参数没有启用时,对于CREATE TABLE语句,如果指定的存储引擎不可用,会使用默认的存储,且会产生一个警告。对于ALTER TABLE语句,会产生一个警告,且表的存储引擎转化失败。
当NO_ENGINE_SUBSTITUTION参数启用时,如果指定的存储引擎不可用,会发生报错,且表不会创建或更改成功。

--最重要的SQL模式

ANSI
这个模式改变SQL的语法和行为以更接近标准的SQL。

STRICT_TRANS_TABLES
如果值不能插入到事务表中,则退出这条语句;对于非事务表,如果插入或更新的值发生在一行的SQL或多行语句的第一行中,则退出语句。

TRADITIONAL
当插入一个错误的值到一列中时,MySQL会报错而不是警告。


--SQL模式的结合

有一些特殊的SQL模式是一些SQL结合在一起的缩写

例如,ANSI是REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY(MySQL 5.7.5)模式的结合;
DB2是PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS模式的结合。

--严格SQL模式

严格模式控制MySQL如何处理数据改变SQL语句(例如INSERT或UPDATE)中无效或丢失的值。插入或更新的值无效有许多原因,例如,有可能因为字段的数据类型,或值超过了字段的最大范围值。对于一个非空字段,当要插入的一个值为空,且没有默认值,这是值丢失。严格模式也会影响DDL语句,例如CREATE TABLE。

如果严格模式没有生效,对于无效或丢失的值,MySQL会插入调整的值。在严格模式下,可以通过INSERT IGNORE或UPDATE IGNORE语句来跳过错误。

在严格模式下,对于类似SELECT这样不改变数据的语句,无效的值会产生一个警告,而不是错误。在严格模式下,对于插入或更新超过字段最大长度的值,会产生一个错误;而在非严格模式下,会产生一个警告,并将截断后的值插入或更新到表中。

严格模式不会影响是否外键验证。可以通过foreign_key_checks参数来验证外键。

MariaDB [test]> show variables like '%foreign%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| foreign_key_checks | ON    |
+--------------------+-------+
1 row in set (0.00 sec)


--示例①
严格SQL模式

MariaDB [test]> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.08 sec)

MariaDB [test]> create table t (name varchar(20), email varchar(40));
Query OK, 0 rows affected (0.21 sec)

MariaDB [test]> insert into t values('1234567890000000000000000000','fire beijing @ hotmail.com');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select * from t;
+----------------------+----------------------------+
| name                 | email                      |
+----------------------+----------------------------+
| 12345678900000000000 | fire beijing @ hotmail.com |
+----------------------+----------------------------+
1 row in set (0.00 sec)

MariaDB [test]> set session sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select @@sql_mode;
+---------------------+
| @@sql_mode          |
+---------------------+
| STRICT_TRANS_TABLES |
+---------------------+
1 row in set (0.00 sec)

MariaDB [test]> insert into t values('1234567890000000000000000000','fire beijing @ hotmail.com');
ERROR 1406 (22001): Data too long for column 'name' at row 1


--示例②
ANSI模式和传统模式的区别

MariaDB [test]> set session sql_mode='ANSI';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select @@sql_mode;
+-------------------------------------------------------------+
| @@sql_mode                                                  |
+-------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> drop table t;
Query OK, 0 rows affected (0.13 sec)

MariaDB [test]> create table t(d datetime);
Query OK, 0 rows affected (0.21 sec)

MariaDB [test]> insert into t values('2007-04-31');
Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [test]> select * from t;
+---------------------+
| d                   |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)

MariaDB [test]> set session sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select @@sql_mode;
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                           |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> insert into t values('2007-04-31');
ERROR 1292 (22007): Incorrect datetime value: '2007-04-31' for column 'd' at row 1

--示例③
ANSI模式和传统模式的对比

MariaDB [test]> set sql_mode='ANSI';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> drop table t;
Query OK, 0 rows affected (0.11 sec)

MariaDB [test]> create table t(i int);
Query OK, 0 rows affected (0.45 sec)

MariaDB [test]> insert into t values(9%0);
Query OK, 1 row affected (0.08 sec)

MariaDB [test]> select * from t;
+------+
| i    |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

MariaDB [test]> set session sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into t values(9%0);
ERROR 1365 (22012): Division by 0

--示例④
使反斜线称为普通字符

MariaDB [test]> set sql_mode='ansi';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select @@global.sql_mode;
+--------------------------------------------+
| @@global.sql_mode                          |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select @@session.sql_mode;
+-------------------------------------------------------------+
| @@session.sql_mode                                          |
+-------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select @@sql_mode;
+-------------------------------------------------------------+
| @@sql_mode                                                  |
+-------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> drop table t;
Query OK, 0 rows affected (0.14 sec)

MariaDB [test]> create table t (context varchar(20));
Query OK, 0 rows affected (0.17 sec)

MariaDB [test]> insert into t values('\beijing');
Query OK, 1 row affected (0.07 sec)

MariaDB [test]> select * from t;
+---------+
| context |
+---------+
|eijing |
+---------+
1 row in set (0.00 sec)

MariaDB [test]> insert into t values('\\beijing');
Query OK, 1 row affected (0.11 sec)

MariaDB [test]> select * from t;
+----------+
| context  |
+----------+
|eijing  |
| \beijing |
+----------+
2 rows in set (0.00 sec)

MariaDB [test]> set sql_mode='REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI,NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into t values('\\beijing');
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> select * from t;
+-----------+
| context   |
+-----------+
|eijing   |
| \beijing  |
| \\beijing |
+-----------+
3 rows in set (0.00 sec)

--示例⑤
ANSI模式包含了PIPES_AS_CONCAT模式,会将||视为连接操作符

MariaDB [test]> set sql_mode='ansi';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select @@session.sql_mode;
+-------------------------------------------------------------+
| @@session.sql_mode                                          |
+-------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select 'beijing'||'2008';
+-------------------+
| 'beijing'||'2008' |
+-------------------+
| beijing2008       |
+-------------------+
1 row in set (0.00 sec)

MariaDB [test]> set sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select 'beijing'||'2008';
+-------------------+
| 'beijing'||'2008' |
+-------------------+
|                 1 |
+-------------------+
1 row in set, 2 warnings (0.02 sec)

MariaDB [test]> show warnings;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'beijing' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'beijing'  |
+---------+------+----------------------------------------------+
2 rows in set (0.00 sec)

--示例⑥
在将MySQL数据库迁移到其他数据时,可以设置sql_mode为NO_TABLE_OPTIONS模式,这样可以去掉engine关键字

MariaDB [test]> show create table t;
+-------+----------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                 |
+-------+----------------------------------------------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `context` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> set session sql_mode='NO_TABLE_OPTIONS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> show create table t;
+-------+-----------------------------------------------------------+
| Table | Create Table                                              |
+-------+-----------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `context` varchar(20) DEFAULT NULL
) |
+-------+-----------------------------------------------------------+
1 row in set (0.00 sec)

感谢各位的阅读,以上就是“MySQL的SQL模式介绍”的内容了,经过本文的学习后,相信大家对MySQL的SQL模式介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的SQL模式介绍

本文链接: https://www.lsjlt.com/news/59579.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL的SQL模式介绍
    这篇文章主要讲解了“MySQL的SQL模式介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL的SQL模式介绍”吧! M...
    99+
    2024-04-02
  • HBase的安装模式介绍
     单机模式 – HBase 不使用HDFS,仅使用本地文件系统 – ZooKeeper与Hbase运行在同一个JVM中  分布式模式 – 伪分布式模式 所有进程运行在同一个节点上,不同进程运行...
    99+
    2024-04-02
  • Docker的网络模式介绍
    这篇文章主要介绍“Docker的网络模式介绍”,在日常操作中,相信很多人在Docker的网络模式介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker的网络模式介绍”...
    99+
    2024-04-02
  • MySQL特有的SQL语句介绍
    本篇内容介绍了“MySQL特有的SQL语句介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!create语...
    99+
    2024-04-02
  • Redis哨兵模式介绍
    哨兵简介 主机"宕机" 将宕机的 master 下线找一个 slave 作为 master通知所有的 slave 连接新的 master启动新的 master ...
    99+
    2024-04-02
  • Android中的装饰模式介绍
    这篇文章主要讲解了“Android中的装饰模式介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中的装饰模式介绍”吧!前言装饰模式(Decorator Pattern):也可以...
    99+
    2023-06-04
  • JavaScript的适配器模式介绍
    本篇内容介绍了“JavaScript的适配器模式介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!介&nb...
    99+
    2024-04-02
  • JavaScript严格模式usestrict的介绍
    目录1.概述1.1严格模式是什么1.2严格模式的目的2.开启严格模式2.1全局开启严格模式2.2局部开启严格模式3.严格模式中的变量3.1禁止意外创建变量3.2静默失败转为异常3.3...
    99+
    2024-04-02
  • 设计模式和反模式简单介绍
    作为一个资深开发人员,大家都应该听说过设计模式(design pattern),但是不是所有的人都听说过反模式(anti-pattern)。今天我们就来谈谈后者,何为反模式。谈反模式之前当然先要谈谈何为设计模式,因为两者是紧密联系在一起的。...
    99+
    2023-06-03
  • 工厂方法模式介绍
    韩敬海 设计模式(Java版) (一)定义 定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法涉及的角色有: 1 .抽象工厂角色:工厂方法模式的核心,与应用系统无关,任何创建对象的工厂类必...
    99+
    2023-08-30
    工厂方法模式
  • MySQL主从复制之GTID模式详细介绍
    目录一、GTID概述二、GTID相较与传统复制的优势三、GTID自身存在哪些限制四、GTID工作原理简单介绍五、如何开启GTID复制六、查看GTID相关参数七、GTID与传统模式建立...
    99+
    2024-04-02
  • 单例模式的介绍和用法
    本篇内容主要讲解“单例模式的介绍和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“单例模式的介绍和用法”吧!问题1、说说单例模式的特点2、你知道单例模式的具体...
    99+
    2024-04-02
  • JavaScript组合模式的简单介绍
    这篇文章主要介绍“JavaScript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2024-04-02
  • VB.NET窗体编程模式的介绍
    这篇文章主要讲解了“VB.NET窗体编程模式的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VB.NET窗体编程模式的介绍”吧!VB.NET窗体编程模式到现在为止,我们讨论的只是如何创建...
    99+
    2023-06-17
  • java工厂模式的详细介绍
    本篇内容介绍了“java工厂模式的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java设计模式-工厂模式什么是工厂模式?工厂模式(...
    99+
    2023-06-20
  • MySQL ClickHouse不同于SQL的语法介绍
    目录ClickHouse的JOIN逻辑INSERT SELECT临时表窗口函数单引号和双引号下面只展示和mysql或HIVE区别较大的语法 例如ClickHouse建库语法和MySQL几乎1卵样的不予展示 Cli...
    99+
    2024-04-02
  • C++设计模式中的工厂模式详细介绍
    目录1. 简单工厂模式2. 工厂方法模式3. 抽象工厂模式1. 简单工厂模式 简单工厂模式(Simple Factory Pattern): 是指定义一个工厂类,工厂类中实现一个方法...
    99+
    2024-04-02
  • java设计模式中的单例模式简单介绍
    这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑...
    99+
    2023-06-02
  • Javascript发布订阅模式介绍
    发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。 ...
    99+
    2024-04-02
  • Java单例模式简单介绍
    一、概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,...
    99+
    2023-05-31
    java 单例模式 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作