概述
数据类型: mysql对数据进行统一的分类, 统一的进行管理,更好的利用有限的空间。
分三大类: 数值类型, 字符串类型和时间日期类型。
数值型
系统将数值型分为整数型和小数型。
整数型
在SQL中因为更多要考虑如何节省磁盘空间, 所以系统将整型又细分成了5类。
创建一张整型表
int(M):M表示显示宽度,从左到右填充空格。搭配zerofill(0填充),当数据位数不超过M位时,用0填齐,保证数据格式,无特殊含义。
小数型
小数型: 带有小数点或者范围超出整型的数值类型.。SQL中: 将小数型细分成两种: 浮点型和定点型。
浮点型
小数点浮动, 精度有限,而且会丢失精度。
Float: 单精度, 占用4个字节存储数据, 精度范围大概为7位左右
Double: 双精度,占用8个字节存储数据, 精度方位大概为15位左右
float(M,D): M代表总长度,D代表小数部分长度, 整数部分长度为M-D。
插入数据: 可以是直接小数,也可以是科学计数法。
浮点型数据的插入: 整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)。可以允许小数部分四舍五入导致整数进位。
定点型
小数点固定, 精度固定, 不会丢失精度。绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)。
decimal(M,D)
插入数据: 定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入).
浮点数如果进位导致长度溢出没有问题,但是定点数不行.
注意
显示宽度,BIT类型的数据使用,浮点类型的不准确性, 数据的溢出。
应用与优化
建议使用 TINYINT 代替 ENUM、BITENUM、SET。
避免使用整数的显示宽度,也就是说,不要用INT(10)类似的方法指定字段显示宽度,直接用INT。
DECIMAL最适合保存准确度要求高,而且用于计算的数据,比如价格。但是在使用DECIMAL类型的时候,注意长度设置。 建议使用整形类型来运算和存储实数,方法是,实数乘以相应的倍数后再操作。
整数通常是最佳的数据类型,因为它速度快,并且能使用AUTO_INCREMEN。
时间日期类型
DAETIME
YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值: 0000-00-00 00:00:00
TIMESTAMP
时间戳, 并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式与datetime完全一致
DATE
日期,就是datetime中的date部分
TIME
时间(段),指定的某个区间之间,-时间到+时间
YEAR
1901-2155 有0值
直接插入4位字符串或者4位数字。
插入2位字符串,‘00’~‘69’,2000~2069;‘70’~‘99’,1970~1999。如果是‘0’,则与插入‘00’效果相同,都是表示2000年。
插入2位数字,如果插入的是一位数字0,则表示的是0000,而不是2000年。
注意
TIMESTAMP 默认值:CURRENT_TIMESTAMP 。是否根据当前时间戳更新 用于 表 的更新时间设计。只要当前所在的记录被更新, 该字段一定会自动更新成当前时间
如果我们想插入当前系统的时间,则可以插入CURRENT_DATE或者NOW()。
在给YEAR类型赋值时,一定要分清0和‘0’,虽然两者相差个引号,但实际效果确实相差了2000年。
PHP中有非常强大的时间日期处理函数: date,只需要一个时间戳就可以转换成任意类型的时间: 以PHP为主的时候, 都是在数据库使用时间戳(整型)来存储时间。但是不利于程序员查看时间。
字符串类型
在SQL中,将字符串类型分成了6类: char,varchar,text , blob, enum和set。
定长字符串char
定长字符串: char, 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度.
Char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.
Char(4): 在UTF8 环境下,需要4 * 3 = 12个字节
变长字符串varchar
变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.
Varchar(L): L表示字符长度 理论长度是65536个字符, 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text
Varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes) ; varchar(3) 存储了3个汉字: 3 * 3 + 1 = 10(bytes)
定长与变长的存储实际空间(UTF8)
|
实际存储数据 |
Char(4) |
Varchar(4) |
Char占用字节 |
Varchar(占用字节) |
|
ABCD |
ABCD |
ABCD |
4 * 3 = 12 |
4 * 3 + 1 = 13 |
|
A |
A |
A |
4 * 3 = 12 |
1 * 3 + 1 = 4 |
|
ABCDE |
|
|
数据超过长度 |
数据超过长度 |
如何选择定长或者是变长字符串呢?
定长的磁盘空间比较浪费, 但是效率高: 如果数据基本上确定长度都一样, 就是使用定长, 如身份证, 电话号码, 手机号码等
变长的磁盘空间比较节省, 但是效率低: 如果数据不能确定长度(不同数据有变化), 如姓名, 地址等
文本字符串
如果数据量非常大, 通常说超过255个字符就会使用文本字符串
文本字符串根据存储的数据的格式进行分类: text和blob
Text: 存储文字(二进制数据实际上都是存储路径)
Blob: 存储二进制数据(通常不用)
Mysql中text文本字符串,不占用记录长度: 额外存储. 但是text文本字符串也是属于记录的一部分: 一定需要占据记录中的部分长度: 10个字节(保存数据的地址以及长度).
枚举字符串 集合字符串
Mysql记录长度
Mysql中规定: 任何一条记录最长不能超过65535个字节.(varchar永远达不到理论值),
Varchar的实际存储长度能达到多少呢? 看字符集编码.
Utf8 下varchar的实际顶配: 21844字符
GBK下的varchar的实际顶配: 32766字符