1. mysql数据类型
主要包括以下五大类:
- 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
- 浮点数类型:FLOAT、DOUBLE、DECIMAL
- 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
- 日期类型:Date、DateTime、TimeStamp、Time、Year
- 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
1.1 整型
MySQL数据类型 |
含义(有符号) |
tinyint(m) |
1个字节 范围(-128~127) |
smallint(m) |
2个字节 范围(-32768~32767) |
mediumint(m) |
3个字节 范围(-8388608~8388607) |
int(m) |
4个字节 范围(-2147483648~2147483647) |
bigint(m) |
8个字节 范围(+-9.22*10的18次方) |
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
1.2 浮点型(float 和 double)
MySQL数据类型 |
含义 |
float(m,d) |
单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) |
双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。整数部分最大是3位,如果插入数12.123456,存储的是12.1234,如果插入12.12,存储的是12.1200.
1.3 定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。
1.4 字符串(char、varchar、text)
MySQL数据类型 |
含义 |
char(n) |
固定长度,最多255个字符 |
varchar(n) |
固定长度,最多65535个字符 |
tinytext |
可变长度,最多255个字符 |
text |
可变长度,最多65535个字符 |
mediumtext |
可变长度,最多2的24次方-1个字符 |
longtext |
可变长度,最多2的32次方-1个字符 |
char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
1.5 二进制类型(_Blob)
_BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。 2._BLOB存储的数据只能整体读出。 3._TEXT可以指定字符集,_BLO不用指定字符集。
1.6 日期时间类型
MySQL数据类型 |
含义 |
date |
日期 '2008-12-2' |
time |
时间 '12:25:36' |
datetime |
日期时间 '2008-12-2 22:06:44' |
timestamp |
自动存储记录修改时间 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
1.7 数据类型的属性
MySQL关键字 |
含义 |
NULL |
数据列可包含NULL值 |
NOT NULL |
数据列不允许包含NULL值 |
DEFAULT |
默认值 |
PRIMARY KEY |
主键 |
AUTO_INCREMENT |
自动递增,适用于整数类型 |
UNSIGNED |
无符号 |
CHARACTER SET name |
指定一个字符集 |
1.8 MySQL的数据类型长度和范围
各数据类型及字节长度一览表:
数据类型 |
字节长度 |
范围或用法 |
Bit |
1 |
无符号[0,255],有符号[-128,127],备注:BIT和BOOL布尔型都占用1字节 |
TinyInt |
1 |
整数[0,255] |
SmallInt |
2 |
$无符号[0,65535],有符号[-32768,32767]$ |
MediumInt |
3 |
$无符号[0,2^24-1],有符号[-223,223-1]]$ |
Int |
4 |
$无符号[0,2^32-1],有符号[-231,231-1]$ |
BigInt |
8 |
$无符号[0,2^64-1],有符号[-263 ,263 -1]$ |
Float(M,D) |
4 |
单精度浮点数。提醒:这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。 |
Double(M,D) |
8 |
双精度浮点。 |
Decimal(M,D) |
M+1或M+2 |
未打包的浮点数,用法类似于FLOAT和DOUBLE,提醒:如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。 |
Date |
3 |
以YYYY-MM-DD的格式显示,比如:2009-07-19 |
Date Time |
8 |
以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30 |
TimeStamp |
4 |
以YYYY-MM-DD的格式显示,比如:2009-07-19 |
Time |
3 |
以HH:MM:SS的格式显示。比如:11:22:30 |
Year |
1 |
以YYYY的格式显示。比如:2009 |
Char(M) |
M |
定长字符串 |
VarChar(M) |
M |
变长字符串,要求M<=255 |
Binary(M) |
M |
类似Char的二进制存储,特点是插入定长不足补0 |
VarBinary(M) |
M |
类似VarChar的变长二进制存储,特点是定长不补0 |
Tiny Text |
Max:255 |
大小写不敏感 |
Text |
Max:64K |
大小写不敏感 |
Medium Text |
Max:16M |
大小写不敏感 |
Long Text |
Max:4G |
大小写不敏感 |
TinyBlob |
Max:255 |
大小写敏感 |
Blob |
Max:64K |
大小写敏感 |
MediumBlob |
Max:16M |
大小写敏感 |
LongBlob |
Max:4G |
大小写敏感 |
Enum |
1或2 |
最大可达65535个不同的枚举值 |
Set |
可达8 |
最大可达64个不同的值 |
Geometry |
||
Point |
||
LineString |
||
Polygon |
||
MultiPoint |
||
MultiLineString |
||
MultiPolygon |
||
GeometryCollection |
使用建议
- 在指定数据类型的时候一般是采用从小原则,比如能用TINY INT的最好就不用INT,能用FLOAT类型的就不用DOUBLE类型,这样会对MYSQL在运行效率上提高很大,尤其是大数据量测试条件下。
- 不需要把数据表设计的太过复杂,功能模块上区分或许对于后期的维护更为方便,慎重出现大杂烩数据表
- 数据表和字段的起名字也是一门学问
- 设计数据表结构之前请先想象一下是你的房间,或许结果会更加合理、高效
- 数据库的最后设计结果一定是效率和可扩展性的折中,偏向任何一方都是欠妥的
2. mysql常用的系统表
以MySQL5.7为例, 默认的数据库有4个:
information_schema, 具有 61个表, 它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
mysql, 具有31个表; mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改root用户的密码)。
performance_schema,具有87个表; 主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。
sys, 具有1个表, 100个视图. (MySQL5.6没有该库) sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。
2.1 information_schema部分表说明
- SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
- TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
- COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
- STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
- USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
- SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
- TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
- COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
- CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
- COLLATIONS表:提供了关于各字符集的对照信息。
- COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
- TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
- KEY_COLUMN_USAGE表:描述了具有约束的键列。
- ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
- VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
- TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。
举例:通过 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表查询约束关系
SELECT CONSTRAINT_NAME,TABLE_NAME,REFERENCED_TABLE_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA= 'employees' AND REFERENCED_TABLE_NAME IS NOT NULL;
2.2 performance_schema部分表说明
PERFORMANCE_SCHEMA这个功能默认是关闭的。需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.cnf 中 不能动态修改。
- setup_table: 设置表,配置监控选项。
- current_events_table:记录当前那些thread 正在发生什么事情。
- history_table:发生的各种事件的历史记录表
- summary_table:对各种事件的统计表
- setup_consumers\ Setup_instruments:描述各种事件, 设置哪些事件能够被收集
- setup_instruments:描述这个数据库下的表名以及是否开启监控。
- setup_timers:描述 监控选项已经采样频率的时间间隔
- Threads:监控服务器所有连接
- Performance_timers:设置一些监控信息, 指定mysql服务可用的监控周期,CYCLE表示按每秒检测2603393034次, 目前 performance-schema 只支持 ‘wait’ 时间的监控,代码树上 wait/ 下的函数都可以监控到。
2.3 msyql部分表说明
在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有:
- user: 用户列、权限列、安全列、资源控制列
- db : 用户列、权限列
2.4 sys部分表说明
- sys_config : 系统配置表
- host : 以IP分组相关的统计信息
- innodb: innodb buffer 相关信息
- io : 数据内不同维度展的IO相关的信息
- memory : 以IP,连接,用户,分配的类型分组及总的占用显示内存的使用
- metrics : DB的内部的统计值
- processlist : 线程相关的信息(包含内部线程及用户连接)
- ps_ : 没有工具统计的一些变量(没看出来存在的价值)
- schema : 表结构相关的信息,例如: 自增,索引, 表里的每个字段类型,等待的锁等等
- session : 用户连接相关的信息
- statement : 基于语句的统计信息(重店)
- statements_ : 出错的语句,进行全表扫描, 运行时间超长,排序相等(重点)
- user_ : 和host_开头的相似,只是以用户分组统计
- wait : 等待事件,比较专业,难看懂。
- waits : 以IP,用户分组统计出来的一些延迟事件,有一定的参考价值。
3. mysql的常用命令
3.1 show命令
- desc 表名; // 表信息
- show columns from 表名; // 表字段
- describe 表名; // 表信息
- show create table 表名; // 表创建语句
- show create database 数据库名; // 显示数据库 信息
- show table status from 数据库名; // 数据库状态
- show tables或show tables from database_name; // 显示当前数据库中所有表的名称
- show databases; // 显示mysql中所有数据库的名称
- show processlist; // 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
- show table status; // 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间
- show columns from table_name from database_name; // 显示表中列名称
- show columns from database_name.table_name; // 显示表中列名称
- show grants for user_name@localhost; // 显示一个用户的权限,显示结果类似于grant 命令
- show index from table_name; // 显示表的索引 show status;解释:显示一些系统特定资源的信息,例如,正在运行的线程数量
- show variables; // 显示系统变量的名称和值 show privileges;解释:显示服务器所支持的不同权限
- show create database database_name ; // 显示create database 语句是否能够创建指定的数据库
- show create table table_name; // 显示create database 语句是否能够创建指定的数据库
- show engies; // 显示安装以后可用的存储引擎和默认引擎。
- show innodb status ; // 显示innoDB存储引擎的状态
- show logs; // 显示BDB存储引擎的日志
- show warnings; //显示最后一个执行的语句所产生的错误、警告和通知
- show errors; // 只显示最后一个执行语句所产生的错误
3.2 SELECT命令
- SELECT SUBSTRING_INDEX( HOST, ':', 1 ) AS ip,count( * ) FROM information_schema.PROCESSLIST GROUP BY ip //查看当前数据库的各IP连接数
- SELECT @@CHARACTER_SET_DATABASE //查看数据库字符集
- SELECT DATABASE() //查看当前数据库
- SELECT VERSION( ) //查看数据库版本信息
3.3 其他命令
- SET GLOBAL FOREIGN_KEY_CHECKS=0 //禁用约束
- SET GLOBAL FOREIGN_KEY_CHECKS=1 //启用约束
4. mysql的常见函数