一、数据类型是什么?
数据类型是指列的数据特征,它决定了数据的存储格式,代表了不同的信息类型。
有一些数据是要存储为数字的,数字当中有些是要存储为整数、小数、日期型等...
二、MYSQL常见数据类型
MySQL支持多种类型,大致可以分为四类:数值型、浮点型、日期/时间和字符串(字符)类型。
三、整型
- 常用
数据类型 字节数 最小值 最大值 TINYINT 1 -128 127 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 - 语法格式
整型 - 说明
- 无论N等于多少,int永远占4个字节
- N表示的是显示宽度,
- N可以省略不写,默认是11位
- 示例代码
create table test1 ( a int, b int(11) , c int(10) , d int(255) ) insert into test_int_width values(1, 1, 1, 1111111111); select * from test1;
四、浮点型
- 说明
MySQL中浮点型常用的有三种,分别为float、double、Decimal,可以指定浮点数和定点数的精度 - 常用
数据类型 字节数 备注 范围 float 4 单精度浮点型 最小非零值:±1.175494351E – 38 double 8 双精度浮点型 最小非零值:±2.2250738585072014E – 308 Decimal 8 定点数的精度 可变;其值的范围依赖于M 和D - 语法格式
浮点类型[(M,D)]
- 参数说明
- M表示总长度,
- D表示小数部分长度,
- 所以整数部分长度为M-D
- 当我们不指定M、D的时候,会按照实际的精度来处理。
- 区别
- 当不指定精度时,Float、Double默认会保存实际精度,而Decimal默认是整数;
- 当标度不够时,都会四舍五入,但Decimal会警告信息。
- 总结
1、浮点数存在误差问题(精度丢失问题);
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; - 示例代码
CREATE TABLE test( f FLOAT(5,2) DEFAULT NULL, d DOUBLE(5,2) DEFAULT NULL, de DECIMAL(5,2) DEFAULT NULL ) engine=innodb charset=utf8; INSERT INTO test(f,d,de) VALUES(1.23,1.23,1.23);
五、字符串
- 表格
类型 大小 用途 说明 CHAR 0-255字节 定长字符串 编码方式有关 VARCHAR 0-65535 字节 变长字符串 编码方式有关 TEXT 0-64kb 长文本数据 M>500,通常会使用文本字符串,varchar也会自动转为text - 语法格式
字符串类型(M)
- 参数说明
- m表示字符串长度,必填
- text 不能指定长度
- 示例代码
CREATE TABLE articles ( title VARCHAR(255), desc TEXT );
- char和varchar:
- char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
- char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
- char类型的字符串检索速度要比varchar类型的快。
- varchar和text:
- varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
- text类型不能有默认值。
- varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
六、日期时间
- 常用
数据类型 字节数 格式 备注 date 3 yyyy-MM-dd 存储日期值 time 3 HH:mm:ss 存储时分秒 year 1 yyyy 存储年 datetime 8 yyyy-MM-dd HH:mm:ss 存储日期+时间 timestamp 4 yyyy-MM-dd HH:mm:ss 存储日期+时间,可作时间戳 - 语法格式
日期时间 - 示例代码
create table test_time ( date_value date, time_value time, year_value year, datetime_value datetime, timestamp_value timestamp ) engine=innodb charset=utf8; insert into test_time values(now(), now(), now(), now(), now());
网友评论