MySQL由浅入深-第一部分
关系型数据库
文件方式管理缺陷
数据冗余和不一致性很难得到保证
数据访问困难
数据孤立存在
数据完整性难以保障
操作原子性
并发访问异常
安全性问题
文件分层
表示层:就是一个个文件
逻辑层
文件系统:建立表示层和物理层之间的映射关系。也被称为存储引擎
物理层
元数据
数据:以数据块方式存在
数据组织结构
数据库按照数据组织方式分为三类:层次模型(拥有上下级关系)、网状模型和关系模型。
关系模型分类:
关系模型
实体-关系模型
对象关系模型:基于对象的数据模型
半结构化数据模型:如以xml方式进行标识
关系:即关系代数运算
并集 补集 全集 交集 差集
关系运算
投影:只输出指定属性
选择:只输出条件的行
自然连接:具有相同名字的属性上所有取值相同的行
笛卡尔乘积:速度很慢,应该尽量避免
并:属于集合运算
SQL组成
DML:数据描述语言,增删改查
DDL:DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上,还包括以下:
完整性定义语言
视图定义语言
事物控制
DCL:用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。
使用程序设计语言如何与RDBMS交互?
动态SQL:程序设计语言使用函数(mysql_connect())或方法与RDBMS服务器建立连接,并进行交互;通过建立连接,遵循某种协议向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理,代表如JDBC
嵌入式SQL:与动态SQL类似,其语言必须在程序编译时完全确定下来,代表如ODBC
动态SQL直接发送的是SQL语句,而嵌入式要复杂的多,并不仅仅是SQL语句
关系型数据库分层
表示层:最主要的就是表
逻辑层:也被称为存储引擎,也是将物理层转成表示层
物理层:数据文件。(反而成为文件管理中的表示层)
数据查询和存储过程
存储管理器
权限及完整性管理器
事物管理器
文件管理器
缓冲区管理器:提供一个缓存置换策略,将老的旧的数据块置换出去。当然有些块被称作“被钉住的块”,即为不可置换的块。
查询管理器(主要是将用户的请求提交给存储管理器,来实现真正的数据管理)
DML解释器:理解DML语句
DDL解释器:理解DDL语句
查询执行引擎:理解语句之后,需要执行这个命令
数据库范式
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性
第三范式:属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性
MySQL
特点
属于CS架构,单进程多线程
一个用户请求的所有操作对应一个线程
线程分为守护线程和应用线程
支持长连接和短连接
一个单独语句只能在一颗CPU上运行,所以不能充分发挥SMP的优势,但是我们可以进行分区,把任务分配到多态电脑上。
支持插件式存储引擎,mysql5.5.8以前默认是MyISAM,以后默认是InnoDB
速度快:完全多线程;支持查询缓存
伸缩性
易用性
支持多用户
国际化,支持多种应用程序
MySQL架构
连接管理器:监听用户的请求,并将请求转发给线程管理器
用户模块:主要是用于验证用户身份的,连接时候会使用@用户名
访问控制模块:检验用户客户端是否有权限来执行所请求的操作
解析器:解析查询,并生产解析树。生产完成之后,根据具体类型交给对应的模块
优化器:负责创建响应请求时的最佳查询策略,例如查询路径有3条,优化器会选择代价最小的一条
表管理器:负责创建、读取、修改表定义文件;
1.维护表描述符高速缓存,因为若每次都从磁盘进行读取,速度太慢;
2.管理表锁
表修改/定义模块:表创建、删除、重命名、移除、更新或者插入之类的操作。注意此时不在仅仅是表结构文件了,涉及到数据
表维护模块:检查、修改、备份、恢复、优化(碎片整理)及解析
在这里也给出MySQL官网的一副架构图,原理大同小异
常见概念
文件中记录组织
堆文件组织:一条记录可以放在文件中 的任何地方
顺序文件组织:根据“搜索码”值顺序存放
散列文件组织:
表空间
表空间是数据库的逻辑划分,基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space、segment inode、extent和page.在实现层的逻辑则使用了磁盘链表这种结构来管理逻辑关系。,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中,但主要存放的是表。
数据字典数据字典即关系的元数据:关系名,字段名,字段的类型和长度,视图,约束,用户名字,授权和密码
MySQL服务器变量
作用域
全局变量
show global variables
会话变量:通过客户端连接过去的,会话终止就无效了
show [session可省略] variables
生效时间
注意:
全局:当前会话无效,只对新建会话有效
会话:即时生效,但只对当前会话有效,关闭之后无效
静态的写在配置文件中
通过参数传递给进程
动态调整:即使调整后即时生效
静态调整
MySQL安装与配置
安装
专用软件包管理器包,如rpm包,deb包等
yum -y install mysql-server
yum info mysql
chkconfig mysqld on
service mysqld start
mysql通用二进制格式包:通过gcc或者icc来进行编译
源代码:5.5和5.6之后只支持cmake(cmake跨平台,c表示cross)
以MySQL-5.5为例源码编译安装
第一步:检查是否安装cmake
yum info cmakeyum install -y cmakeyum grouplist:查看安装情况安装开发包:yum groupinstall "Development Tools" "Server Platform Development" -y
第二步:编译时参数介绍
指定安装文件的安装路径时常用的选项:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysql
-DSYSCONFDIR=/etc
默认编译的存储引擎包括:csv、myisam、myisammrg和heap。若要安装其它存储引擎,可以使用类似如下编译选项:
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
若要明确指定不编译某存储引擎,可以使用类似如下的选项:
-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1
比如:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
如若要编译进其它功能,如SSL等,则可使用类似如下选项来实现编译时使用某库或不使用某库:
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
其它常用的选项:
-DMYSQL_TCP_PORT=3306
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DENABLED_LOCAL_INFILE=1
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_DEBUG=0
-DENABLE_PROFILING=1
如果想清理此前的编译所生成的文件,则需要使用如下命令:make cleanrm CMakeCache.txt
第三步:使用cmake编译mysql-5.5
# groupadd -r mysql
# useradd -g mysql -r -d /mydata/data mysql
# tar xf mysql-5.5.33.tar.gz
# cd mysql-5.5.33
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
# make
# make install
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
//源码安装之后相应的设置
# chown -R :mysql----->设置mysql属组为mysql
# scripts/mysql_install_db --user=mysql --datadir=自定义路径
# cp support-files/my-large.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld ---->添加到服务列表中去
# chkconfig --list mysqld----->查看服务
# service mysqld start----->启动服务
//将mysql的命令添加至环境变量
# vim /etc/profile.d/mysql.sh
输入:export $PATH=$PATH:/usr/local/mysql/bin
# ./etc/profile.d/mysql.sh---->执行一下这个脚本
安装后的设定
为所有的root用户设定密码,有三种方式
mysql>set 密码 for 用户名 @主机名=password(新密码),自身会触发重读授权表
mysqladmin命令:mysqladmin -u 用户名 -h 主机名 password 新密码 -p,这里如果之前没有密码则不需要输入。也会触发重读授权表
mysql>update mysql.user set password=PASSWORD('密码') where ...;这种需要手动重读授权表
删除所有的匿名用户
mysql>drop user ''@'localhost"
上述两步可运行命令:mysql_secure_installation
建议关闭主机名反解功能
配置文件中添加skip-name-resolve=ON
建议开启InnoDB每个表一个表文件
配置文件添加
innodb_file_per_table=ON
datadir=xxxx:数据文件
MySQL安装后可能存在的问题
此前服务未关闭
数据初始化失败
数据目录位置错误
数据目录权限问题
配置文件
不同段下作用的范围不一样
[mysqld]
[mysqld_safe]
[server]
[mysqldump]
[client]:对所有客户端都生效
[mysql]:只对mysql生效
查找路径:
Unix系统:/etc/my.cnf--->/etc/mysql/my.cnf--->$MYSQL_HOME/my.cnf--->default-extra-file=....--->~/.my.cnf,后面会覆盖前面,越靠后越是最终生效
Windows系统:%WINDIR%\my.ini--->%WINDIR%\my.cnf--->C:\my.ini--->C:\my.cnf--->%INSTALLDIR%\my.ini--->%INSTALLDIR%\my.cnf--->default-extra-file=....
MySQL通信
客户端与服务端在同一主机上时
Unix:使用域套接字,mysql---> mysql.sock--->mysqld
Window:使用共享内存或者管道,mysql---> memory shared(或者pipe)--->mysqld
客户端与服务端在不同主机上时
基于TCP/IP协议
MySQL命令
服务端命令
服务端必须要以结束符结束,客户端不一定。在mysql语句中默认的是;表示结束,也可以用\d **来定义语句结束符。常常使用help+关键字来获取使用方法
如:help select
客户端命令
常见的命令如下:
\g无论语句结束符是什么,直接将此语句送至服务器端执行。
\G无论语句结束符是什么,直接将此语句送至服务器端执行。且以竖排方式执行,更易看
! COMMAND 执行sh命令
\W:语句执行结束后显示警告信息;
\w:语句执行结束后不显示警告信息;
#:对于新建的对象支持不全的功能。但是需要全部加入内存,造成延迟
客户端命令的可用选项:
-u,--user=
-p,--password=-h,--host=
-P,--port=,连入服务时的端口
--protocol=[tcp|sock|pipe|memory],连接时的协议,后面两个是win上
-S,--sock=,要求客户端和服务器位于同一个主机时,此时通过localhost或者127.0.0.1通信
-D,--database=xxx,指定连接的数据库
-C,--compress=表示对传输的数据需不需要进行压缩
mysql -e "sql指令" Eg:C:\Users\xxxx>mysql -uroot -pEnter password: *****
warning:如果希望每次都不输入密码,此时可以在自己家目录下新建一个隐藏的文件.my.cnf,输入一下内容,以localhost为例,千万不要被别人看到
[client]
user= 'xxxx'
password = 'xxx'
host = 'localhost'
客户端命令选项设置与通信方式组合
protocol是否设置 | socket是否设置 | host是否指定 | port是否指定 | 通信方式 |
---|---|---|---|---|
否 | 否 | 否 | 否 | socket file |
否 | 否 | 否 | 是 | socket file |
TCP | 无论是否设置 | 是 | 是 | TCP |
SOCKET | 是 | 否 | 是 | socket file |
SOCKET | 是 | localhost | 无论是否设置 | socket file |
SOCKET | 是 | 非localhost | 无论是否设置 | ERROR |
否 | 是 | 是 | 是 | TCP/IP(host+port) |
MySQL工具
mysql服务端工具
mysql server/mysqld
mysqld_safe:默认启动就是他
mysqld_multi
mysql 客户端工具:都可以读取配置文件中[client]端参数,也可以后跟客户端命令的可用选项
create
创建数据库,[root@xiaxuefei ~]# mysqladmin create hellodb;
drop
删除数据库,[root@xiaxuefei ~]# mysqladmin drop hellodb;
ping
判断服务器是否在线,[root@xiaxuefei ~]# mysqladmin -uroot -h1.1.1.1 -p ping;也可以看本机的,如[root@xiaxuefei ~]# mysqladmin ping;mysqld is alive
processlist
显示当前mysql正在执行的线程列表,[root@xiaxuefei ~]# mysqladmin processlist;
status
显示mysql状态,[root@xiaxuefei ~]# mysqladmin status;
其中频率相关的
--sleep n,表示ns打印一次
--count c,表示总共显示c次
extended-status
显示状态变量及其结果值
variables:显示服务器变量
flush_priviedges:使得mysqld重读授权表
flush_tables:
flush-status:重置大多数的服务器状态变量
flush-logs:二进制和中继日志滚动
flush-hosts:刷新主机一些变量
refresh:相当于同时执行flush-hosts和flush-logs
shutdown:关闭mysql服务器进程
version:服务器版本以及当前状态信息
start-slave:启动复制,启动从服务器复制数据
SQL thread和IO thread
stop-slave:关闭复制
mysql
mysqldump
mysqladmin
mysqladmin status --sleep 2;
-->[root@xiaxuefei ~]# mysqladmin status --sleep 2;Uptime: 5259 Threads: 1 Questions: 47 Slow queries: 0 Opens: 30 Flush tables: 1 Open tables: 23 Queries per second avg: 0.8Uptime: 5261 Threads: 1 Questions: 47 Slow queries: 0 Opens: 30 Flush tables: 1 Open tables: 23 Queries per second avg: 0.8Uptime: 5263 Threads: 1 Questions: 47 Slow queries: 0 Opens: 30 Flush tables: 1 Open tables: 23 Queries per second avg: 0.8
mysqlcheck
mysqlimport
mysql非客户端工具
myisamchk
myisampack
MySQL使用模式
交互模式
可运行命令有两类:
客户端命令:h,help
服务器端命令:大部分是SQL语句,一般需要语句结束符
脚本模式(批处理模式)
mysql -uUSERNAME -hHOST -pPASSWORD < /path/from/somefile.sql
mysql>source /path/from/somefile.sql,前提是当前用于有权限访问这个目录
MySQL存储引擎
InnoDB
1.处理大量的短期事物。
2.数据存储于"表空间(table space)"中,有两种使用方式:
(1)所有Innodb表的数据放置于同一个表空间中
表空间文件:在datadir定义的目录下
数据文件(存储数据和索引):ibddata1,ibddata2...
(2)每个表单独使用一个表空间存储表的数据和索引(建议使用):
innodb_file_per_table=ON
mysql> show global variables like 'innodb_file%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | OFF |
+--------------------------+----------+
如要长久生效,需要修改配置文件my.cnf
数据文件(存储数据和索引):tbl_name.ibd(表空间,包括数据和索引),tbl_name.frm(表格式定义文件)
opt文件:记录的是该表的一些选项,如字符集和排序规则等
3.基于MVCC来支持高并发、支持所有的四个隔离级别,默认级别为repeatable read(可重读);通过间隙锁防止幻读。
4.使用聚集索引
5.支持预读操作,支持“自适应hash索引”,支持插入缓存
6.支持热备份(在线备份)
7.支持行级锁
MyISAM:
1.支持全文索引
2.支持表压缩
3.支持空间函数
4.不支持事物
5.不支持行级锁,而是表级锁
6.崩溃后无法安全恢复,在MariDB中的Aria,优化了这个
使用场景:只读(或者写比较少)、表较小
文件:每个表都有三个文件
tbl_name.frm:表格式定义文件
tbl_name.MYD:数据文件
tbl_name.MYI:索引文件
其他存储引擎:
CSV:将普通的CSV作为MySQL表使用
MRG_MYISAM:将多个MyISAM表合并尘一个虚拟表
BLACKHOLE:类似/dev/null
MEMORY:所有数据都保存在内存中,唯一支持hash索引,也是表级别锁
PERFORMANCE_SCHEMA:伪存储引擎,记录mysql的内部状态
ARCHIVE:支持select和insert操作,支持行级锁和专用缓冲区
使用show engines来查看,其中XA表示分布式事物
MySQL输出格式
--html或者--xml
数据类型/MySQL
数据类型选择依据
存入的值类型
占据的存储空间
定长or变长
如何比较及排序,是否区分大小写
是否支持索引
常见数据类型
数值类型
-- a. 整型 ----------
类型 字节 范围(有符号位)
tinyint 1字节 -128 ~ 127 无符号位:0 ~ 255
smallint 2字节 -32768 ~ 32767
mediumint 3字节 -8388608 ~ 8388607
int 4字节
bigint 8字节
int(M) M表示总位数
默认存在符号位,unsigned 属性修改
显示宽度,如果某个数不够定义字段时设置的位数,则前面以0补填,zerofill 属性修改
例:int(5) 插入一个数'123',补填后为'00123'
- 在满足要求的情况下,越小越好。
- 1表示bool值真,0表示bool值假。MySQL没有布尔类型,通过整型0和1表示。常用tinyint(1)表示布尔型。
-- b. 浮点型 ----------
类型 字节
float(单精度) 4字节
double(双精度) 8字节
浮点型既支持符号位 unsigned 属性,也支持显示宽度 zerofill 属性。
不同于整型,前后均会补填0.
定义浮点型时,需指定总位数和小数位数。
float(M, D) double(M, D)
M表示总位数,D表示小数位数。
M和D的大小会决定浮点数的范围。不同于整型的固定范围。
M既表示总位数(不包括小数点和正负号),也表示显示宽度(所有显示符号均包括)。
支持科学计数法表示。
浮点数表示近似值。
-- c. 定点数 ----------
decimal -- 可变长度
decimal(M, D) M也表示总位数,D表示小数位数。
保存一个精确的数值,不会发生数据的改变,不同于浮点数的四舍五入。
将浮点数转换为字符串来保存,每9位数字保存为4个字节。
字符串类型
-- a. char, varchar ----------不区分大小写
char 定长字符串,速度快,但浪费空间
varchar 变长字符串,速度慢,但节省空间
M表示能存储的最大长度,此长度是字符数,非字节数。
不同的编码,所占用的空间不同。
char,最多255个字符,与编码无关。
varchar,最多65535字符,与编码有关。一条有效记录最大不能超过65535个字节。
utf8 最大为21844个字符,gbk 最大为32766个字符,latin1 最大为65532个字符 。
而他最大有效长度是65532字节,因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是65535-1-2=65532字节。
例:若一个表定义为 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 问N的最大值是多少?
答:(65535-1-2-4-30*3)/3
varchar 是变长的,需要利用存储空间保存 varchar 的长度,如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存。
varchar 的最大有效长度由最大行大小和使用的字符集确定。
-- b. blob, text ----------
blob 二进制字符串(字节字符串)
tinyblob(255字节,1个字节的额外开销)
blob(64k,2个字节的额外开销)
mediumblob(16M,3个字节的额外开销)
longblob(4G,4个字节的额外开销)
text 非二进制字符串(字符字符串)
tinytext(256bytes)
text(~64kb)
mediumtext(~16MB)
longtext(~4GB)
text 在定义时,不需要定义长度,也不会计算总长度。
text 类型在定义时,不可给default值
-- c. binary, varbinary ----------区分大小写
类似于char和varchar,用于保存二进制字符串,也就是保存字节字符串而非字符字符串。 char, varchar, text 对应 binary, varbinary, blob.
日期时间类型
一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化。
datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59
date 3字节 日期 1000-01-01 到 9999-12-31
timestamp 4字节 时间戳 19700101000000 到 2038-01-19 03:14:07
time 3字节 时间 -838:59:59 到 838:59:59
year 1字节 年份 1901 - 2155
datetime YYYY-MM-DD hh:mm:ss
timestamp YY-MM-DD hh:mm:ss
YYYYMMDDhhmmss
YYMMDDhhmmss
YYYYMMDDhhmmss
YYMMDDhhmmss
date YYYY-MM-DD
YY-MM-DD
YYYYMMDD
YYMMDD
YYYYMMDD
YYMMDD
time hh:mm:ss
hhmmss
hhmmss
year YYYY
YY
枚举和集合
-- 枚举(enum) ----------
enum(val1, val2, val3...)
在已知的值中进行单选。最大数量为65535. 枚举值在保存时,以2个字节的整型(smallint)保存。每个枚举值,按保存的位置顺序,从1开始逐一递增。
表现为字符串类型,存储却是整型。
NULL值的索引是NULL。
空字符串错误值的索引值是0。
-- 集合(set) ----------
set(val1, val2, val3...)
create table tab ( gender set('男', '女', '无') );
insert into tab values ('男, 女');
最多可以有64个不同的成员。以bigint存储,共8个字节。采取位运算的形式。
当创建表时,SET成员值的尾部空格将自动被删除。
SET实际上存储的是位图,如a,b,c,他若存储100,表示只有a;101表示只有a和c,此时不适合创建索引。
数据类型修饰符
字符类型修饰符:
not null:非空
null:
default '值':指明默认值
character set '':使用的字符集
collation:使用的排序规则
整型修饰符:
not null
null
default number
auto_increment:
此时该字段必须满足如下要求:unsigned 整型+primary key/unique key+not null
mysql>select last_insert_id();//查看最后一次auto_increment的值
mysql> use testdb;
Database changed
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.09 sec)
日期修饰类型和内建类型SET和ENUM的修饰符
null not null default
SQL MODE/MySQL
可以简单的理解为:当用户违背mysql的约定时,mysql如何进行处理?例如,某个字段为varchar(3),而用户输入超过了3,此时mysql会如何处理呢?
查询命令
show global variables like 'sql_mode';
Eg:mysql> show global variables like 'sql_mode';
| sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,等等|
修改方式
全局
mysql>set global sql_mode='xxxx';//全局
mysql>set @@global.sql_mode='xxxx';//全局
需要修改权限(root权限),仅对修改后新创建的会话有效,对已经建立的会话无效
会话
mysql>set session sql_mode='xxxx';//会话
mysql>set @@session.sql_mode='xxxx';//会话
举例
mysql> create database mydb;
Query OK, 1 row affected (0.11 sec)
mysql> use mydb;
Database changed
mysql> create table t1(id int unsigned auto_increment primary key not null ,name
char(5) not null);
Query OK, 0 rows affected (1.72 sec)
mysql> insert into t1(name) values('tom'),('Balckberray');
ERROR 1406 (22001): Data too long for column 'name' at row 2
mysql> show error;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'error' at line 1
此时违反规则直接报错
若设置:set sql_mode='NO_AUTO_CREATE_USER';此时只是一个warning