数据与字段类型
1.什么是数据表
回顾数据库系统组成。
数据表是一个数据库里面用来存储数据的基本单元,是由表结构、表数据组成。
SQL语句不区分大小写,但是表就是一个文件名,windows不区分大小写,linux区分大小写,所以在命名时候,需要注意:
1、一定要有意义(英文或英文组合和多个单词的缩写)
2、 自己定义的名称最好都是小写
3、 Sql语句关键字最好都大写
表的作用:存放相同规则的数据
表是有由列和数据组成的。每行数据称作一个条目,每一列称作一个字段
2. 建表语句规范:
CREATE TABLE [IF NOT EXISTS] 表名称(
字段名1 列类型 [属性] [索引],
字段名2 列类型 [属性] [索引],
......
字段名n 列类型 [属性] [索引]
) [表类型] [表字符集类型];
表名称和字段名 需要用户自定义名称;
SQL语句不区分大小写,但是表就是一个文件名,windows不区分大小写,linux区分大小写,所以在命名时候,需要注意:
- 一定要有意义(英文或英文组合和多个单词的缩写,避免使用拼音)
- 自己定义的名称最好都是小写
- Sql语句关键字最好都大写
3.类型和属性
建表过程中,每个字段需要提供类型,属性,约束等描述信息描述和规范这个字段。
类型
类型就用来描述字段所存储的什么类型的数据,在SQL中,主要有以下几种数据类型:
- 数值型
- 整型
- 浮点型
- 日期型
- 字符型
- 字符型
- 枚举型
- 集合型
3.1.1 整型
标注1:UNSIGNED 代表有无符号
ZEROFILL代表:
1、 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
2.、zerofill默认为int(10)
3.、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256。
标注2:(M)代表现实的位数
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
- 一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
- 一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
- 一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
- 一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
- 这是INT的一个同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
- 一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615
总结1:
占空间大小:1,2,3,4,8字节分别对应:
*TINYINT 非常小
*SMALLINT 较小
*MEDIUINT 中等
*INT 标准
*BIGINT 大整形
3.1.2浮点型
FLOAT[(M,D)] [ZEROFILL]
- 一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。
- M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。
DOUBLE[(M,D)] [ZEROFILL]
- 一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。
- M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
- 这些是DOUBLE同义词。
DECIMAL[(M[,D])] [ZEROFILL]
- 定点数,一个未压缩(unpack)的浮点数字。不能无符号。
NUMERIC(M,D) [ZEROFILL]
- 这是DECIMAL的一个同义词。
总结:float 4字节。 double 8 字节
M:整个数值的长度 D:小数的长度
例:FLOAT[(M,D)][ZEROFILL]
create table t4(float(4,2)); //-99.99 - 99.99
定点数(本质上是按照字符串来进行存储),没有四舍五入,对于精度要求高的,推荐使用
DECIMAL(M,D) M+2字节
浮点数和定点数区别:
浮点数相对于定点数优点是在长度一定的情况下,浮点数表示范围更宽,但其存在误差问题,对于货币等精度敏感的数据,应该使用定点数表示,编程过程中尤其注意浮点数误差问题。
另外,由于浮点数存在误差,所以在项目里面尽可能少的不要用浮点数做=进行比较判断。
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)
mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)
3.2日期型
- DATE YYYY-MM-DD
- TIME hh:mm:ss
- DATETIME YYYY-MM-DD hh:mm:ss
- TIMESTAMP YYYYMMDDhhmmss (时间戳)
- YEAR YYYY YY
举例:
mysql> create table tab10(
one date,two time,three datetime,
four timestamp,five year
);
Mysql> insert into tab10(one) values(“20101201”); //2010-12-01 2010/12/01
Mysql> insert into tab10(one,two,three) values(“20101201”,‘13:12:11’,’11-02-09 11:11:11’);
3.3.1字符型
是最基本的类型,可以表示任何一种类型的值,“mysql” ‘mysql’都是可以的;
-
CHAR(M) [BINARY]
一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。 -
VARCHAR(M) [BINARY]
一个变长字符串 -
TINYBLOB & TINYTEXT
一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。。 -
BLOB & TEXT
一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。。 -
MEDIUMBLOB & MEDIUMTEXT
一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。 -
LONGBLOB & LONGTEXT
一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。
char 和 varchar
- 两者区别:
- char定长,varchar可变长度。声明时指定长度,超出长度后会报错。
- 如果存入的字符不足生命的长度,char的大小还是生命的长度;而varchar会自动伸缩为实际存入字符串的长度以节省空间
- 应用场景:
- char固定长度,效率高,比如性别…但是浪费空间
- varchar不固定长度,速度慢,效率低,但节省空间,比如文章标题…
blob
blob代表字节流,用来保存二进制数据,照片、电影、压缩包。一般我们并不在数据库中直接存放多媒体数据,而是将资源存在服务器,数据库中只保存存储的路径即可。
3.3.2枚举和集合
-
ENUM(‘value1’,‘value2’,…)
枚举。一个仅有一个值的字符串对象,这个值式选自与值列表’value1’、‘value2’, …,或NULL。一个ENUM最多能有65535不同的值。- 注意:枚举元素列表里面成员,必须放在’’里面。
- 举例:
mysql> create table tab9(one enum(‘a’,’b’,’c’,’d’),two set(‘a’,’b’,’c’,’d’)); mysql> insert into tab9 values(‘a’,’b’); //OK mysql> insert into tab9 values(‘c’,’c,d’); //OK
-
SET(‘value1’,‘value2’,…)
一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表’value1’, ‘value2’, …选出。一个SET最多能有64个成员。
枚举和集合的区别:
枚举一次只能使用一个枚举元素值,而集合可以一次使用多个值,中间使用”,”隔开即可。