MySQL基础(1) | 数据类型
MySQL基础(1) | 数据类型
- 数值类型
TINYINT #小整数值,1 字节,有符号(-128,127),无符号(0,255)
SMALLINT #大整数值,2 字节
MEDIUMINT #大整数值,3 字节
INT或INTEGER #大整数值,4 字节,有符号(-2147483648,2147483647),无符号(0,4294967295)
BIGINT #极大整数值,8 字节
FLOAT #单精度浮点数值,4 字节
DOUBLE #双精度浮点数值,8 字节
DECIMAL #小数值,定点数,DECIMAL(M,D),其中M称为精度,表示总共的位数;D称为标度,表示小数的位数;默认D值为0、M值为10
- 时间类型
DATE #日期值,YYYY-MM-DD,1000-01-01/9999-12-31
TIME #时间值或持续时间,HH:MM:SS,'-838:59:59'/'838:59:59'
YEAR #年份值,YYYY,1901/2155
DATETIME #混合日期和时间值,8字节,YYYY-MM-DD HH:MM:SS,1000-01-01 00:00:00/9999-12-31 23:59:59
TIMESTAMP #混合日期和时间值,时间戳,4字节,'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'
- 字符串类型
# 字节型字符串【二进制字节型字符串,没有字符集概念】
BINARY #定长二进制字节型字符串
VARBINARY #变长二进制字节型字符串
TINYBLOB #不超过 255 个字符的二进制字符串,0-255字节
BLOB #二进制形式的长文本数据,0-65 535字节 => ~64kb
MEDIUMBLOB #二进制形式的中等长度文本数据,0-16 777 215字节 => ~16MB
LONGBLOB #二进制形式的极大文本数据,0-4 294 967 295字节 => ~4GB
# 字节型字符串 end
# 字符型字符串
CHAR #定长字符串,0-255字节
VARCHAR #变长字符串, 0-65535 字节
TINYTEXT #短文本字符串,0-255字节
TEXT #长文本数据,0-65535字节 => ~64kb
MEDIUMTEXT #中等长度文本数据,0-16 777 215字节 => ~16MB
LONGTEXT #极大文本数据,0-4 294 967 295字节 => ~4GB
# 字符型字符串 end
解析
① 区分字节型和字符型
-
BINARY(N)
和VARBINARY(N)
中的N指的是字节长度。 -
CHAR(N)
和VARCHAR(N)
中N指的是的字符长度。 -
对于
BINARY(10)
,其可存储的字节固定为10,而对于CHAR(10)
,其可存储的字节视字符集的情况而定。
②区分BINARY,VARBINARY ,CHAR,VARCHAR 四类插入和查询的不同机制
-
char(N)用来存储非二进制字符串,插入时,对于少于N个字符的会自动在尾部加空格,查询时,尾部的空格就会被丢弃掉【即插入时尾部的空格会被去掉】
-
vachar(N) 用来存储非二进制字符串,插入时,对于少于N个字符的不填补空格,查询时,尾部的空格不会被丢弃掉【即原样输出】
-
binary(N)存储二进制字符串,插入进,少于N个字节的会自动在尾部加0x00,取出时,所有的字节都保留,返回定义长度的字节长度,在比较的时候,所有的字节都是有效的【尾部会填充\0】
-
varbinary在插入不会去填补0x00字节,查询的时候也不会丢弃任何字节,在比较的时候,所有的字节都是有效的【也是原样输出】
示例:
create table test( a VARCHAR(3), b CHAR(3), c VARBINARY(3), d BINARY(3) )engine=innodb charset=gbk; insert into test select 'a ','a ','a ','a '; select hex(a),hex(b),hex(c),hex(d) from test; select concat('$',a,'$'),concat('$',b,'$'),concat('$',c,'$'),concat('$',d,'$') from test; SELECT a = 'a ', b = 'a', c = 'a ', d = 'a \0'from test;
结果集1:
结果集2:
结果集3:
- 扩展
-
VARCHAR:
在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的【即varchar(xxx)括号内的xxx按字符串个数来定义】;在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度是(65535-2)/3=21844个字符(超过255个字节会有2字节的额外占用空间开销,所以减2;如果是255以下,则减1)。
示例:
#VARCHAR单表单字段最长不能超过21844
CREATE TABLE test(
va VARCHAR(21845)
)DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#这样就可以了
CREATE TABLE test(
va VARCHAR(21844)
)DEFAULT CHARSET=utf8;
受影响的行: 0
时间: 0.155s
-
TEXT:
最大限制也是64k个字节,但是本质是溢出存储。innodb默认只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中,虽然也受单表65535最大行宽度限制,但mysql表中每个BLOB和TEXT列实际只占其中的5至9个字节,其他部分将进行溢出存储。所以实际占用表最大行宽度为9+2字节,外加的是额外开销,跟表的实际宽度没有关系。
-
获取当前时间的方法
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
SELECT NOW();
SELECT LOCALTIME;
SELECT LOCALTIME();
SELECT LOCALTIMESTAMP;
SELECT LOCALTIMESTAMP();
- 字符串转时间
select str_to_date('2017-10-16 15:30:28','%Y-%m-%d %H:%i:%s');
- 时间转字符串
select date_format(now(), '%Y-%m-%d %H:%i:%s') ;
- 通用类型转换方法
#字符串转数字
方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123', SIGNED);
方法三:SELECT '123'+0;
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED