MySQL的数据类型学习笔记
2016-12-23 22:13
218 查看
MySQL的数据类型
整型
1. tinyint
大小相当于c的char类型,1个字节,它有一个别名叫bool两者大小相同tinyint表示范围:-128 - 127 tinyint unsigned表示范围:0 - 255
2. smallint
大小相当于c的short类型,2个字节smallint表示范围:-32768 - 32767 smallint unsigned表示范围:0-65535
3. mediumint
大小为3个字节mediumint表示范围:-8388608 - 8388607
mediumint unsigned表示范围:0-16777215
4. int
大小相当于c的int,4个字节int表示范围:-2147483648 - 2147483637
int unsigned表示范围:4294967295
5.bigint
相当于long long类型,8个字节biging表示范围:(-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807
bigint unsigned表示范围:0~18446744073709551615
6. 测试一下:
//创建一个表有tinyint类型数据 create table type ( a tinyint, b tinyint unsigned); //插入一个符合的值 mysql> insert into type values(100, 200); Query OK, 1 row affected (0.40 sec) //插入不符合的值,报错。 mysql> insert into type values(-129, 200); ERROR 1264 (22003): Out of range value for column 'a' at row 1 mysql> insert into type values(100, -1); ERROR 1264 (22003): Out of range value for column 'b' at row 1
7. 整型的显示宽度和填零(zerofill)
//显示宽度最小为4位 create table temp(i int(4) zerofill); //当不足四位,用0来填充四位 insert into temp values(88); //当超过四位,就正常显示 insert into temp values(123456); //最后结果 mysql> select * from temp; +--------+ | i | +--------+ | 0088 | | 123456 | +--------+
浮点型
1. float和double类型
遵循IEEE 745浮点数表示S:符号位 E:指数位 M:尾数位,也叫有效位数位 N:(-1)^S × M × 2^E
- 单精度4个字节,32位,取值范围:-3.402823466E+38~3.402823466E
- 双精度8个字节,64位,取值范围:-1.7976931348623157E+308~1.7976931348623157E+308
float类型,精度6位。
double类型,精度17位。double有一个别名叫real
精度就是有效数字的个数,并不代表能表示的最大个数
2. 测试一下:
create table number(a float, b double); //插入一个数据 insert into number values(123456789.123456789, 123456789.123456758888); //显示结果,float能够表示6位有效数字,double能表示17位,并且精度位四舍五入。 +-----------+--------------------+ | a | b | +-----------+--------------------+ | 123457000 | 123456789.12345676 | +-----------+--------------------+
3. 浮点数的显示宽度和填零(zerofill)
float(m, d)unsigned zerofill m表示总位数,d是小数点后的位数
//5位数,两位小数点的float类型,其表示范围为999.99 ~ -999.99 create table teat(f float(5, 2)); insert into teat values(-999.99); insert into teat values(999.99); //超出位数遵循四舍五入的原则 mysql> insert into teat values(-999.999); ERROR 1264 (22003): Out of range value for column 'f' at row 1 mysql> insert into teat values(-999.994);//插入成功 Query OK, 1 row affected (0.13 sec)
4. decimal类型
decimal(m,d)unsigned zerofill 1. m表示总位数,d是小数点后的位数,m和d可以缺省,默认分别是10和0。 2. decimal**取值范围与double是一样的**,但是有**更高的精度**。 3. numeric是decimal的别名
测试一下:
//最大30位,最多10个小数位,不足10位用0补足。 create table num(dec decimal(30, 10)); //插入数据并查看结果 insert into num values(123456789.123456789); mysql> select * from num; +----------------------+ | d | +----------------------+ | 123456789.1234567890 | +----------------------+ 1 row in set (0.00 sec)
日期和时间
datetime类型显示格式:YYYY-MM-DD HH:MM:SS 取值范围:’1000-01-01 00:00:00’到’9999-12-31 23:59:59’ 空间大小:8字节 例子: create table mytime(time datetime); insert into mytime values('2016-12-23 18:04:38');//插入一个正常值 insert into mytime values('9999-12-31 23:59:59');//插入最大值 insert into mytime values('0000-01-01 00:00:00');//插入一个比其范围小的年值也可以成功,但是MySQL并**不保证这类不在范围的值正常工作。 insert into mytime values('99-01-01 00:00:00');//插入一个年值如果为两位数,则MySQL根据一下规则解释: - 70 ~ 99范围的年值转换为1979~1999; - 00 ~ 69范围的年值转换为2000~2069; mysql> insert into mytime values('10000-01-01 00:00:00');//插入大于其范围的值会出错 ERROR 1292 (22007): Incorrect datetime value: '10000-01-01 00:00:00' for column 'time' at row 1 mysql> select * from mytime; +---------------------+ | time | +---------------------+ | 2016-12-23 18:04:38 | | 9999-12-31 23:59:59 | | 0000-01-01 00:00:00 | | 1999-01-01 00:00:00 | +---------------------+
timestamp类型
显示格式:YYYY-MM-DD HH:MM:SS 取值范围:‘1970-01-01 00:00:00’到2038-01-19 03:14:07’ 空间大小:4字节 例子: create table timestamp(t timestamp); insert into timestamp values('2038-01-19 03:14:07');//插入一个时间,由于存在时区问题,所以timestamp能表示的最大时间应该在加上8个小时 insert into timestamp values('2038-01-19 11:14:07');//插入范围上限的值,可以成功 mysql> insert into timestamp values('2038-01-19 11:14:08');//插入超出范围的值出错 ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 't' at row 1 mysql> select * from timestamp; +---------------------+ | t | +---------------------+ | 2038-01-19 03:14:07 | | 2038-01-19 11:14:07 | +---------------------+
date类型
显示格式:YYYY-MM-DD 取值范围:’1000-01-01’到’9999-12-31’ 空间大小:3字节 date类型和datetime类型相似,不存储时分秒,和datetime都有不保证小于其范围的值正常工作。
time类型
显示格式:HH:MM:SS 取值范围:‘-838:59:59’到’838:59:59’ 空间大小:3字节 time类型能够取到负数范围,所以可以用来表示时间差。 例子: insert into t_time values('-35:32:53');//插入一个负值 insert into t_time values('1 00:32:53');//在小时前可以插入一个天数,它会换算成小时 mysql> select * from t_time; +-----------+ | t | +-----------+ | -35:32:53 | | 24:32:53 | //被换算成的time值 +-----------+
year类型
显示格式:YYYY 取值范围:1901到2155 空间大小:1字节 year类型的数据在插入时可以以整数的形式插入,也可以以字符串类型插入,不能超过其范围。
字符串类型
char和varchar类型char(M) varchar(M) M表示的是字符数 CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。 VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
值 | char(4) | 存储需求 | varchar(4) | 存储需求 |
---|---|---|---|---|
“” | ” | 4字节 | ” | 1个字节 |
“ab” | ‘ab’ | 4字节 | ‘ab’ | 3个字节 |
“abcd” | ‘abcd’ | 4字节 | ‘abcd’ | 5个字节 |
“abcdefgh” | ‘abcd’ | 4字节 | ‘abcd’ | 5个字节 |
binary和varbinary类型
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
text类型
text分为四种 1. tinytext 存储需求:L+1个字节,其中L < 2^8 2. text 存储需求:L+2个字节,其中L < 2^16 3. mediumtext 存储需求:L+3个字节,其中L < 2^24 4. longtext 存储需求:L+4个字节,其中L < 2^32 VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。 对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。
enum类型
//枚举类型只能插入枚举类型中含有的字符串 create table t_enum(sex enum('male', 'female')); insert into t_enum values('male'); insert into t_enum values('female'); mysql> insert into t_enum values('other');//插入其他的字符串会戳错 ERROR 1265 (01000): Data truncated for column 'sex' at row 1 insert into t_enum values(1);//插入整型数字也可以,1与第一个字符串对应,实际上MySQL中保存的是整数。 mysql> select sex+0 from t_enum; +-------+ | sex+0 | +-------+ | 1 | | 2 | | 1 | +-------+ enum最多65535个值
set类型
sei类型是按位存取的 create table fruit_table(fruit set('apple', 'banana', 'orange'));//apple二进制代表1,banana二进制代表10,orange二进制代表100。 insert into fruit_table values('apple,banana');//插入的字符串不能有空格,插入'apple,banana'相当与插入二进制11,十进制则为3 insert into fruit_table values('apple,orange');//插入'apple,orange'相当于插入二进制101,十进制则为5 mysql> select fruit+0 from fruit_table; +---------+ | fruit+0 | +---------+ | 3 | | 5 | +---------+
相关文章推荐
- 《MySQL入门很简单》学习笔记(4)之第4章MySQL数据类型(关键词:数据库/MySQL/数据类型)
- 【MySQL】《高性能MySQL》学习笔记,第四章,Schema与数据类型优化
- MySQL数据类型(http://blog.csdn.net/i_like_cpp/)
- [转]MYSQL数据类型长度 常规的建库策略
- 《visual c#.net网络核心编程》学习笔记系列之:常用的数据类型
- MySQL 的数据类型和建库策略
- MySQL存储引擎和数据类型
- MySql 主键(自动增加)的数据类型所带来的错误
- MySQL的数据类型和建库策略
- MySQL5.0的三种数据类型:DATETIME, DATE和TIMESTAMP的使用
- 《C++ Primer》学习笔记——第三章C++数据类型
- mysql数据类型
- MYSQL的数据类型
- MySQL 数据类型
- MySQL数据类型
- MySQL查询优化--数据类型与效率
- MySQL查询优化系列讲座之数据类型与效率
- MySql与Java数据类型转换
- MySQL 的数据类型和建库策略
- MySQL 的数据类型和建库策略