ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

3. MySQL支持的数据类型

2020-09-13 09:00:23  阅读:216  来源: 互联网

标签:NULL 20 MySQL 数据类型 支持 t1 sec mysql id1


3.1数值类型

MySQL支持所有标准SQL中的数值类型,主要有整数、浮点数、定点数、位类型。表3-1列出了MySQL5.0中支持的所有数值类型。关键字INT是INTEGER的同名词,DEC是DECIMAL的同名词。

3.1.1 整数类型

(1) 对于整型数据,MySQL支持在类型名称后面的小括号内指定显示宽度。如果不显示指定宽度则默认为int(11)。一般配合zerofill使用,zerofill就是用"0"填充的意思,就是在数字位数不够的空间用字符"0"填满。

设置了宽度限制后,如果插入大于宽度限制的值,不会有任何影响,只不过宽度格式已经失去了它本来的意义。

(2)可选属性UNSIGNEDAUTO_INCREMENT

UNSIGNED保存无符号数(非负数)可设置此选项。

AUTO_INCREMENT产生唯一标识符或顺序值,一个表中只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMARY KEY或定义为UNIQUE键。

# 创建表t1
mysql> create table t1 (id1 int,id2 int(5));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1   | int(11) | YES  |     | NULL    |       |
| id2   | int(5)  | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(128,128);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+------+
| id1  | id2  |
+------+------+
|  128 |  128 |
+------+------+
1 row in set (0.00 sec)
# 修改表字段属性为zerofill
mysql> alter table t1 modify id1 int zerofill;
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> alter table t1 modify id2 int(5) zerofill;
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0
# 不满足宽度0填充
mysql> select * from t1;
+------------+-------+
| id1        | id2   |
+------------+-------+
| 0000000128 | 00128 |
+------------+-------+
1 row in set (0.00 sec)
# 插入大于宽度值的数据对于存储没有影响
mysql> insert into t1 values(128, 1280001);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------------+---------+
| id1        | id2     |
+------------+---------+
| 0000000128 |   00128 |
| 0000000128 | 1280001 |
+------------+---------+
2 rows in set (0.00 sec)
# 更改表字段属性为UNSIGNED
mysql> mysql> alter table t1 add id3 tinyint UNSIGNED;   
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
# MySQL自动为zerofill列添加unsigned属性
mysql> desc t1;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type                      | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| id1   | int(10) unsigned zerofill | YES  |     | NULL    |       |
| id2   | int(5) unsigned zerofill  | YES  |     | NULL    |       |
| id3   | tinyint(3) unsigned       | YES  |     | NULL    |       |
+-------+---------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 插入负数提示值越界
mysql> insert into t1 values(-1,-1,-1);
ERROR 1264 (22003): Out of range value for column 'id1' at row 1

# 定义AUTO_INCREMENT列的方式
CREATE TABLE A1(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
CREATE TABLE A1(ID INT NOT NULL,PRIMARY KEY(ID));
CREATE TABLE A1(ID INT AUTO_INCREMENT NOT NULL,UNIQUE(ID));

3.1.2 小数类型

MySQL小数类型分为浮点数(float,double)和定点数(decimal)。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

(1)浮点数和定点数都可以用类型名称后加"(M,D)"的方式来进行表示。表示该值一共显示M位(整数位+小数位),其中D位位于小数点后面,支持四舍五入,一般浮点数不这样指定,非标准用法。而decimal在不指定精度时,默认的整数位为10,默认的小数位为0。

# 类型名称加(M,D)|(精度,标度) 
定义一个float(7,4)的列可以显示-999.9999;如果插入999.00005,近似结果为999.0001;

(2)浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,小数位会截断,并按四舍五入处理。

mysql> create table t1(id1 float(3,2),id2 double(3,2),id3 decimal(3,2));
Query OK, 0 rows affected (0.02 sec)
# double类型的id2字段插入的数据超出标度 小数位截断四舍五入
mysql> insert into t1 values(2.55,2.555,2.55);
mysql> select * from t1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 2.55 | 2.56 | 2.55 |
+------+------+------+
1 row in set (0.00 sec)
# decimal类型的id3字段插入的数据超出标度 会给出警告提示
mysql> insert into t1 values(2.55,2.55,2.555); 
Query OK, 1 row affected, 1 warning (0.01 sec)
# 提示id3字段的数据被截断处理
mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message                                  |
+-------+------+------------------------------------------+
| Note  | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 2.55 | 2.56 | 2.55 |
| 2.55 | 2.55 | 2.56 |
+------+------+------+
2 rows in set (0.00 sec)
# 更改数据类型,省略精度和标度
mysql> alter table t1 modify id1 float;
mysql> alter table t1 modify id2 double;
mysql> alter table t1 modify id3 decimal; 
# float,double省略精度和标度则会按照实际精度值显示 decimal省略后精度标度默认为(10,0)
mysql> desc t1;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id1   | float         | YES  |     | NULL    |       |
| id2   | double        | YES  |     | NULL    |       |
| id3   | decimal(10,0) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 插入数据
mysql> insert into t1 values(2.555,2.555,2.555);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message                                  |
+-------+------+------------------------------------------+
| Note  | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)
# float和double类型的字段值没有发生影响,decimal类型的字段发生截断处理
mysql> select * from t1;
+-------+-------+------+
| id1   | id2   | id3  |
+-------+-------+------+
|  2.55 |  2.56 |    3 |
|  2.55 |  2.55 |    3 |
| 2.555 | 2.555 |    3 |
+-------+-------+------+

3.1.3 BIT(位)类型

(1)用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写则默认为1位。对于位字段,直接使用SELECT命令将不会看到结果,可以用bin() (显示为二进制格式)或者hex()函数进行读取。

(2)数据以十进制进行插入,首先转化为二进制,如果转化后的位数小于实际定义的位数,则插入失败。

# 省略插入的位数默认为1位
mysql> create table t1(id1 BIT);
Query OK, 0 rows affected (0.02 sec)
# 插入十进制5,会被mysql转化为101进行插入
mysql> insert into t1 values(5);
# 二进制数据位数101大于定义的BIT位数范围,报错
ERROR 1406 (22001): Data too long for column 'id1' at row 1
# 修改BIT位数
mysql> alter table t1 modify id1 BIT(4);
# 再次插入数据5
mysql> insert into t1 values(5);
# 直接使用SELECT默认看不到结果
mysql> select * from t1;
+------+
| id1  |
+------+
|     |
+------+

mysql> select bin(id1) from t1;
+----------+
| bin(id1) |
+----------+
| 101      |
+----------+

mysql> insert into t1 values(12);
mysql> select bin(id1) from t1;
+----------+
| bin(id1) |
+----------+
| 101      |
| 1100     |
+----------+

3.2 字符串

MySQL中的字符串包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等字符串类型。

(1)char和varchar,常用来保存较短的字符串,两者的主要区别在于存储方式的不同:char列的长度固定为创建表时声明的长度,即一旦定义后及时存储数据长度不满足也会(空字符填充)占定义的长度空间;而varchar列中的值为可变字符串,存储长度根据字符串的长度变化。另外,在检索的时候,char列删除了尾部的空格,而varchar则保留这些空格。

mysql> create table vc(v varchar(4),c char(4)); 
# 插入'ab '
mysql> insert into vc values('ab ','ab ');
# char类型字段删除了尾部的空格
mysql> select *,length(v),length(c) from vc;
+------+------+-----------+-----------+
| v    | c    | length(v) | length(c) |
+------+------+-----------+-----------+
| ab   | ab   |         3 |         2 |
+------+------+-----------+-----------+

mysql> select concat(v,'+'),concat(c,'+'),length(v),length(c) from vc; 
+---------------+---------------+-----------+-----------+
| concat(v,'+') | concat(c,'+') | length(v) | length(c) |
+---------------+---------------+-----------+-----------+
| ab +          | ab+           |         3 |         2 |
+---------------+---------------+-----------+-----------+

(2)ENUM类型插入数据的时候是忽略大小写的,对于插入的数据不再ENUM指定范围内的值时,会报错。

# 可以看出枚举量下标从1开始
mysql> alter table t add gender enum('M','F');

mysql> insert into t values(10, 2);

mysql> select * from t;
+------+--------+
| id   | gender |
+------+--------+
|   20 | NULL   |
|   10 | F      |
+------+--------+
2 rows in set (0.00 sec)

mysql> insert into t values(30, 1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+------+--------+
| id   | gender |
+------+--------+
|   20 | NULL   |
|   10 | F      |
|   30 | M      |
+------+--------+

3.3 日期和时间类型

这些类型的主要区别如下:

  • 表示年月日,通常用DATE表示。
  • 年月日时分秒,通常用DATETIME表示。
  • 只用来表示时分秒,通常用TIME表示。
  • 如果要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP表示。
  • 如果只表示年份,可以用YEAR来表示,它比DATE占用更少的空间。YEAR有2位或4位格式的年。默认是4位格式。在两位格式中允许的值是7069(19702069)。MySQL以YYYY格式显示YEAR值。

从上表可以看出,每种日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。

(1)TIMESTAMP相关特性

  • MySQL会给表中的第一个TIMESTAMP类型的字段设置默认值为系统日期,如果有第二个TIMESTAMP类型,则默认值设置为0值
  • TIMESTAMP和在不同的时区下显示的时间也是不同的。
  • TIMESTAMP支持的事件范围较小,如果插入的时间范围超出,则会报错。
  • 如果在一个TIMESTAMP列中插入NULL,则该列值自动设置为当前的日期和时间。在插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间。
mysql> create table t1(d date,t time,dt datetime);
mysql> desc t1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
# 使用now函数插入当前系统时间
mysql> insert into t1 values(now(),now(),now());
# datetime是date和time的结合体,所以根据实际需要设置相应字段类型
mysql> select * from t1;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2020-07-17 | 20:01:33 | 2020-07-17 20:01:33 |
+------------+----------+---------------------+

# timestamp相关知识讲解
mysql> create table t(ts timestamp);

mysql> show create table t\G;
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
# 增加同类型字段
mysql> alter table t add ts1 timestamp;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
# MySQL只会为第一个timestamp设置默认值
mysql> desc t;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type      | Null | Key | Default             | Extra                       |
+-------+-----------+------+-----+---------------------+-----------------------------+
| ts    | timestamp | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| ts1   | timestamp | NO   |     | 0000-00-00 00:00:00 |                             |
+-------+-----------+------+-----+---------------------+-----------------------------+

# 查看当前时区 中国默认东八区
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

mysql> insert into t values(now(),now());

mysql> select * from t;
+---------------------+---------------------+
| ts                  | ts1                 |
+---------------------+---------------------+
| 2020-07-17 20:11:28 | 2020-07-17 20:11:28 |
+---------------------+---------------------+

mysql> set time_zone='+9:00';
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +09:00 |
+---------------+--------+
# 时间自动发生了变化
mysql> select * from t;
+---------------------+---------------------+
| ts                  | ts1                 |
+---------------------+---------------------+
| 2020-07-17 21:11:28 | 2020-07-17 21:11:28 |
+---------------------+---------------------+

# 插入时间范围大于TIMESTAMP的范围会报错
mysql> insert into t(t) values('2099-09-09 21:00:00');
ERROR 1054 (42S22): Unknown column 't' in 'field list'

#插入NULL值,则该列值自动设置为当前的日期和时间
mysql> insert into t values(NULL,NULL);
mysql> select * from t;
+---------------------+---------------------+
| ts                  | ts1                 |
+---------------------+---------------------+
| 2020-07-17 21:45:32 | 2020-07-17 21:45:32 |
| 2020-07-17 21:47:25 | 2020-07-17 21:47:25 |
+---------------------+---------------------+

(2)datetime相关特性

  • YYYY-MM-DD HH:MM:SS或YY-MM-DD HH:MM:SS格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的分隔符。
  • YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的没有间隔符的字符串或数字,假定字符串或数字对于日期类型是有意义的,则会自动被解释为相应的时间。
  • 函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE
mysql> create table t6(dt datetime);

mysql> insert into t6 values('2020-07-17 20:20:20');

mysql> insert into t6 values('2020/07/17 20*20*20');    

mysql> insert into t6 values('20200717202020');      

mysql> insert into t6 values(20200717202020); 

mysql> select * from t6;
+---------------------+
| dt                  |
+---------------------+
| 2020-07-17 20:20:20 |
| 2020-07-17 20:20:20 |
| 2020-07-17 20:20:20 |
| 2020-07-17 20:20:20 |
+---------------------+

标签:NULL,20,MySQL,数据类型,支持,t1,sec,mysql,id1
来源: https://www.cnblogs.com/wubug/p/13660077.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有