MySQL的各种数据类型
1、MySQL 数据类型
MySQL ⽀持多种类型,⼤致可以分为三类:数值、⽇期/时间和字符串(字符)类型。
1.2、mysql中编码和字符
在 mysql 中,⼀个中⽂汉字所占的字节数与编码格式有关:
如果是GBK编码,则⼀个中⽂汉字占2个字节,英⽂占1个字节
如果是UTF8编码,则⼀个中⽂汉字占3个字节,⽽英⽂字母占1字节。
⽐如定义某个字段数据类型为:varchar(32),表⽰这个可以存储 32 个字符,此时表⽰的是字符,所以跟中英⽂⽆关,也就是该字段可以存储 32 个中⽂,或者是 32 个英⽂,或者是 32 个中⽂和英⽂的混搭都⾏。但如果字符数超过 32 个的话就会报错。
2、数值类型
MySQL ⽀持所有标准 SQL 数值数据类型,mysql 的数值数据类型可以⼤致划分为两个类别,⼀个是整数,
另⼀个是浮点数或⼩数。并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者⽤零填补(ZEROFILL)
在 MySQL 中⽀持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很⼤程度上是相同的,只有它们存储的值的⼤⼩是不相同的。浮点型有:FLOAT、DOUBLE、DECIMAL。
下⾯的表显⽰了需要的每个数值类型的存储所占⽤的字节和可表⽰的数值范围:
1 bit 即 1位  1字节 = 8 bit  1K = 1024字节  1M = 1024K
类型⼤⼩范围(有符号,默认)范围(⽆符号)⽤途TINYINT  1 Bytes(-128,127)(0,255)⼩整数值SMALLINT  2 Bytes(-32 768,32 767)(0,65 535)⼤整数值MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)⼤整数值
INT或
INTEGER
4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)⼤整数值
BIGINT8 Bytes (-9,223,372,036,854,775,808,9 223
372 036 854 775 807)
(0,18 446 744 073 709 551 615)极⼤整数值
FLOAT  4 Bytes (-3.402 823 466 E+38,-1.175 494 351
E-38),0,(1.175 494 351 E-38,3.402
823 466 351 E+38)
0,(1.175 494 351 E-38,3.402 823 466
E+38)
单精度
浮点数值
DOUBLE8 Bytes (-1.797 693 134 862 315 7 E+308,-
2.225 073 858 507 201 4 E-308),0,
(2.225 073 858 507 201 4 E-308,1.797
693 134 862 315 7 E+308)
0,(2.225 073 858 507 201 4 E-
308,1.797 693 134 862 315 7 E+308)
双精度
浮点数值
DECIMAL 对DECIMAL(M,D)
,如果M>D,为
M+2否则为D+2
依赖于M和D的值依赖于M和D的值⼩数值
⽐如 INT 类型,该类型所占字节为 4 个字节。⽐如数据库中某列的字段类型为 INT,则每条数据的该列的数据都会占服务器容量的 4 个字节的存储容量,并且该列所能显⽰的数值范围只能是 -128~127 ,或者如果该列是⽆符号的话,则范围是 0~255。如果你存储超出最⼤范围则会提⽰ out of range value ....,⽐如往 INT 且有符号的数据类型⾥⾯存储 2147483648 的值,则会报错并且不会存储成功。
2.1、整数类型的长度
常⽤的整数数据类型有 tinyint ,smallint ,mediumint , int ,bigint 共计5种。
在声明整数类型列时,我们可以跟上⼀个数值,例如 int(n) ,但实际上这⾥的 n 跟存储没有什么关系,⽆论 n 是什么,INT 数据类型都是 4 个字节,只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。
在mysql⼿册中这个 n 表⽰最⼤显⽰宽度,显⽰宽度与存储⼤⼩和数据类型所能包含的值的范围⽆关,最⼤有效的显⽰宽度是255,即 n 的值最⼤是255。
⽐如我声明⼀个字段为 `number` INT(5) ,此时该 number 字段也是占 4 个字节,也只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。这个 n 的作⽤只有在我们给列加上 ZEROFILL(⽤ 0 填充)属性时才会体现出来,并且只有在使⽤⼀些特定的客户端输出时才会有体现。⽐如:
`number` int(5) unsigned zerofill      -- 加上zerofill属性则必须同时加unsigned属性
此时,当该列某条数据的数字⼩于 5 位时,在某些特定的客户端检索输出时,会在数字前 “补0”,凑⾜5位数字。例如存储的数字是123,那么输出00123 。如果⼤于 5 位则原样显⽰原数字。
注意,不是在数据库中存储时会⾃动补 0 ,⽽是在某⼀些客户端查询输出时才有显⽰效果,⽬前仅发现使⽤在MySQL Shell才有显⽰效果,其他客户端连接时均⽆。
所以说,基本没有开发者会使⽤这个特性,因为基本没什么⽤。
2.2、浮点型
FLOAT 类型固定占⽤4个字节, DOUBLE 类型固定占⽤8个字节,逻辑和上述的整型类似。
DECIMAL 类型的定义⽅式是 DECIMAL(M,D)  ,其中 M 表⽰最⼤位数,D 表⽰⼩数点右侧的位数。这⾥的“位”不是⼆进制的⽐特位,⽽是指⼗进制的数字的位数。
例如我们定义 DECIMAL(5,2)  ,则表⽰最⼤位数为5位,⼩数点后2位,于是取值范围为 -999.99⾄999.99 。可以这样理解:M-D 的值为⼩数点前的位数,D 的值为⼩数点后的位数,要算取值范围则各个位置填充9,取正负范围。那么容易计算 DECIMAL(5,1)  的取值范围是 -9999.9⾄9999.9 ;DECIMAL(4,2)  的取值范围是 -99.99⾄99.99 。
DECIMAL(M,D)  的存储⽅式和其他数字类型都完全不同,它是以字符串形式进⾏存储的。这可能有点不好理解,以整型 tinyint 为例,它存储的值是直接为⼗进制到⼆进制的转换,以⽆符号型为例,当需要存⼊的值为100值,将100转化为⼆进制为1100100 ,使⽤1个字节即8位记录,实际存⼊的是 01100100 。但是⽤ DECIMAL 类型存储时,⽐如定义 DECIMAL(3,0)  ,存⼊100时,实际存⼊的是由字符“1”,“0”,“0”拼接⽽成的字符串“100”的⼆进制值,存⼊时占⽤3个字节,分别是31,30,30(注意这是⼗六进制)。
1个数字字符占⽤1个字节,因此定义为 DECIMAL(M,D)  占⽤ M 个字节。(同上所述,M个字节为数据本⾝的占⽤空间,另外描述该数据的元数据还固定占⽤2个字节的空间)。
需要注意的是, DECIMAL 类型在存储时有补0操作。⼩数点前不⾜,向更⾼位补0,⼩数点后不⾜,向更低位补0。
以 DECIMAL(5,2)  为例,如果准备存⼊9.5,⼩数点前应为3位,缺2位,⼩数点后应为2位,缺1位,各补0后,实际存⼊ '009.50' ,转化为⼗六进制为30 30 39 2E 35 30 。但是在检索输出时,⼩数点前的0⼀般会省略,⽽⼩数点后的0会保留,这⼀点也需要注意。
可参考:
3、字符串类型
MySQL 提供了 8 个基本的字符串类型,包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET,可以存储的范围从简单的⼀个字符到巨⼤的⽂本块或⼆进制字符串数据。
类型⼤⼩⽤途
CHAR0-255 bytes(字节)定长字符串
VARCHAR0-65535 bytes变长字符串
字符串长度0到59
TINYBLOB0-255 bytes不超过 255 个字符的⼆进制字符串
TINYTEXT0-255 bytes短⽂本字符串
BLOB0-65 535 bytes⼆进制形式的长⽂本数据
TEXT0-65 535 bytes长⽂本数据
MEDIUMBLOB0-16 777 215 bytes⼆进制形式的中等长度⽂本数据
MEDIUMTEXT0-16 777 215 bytes中等长度⽂本数据
LONGBLOB0-4 294 967 295 bytes⼆进制形式的极⼤⽂本数据
LONGTEXT0-4 294 967 295 bytes极⼤⽂本数据
3.1、字符串类型长度
常⽤的字符串类型的数据类型有 CHAR 和 VARCHAR 两种,两者后⾯都必须要跟上⼀个数字表⽰长度,例如 CHAR(10)、VARCHAR(10)。
char(n) 和 varchar(n) 括号中的 n 代表最⼤可容纳的字符的个数,并不代表字节个数。注意,⼀个中⽂和⼀个英⽂都是 1 个字符,只不过 mysql 的编码格式不同时,1 个中⽂和 1 个英⽂所占⽤的存储字节不同⽽已。(虽然在早期的版本中,n 指的是字节数,但已经是⾮常旧的版本了,估计⼀般⼈也⽤不到)
CHAR(n) 和 VARCHAR(n)  都是表⽰可存储 n 个字符,但是 char 类型在少于 n 个字符时,会在字符串的右边使⽤空格来填充以达到 n 个字符。
⽐如:CHAR(4) 和 VARCHAR(4) ,对于 CHAR(4) 表⽰固定容纳4个字符,当少于4个字符时,会使⽤空格填充空缺的部分,如果超过4个字符,会⾃动截断超出部分。例如你存⼊数据为 'ab' ,实际会存⼊ 'ab  ' (ab后有2个空格)。但是如果我们使⽤ select 语句来查询 char 类型的字段时,会发现根本就没有⾃动补空格,这是因为 CHAR 字段在检索输出时,会⾃动省略右侧的空格。
VARCHAR 是 CHAR 类型的⼀个变体,它是⼀种可变长度的字符串类型,并且在声明时也必须要指定
字符长度。VARCHAR 类型对于未达到 n 字符的情况不会补空。
CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理这个指⽰器(即 n)的⽅式:CHAR 把这个⼤⼩视为值的⼤⼩,在长度不⾜的情况下就⽤空格补⾜。⽽ VARCHAR 类型只会把 n 作为限制字符串的最⼤长度,短于指⽰器长度的 VARCHAR 类型不会被空格填补,但长于指⽰器的值仍然会被截短。
关于计算 VARCHAR 类型字符串的占⽤空间,有⼀点需要说明的是, VARCHAR 类型字符串的占⽤空间实际上包含2部分,⼀是存储数据本⾝占⽤的空间,⼆是描述数据的元数据占⽤的空间,例如 VARCHAR 类型会使⽤1个字节记录存⼊数据实际的字符数。
⽐如下⾯⽰例说明 varchar 字段的字符长度和占⽤存储字节数:
(1) 'a啊b' —— 字符数为3,不补空,实际存⼊为 'a啊b' ,字符数为3,字节数为 1+3+1=5 。
(2)'a啊b哈ccccccccc' —— 字符数超出4,仅保留前4个字符,因此实际存⼊  'a啊b哈' ,字符数:4,字节数:1+3+1+3=8 。这种情况和 CHAR 类型处理⼀致。
(3)'a啊和哈' —— 字符数刚好为4,不需要截断和补齐,因此实际存⼊  'a啊和哈' ,字符数:4,字节数:1+3+3+3=10
两者的使⽤场景:因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使⽤ VARCHAR 类型可以⼤⼤地节约磁盘空间、提⾼存储效率。但如果确切知道字符串长度,⽐如就在50~55之间,那就⽤ CHAR,因为 CHAR 类型由于本⾝定长的特性使其性能要⾼于 VARCHAR。
4、⽇期和时间类型
在处理⽇期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的⽇期(DATE)、时间类型(TIME)、年份(YEAR)、混合⽇期(DATETIME)、时间类型(TIMESTAMP)。
每⼀个时间、⽇期类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插⼊数据库中。
类型
⼤⼩
( 固定长度、
单位为字节)
范围格式⽤途
DATE31000-01-01/9999-12-31YYYY-MM-DD⽇期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合⽇期和时间值
TIMESTAMP41970-01-01 00:00:00/2038
结束时间是第 2147483647 秒,北京时间 2038-1-19
11:14:07,格林尼治时间 2038年1⽉19⽇凌晨
03:14:07
YYYYMMDD HHMMSS混合⽇期和时间值,时间戳

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。