vlambda博客
学习文章列表

MySQL由浅入深-第一部分

关系型数据库

文件方式管理缺陷

  1. 数据冗余和不一致性很难得到保证

  2. 数据访问困难

  3. 数据孤立存在

  4. 数据完整性难以保障

  5. 操作原子性

  6. 并发访问异常

  7. 安全性问题

文件分层

  • 表示层:就是一个个文件

  • 逻辑层

    • 文件系统:建立表示层和物理层之间的映射关系。也被称为存储引擎

  • 物理层

    • 元数据

    • 数据:以数据块方式存在

数据组织结构

数据库按照数据组织方式分为三类:层次模型(拥有上下级关系)、网状模型和关系模型。

关系模型分类:

    关系模型

    实体-关系模型

    对象关系模型:基于对象的数据模型

    半结构化数据模型:如以xml方式进行标识

关系:即关系代数运算

    并集    补集    全集    交集     差集

关系运算

  • 投影:只输出指定属性

  • 选择:只输出条件的行

  • 自然连接:具有相同名字的属性上所有取值相同的行

  • 笛卡尔乘积:速度很慢,应该尽量避免

  • 并:属于集合运算

SQL组成

    DML:数据描述语言,增删改查

    DDL:DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上,还包括以下:

  • 完整性定义语言

  • 视图定义语言

  • 事物控制

    DCL:用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。

使用程序设计语言如何与RDBMS交互?

  • 动态SQL:程序设计语言使用函数(mysql_connect())或方法与RDBMS服务器建立连接,并进行交互;通过建立连接,遵循某种协议向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理,代表如JDBC

  • 嵌入式SQL:与动态SQL类似,其语言必须在程序编译时完全确定下来,代表如ODBC

    动态SQL直接发送的是SQL语句,而嵌入式要复杂的多,并不仅仅是SQL语句

关系型数据库分层

  • 表示层:最主要的就是表

  • 逻辑层:也被称为存储引擎,也是将物理层转成表示层

  • 物理层:数据文件。(反而成为文件管理中的表示层)

数据查询和存储过程

  1. 存储管理器

    • 权限及完整性管理器

    • 事物管理器

    • 文件管理器

    • 缓冲区管理器:提供一个缓存置换策略,将老的旧的数据块置换出去。当然有些块被称作“被钉住的块”,即为不可置换的块。

  2. 查询管理器(主要是将用户的请求提交给存储管理器,来实现真正的数据管理)

    • DML解释器:理解DML语句

    • DDL解释器:理解DDL语句

    • 查询执行引擎:理解语句之后,需要执行这个命令

MySQL由浅入深-第一部分

数据库范式

第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性

第三范式:属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性

MySQL

特点

  1. 属于CS架构,单进程多线程

    • 一个用户请求的所有操作对应一个线程

    • 线程分为守护线程和应用线程

    • 支持长连接和短连接

  2. 一个单独语句只能在一颗CPU上运行,所以不能充分发挥SMP的优势,但是我们可以进行分区,把任务分配到多态电脑上。

  3. 支持插件式存储引擎,mysql5.5.8以前默认是MyISAM,以后默认是InnoDB

  4. 速度快:完全多线程;支持查询缓存

  5. 伸缩性

  6. 易用性

  7. 支持多用户

  8. 国际化,支持多种应用程序

MySQL架构

MySQL由浅入深-第一部分

连接管理器:监听用户的请求,并将请求转发给线程管理器

用户模块:主要是用于验证用户身份的,连接时候会使用@用户名

访问控制模块:检验用户客户端是否有权限来执行所请求的操作

解析器:解析查询,并生产解析树。生产完成之后,根据具体类型交给对应的模块

优化器:负责创建响应请求时的最佳查询策略,例如查询路径有3条,优化器会选择代价最小的一条

表管理器:负责创建、读取、修改表定义文件;

  1.维护表描述符高速缓存,因为若每次都从磁盘进行读取,速度太慢;
 2.管理表锁

表修改/定义模块:表创建、删除、重命名、移除、更新或者插入之类的操作。注意此时不在仅仅是表结构文件了,涉及到数据

表维护模块:检查、修改、备份、恢复、优化(碎片整理)及解析

在这里也给出MySQL官网的一副架构图,原理大同小异

MySQL由浅入深-第一部分


常见概念

文件中记录组织

  1. 堆文件组织:一条记录可以放在文件中 的任何地方

  2. 顺序文件组织:根据“搜索码”值顺序存放

  3. 散列文件组织:

表空间

表空间是数据库的逻辑划分,基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space、segment inode、extent和page.在实现层的逻辑则使用了磁盘链表这种结构来管理逻辑关系。,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中,但主要存放的是表。

数据字典数据字典即关系的元数据:关系名,字段名,字段的类型和长度,视图,约束,用户名字,授权和密码

MySQL服务器变量

  • 作用域

    • 全局变量

      show global variables

    • 会话变量:通过客户端连接过去的,会话终止就无效了

      show [session可省略] variables

  • 生效时间

    注意:

    • 全局:当前会话无效,只对新建会话有效

    • 会话:即时生效,但只对当前会话有效,关闭之后无效

    • 静态的写在配置文件中

    • 通过参数传递给进程

    • 动态调整:即使调整后即时生效

    • 静态调整

MySQL安装与配置

安装

  1. 专用软件包管理器包,如rpm包,deb包等

      yum -y install mysql-server
    yum info mysql
    chkconfig mysqld on
    service mysqld start
    mysql
  2. 通用二进制格式包:通过gcc或者icc来进行编译

  3. 源代码: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安装后可能存在的问题

  1. 此前服务未关闭

  2. 数据初始化失败

  3. 数据目录位置错误

  4. 数据目录权限问题

配置文件

不同段下作用的范围不一样

[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

客户端命令

  1. 常见的命令如下:

\g无论语句结束符是什么,直接将此语句送至服务器端执行。

\G无论语句结束符是什么,直接将此语句送至服务器端执行。且以竖排方式执行,更易看

! COMMAND 执行sh命令

\W:语句执行结束后显示警告信息;

\w:语句执行结束后不显示警告信息;

#:对于新建的对象支持不全的功能。但是需要全部加入内存,造成延迟

  1. 客户端命令的可用选项:

    -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=表示对传输的数据需不需要进行压缩

  2. 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使用模式

  1. 交互模式

可运行命令有两类:

客户端命令:h,help

服务器端命令:大部分是SQL语句,一般需要语句结束符

  1. 脚本模式(批处理模式)

    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

数据类型选择依据

  1. 存入的值类型

  2. 占据的存储空间

  3. 定长or变长

  4. 如何比较及排序,是否区分大小写

  5. 是否支持索引

常见数据类型

  1. 数值类型

-- 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个字节。

  1. 字符串类型

 -- 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.

  1. 日期时间类型

  一般用整型保存时间戳,因为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
  1. 枚举和集合

 -- 枚举(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会如何处理呢?

  1. 查询命令

    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,等等|
  1. 修改方式

    • 全局

      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';//会话

  2. 举例

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