Mysql数据类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据类型相关的知识,希望对你有一定的参考价值。

mysql的数据类型

一、整数类型

整数类型

字节

取值范围

取值范围

tinyint

1

有符号 -128

无符号 0

有符号 127

无符号 255

Smallint

2

有符号 -32768

无符号 0

有符号 32767

无符号65535

mediumint

3

有符号 -8388608

无符号 0

有符号 8388607

无符号1677215

int,integer

4

有符号 -2147483648

无符号 0

有符号 2147483647

无符号4294967295

bigint

8

有符号 -263

无符号 0

有符号 263-1

无符号264-1

 

      tinyint、medinumint、int、bigint这个集中类型如果要是操作超出范围的话会显示"Out of range",对于数值的类型我们一般指定数据宽度比如:int(5),如果不指定数值的宽度则默认为int(11)。一般数值在小于指定的宽度的时候,就配合zerofill使用,就是字符空间用0填满。

创建一个数据库,里面包括id1和id2,指定数值宽度为int和int(5),SQL语句如下

mysql> create database lianxi;
Query OK, 1 row affected (0.32 sec)

mysql> use lianxi 

Database changed
mysql> create table t1(id1 int,id2 int(5));
Query OK, 0 rows affected (6.14 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.93 sec)
mysql> insert into t1(id1,id2) values(111111,111111);            插入111111数据

Query OK, 1 row affected (0.27 sec)

mysql> select * from t1;------------------------------>疑问1?
+--------+--------+
| id1    | id2    |
+--------+--------+
| 111111 | 111111 |
+--------+--------+
1 row in set (0.41 sec)

mysql> insert into t1(id1,id2) values(1111,1111);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t1;
+--------+--------+
| id1    | id2    |
+--------+--------+
| 111111 | 111111 |
|   1111 |   1111 |
+--------+--------+
2 rows in set (0.00 sec)

mysql> alter table t1 modify id1 int zerofill;------------------->zerofill让效果更加的明显。
Query OK, 2 rows affected (3.36 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------------+--------+
| id1        | id2    |
+------------+--------+
| 0000111111 | 111111 |
| 0000001111 |   1111 |
+------------+--------+
2 rows in set (0.00 sec)

mysql> alter table t1 modify id2 int(5) zerofill;
Query OK, 2 rows affected (0.41 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------------+--------+
| id1        | id2    |
+------------+--------+
| 0000111111 | 111111 |
| 0000001111 |  01111 |
+------------+--------+
2 rows in set (0.00 sec)

mysql> 

有很多人疑问int(5)后面的5是不是表示占用5个字节呢?那么疑问1又怎么解释呢?为什么会显示6个1呢?为什么我设置了5还会显示6个呢?

其实在int(m)中的m和你占的字节没有关系,我前面的表格中也写了int类型是4个字节,不管m是多少都是4个字节,那m是什么呢,在最后的一个select语句中我给id2添加了zerofill,是不是一目了然呢,不错,m就表示最少显示m个,为什么我输入4个1的时候没有填0呢?那是因为没有添加zerofill,但是系统在存储的时候是要添加0进去的。

对于小数MySQL有两种方式:浮点数和定点数

      浮点数:double(双精度)

                 float(单精度)

      定点数:decimal:定点数在mysql内部是用字符串形式存储的。所以要比浮点数更加精确,适合表示货币等精确数据。(摘自《深入浅出MySQL》)

mysql> create table t2(id1 float(5,2) default NULL,id2 double(5,2) NULL,id3 decimal(5,2) default NULL);

Query OK, 0 rows affected (1.04 sec)

mysql> desc t2;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id1   | float(5,2)   | YES  |     | NULL    |       |
| id2   | double(5,2)  | YES  |     | NULL    |       |
| id3   | decimal(5,2) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.97 sec)

mysql> 

我们使用的float和double的精度用法并不是标准的用法,所以精度要求很高的重要数据不建议使用

  无论是定点类型还是浮点类型,如果用户指定的精度超出范围,则会进行四舍五入处理。

BIT(位)类型,这个是用来存放二进制的数据,BIT(m)这里的m范围是1~64,读取的时候我们要使用bin()或者hex(),用select是查不出数据的。

 

二、日期时间类型

日期和时间类型

字节

最小值

最大值

Date年月日

4

1000-01-01

9999-12-31

Datetime年月日时分秒

8

1000-01-01 00:00:00

9999-12-31 23:59:59

Timestamp时区对应时间

4

19700101080001

20380119111407

Time单独表示时间

3

-838:59:59

838:59:59

Year单独表示年

1

1901

2155

 

DATE、TIME、DATETIME是经常使用的3中日期类型

mysql> create table t3(d date,t time,dt datetime);


Query OK, 0 rows affected (0.72 sec)

mysql> desc t3;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.19 sec)

mysql> insert into t3 values(now(),now(),now());
Query OK, 1 row affected, 1 warning (1.04 sec)

mysql> select * from t3;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2017-03-03 | 06:51:28 | 2017-03-03 06:51:28 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

mysql> 

还有就是TIMESTAMP,他的取值范围19700101080001到2038的某一天,范围相对比较小,而且这个和时区有关系。

 

三、字符串类型

字符串类型

字节

描述

char(m)

M

M为0-255之间的整数

varchar(m)

 

M为0-65535之间的整数,值的长度为+1个字节

tinytext

 

允许长度0-255字节,值为长度+2个字节

text

 

允许长度0-65535字节,值为长度+2个字节

mediumtext

 

允许长度0~167772150字节值为长度+3个字节

longtext

 

允许长度0~4294967295字节值为长度+4个字节

这个我们最常用到,我们谈谈char和varchar的区别:主要区别就是存储的方式不同char的长度固定为创建表时的声明的长度,而varchar是可变长字符串,在检索的时候,char删除了尾部的空格而varchar则保留这些空格。(摘自《深入浅出MySQL》)

mysql> create table t4(v varchar(4),c char(4));
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    24
Current database: lianxi

Query OK, 0 rows affected (0.88 sec)

mysql> insert into t4 values(ab ,ab );------------------------->这里要插入空格
Query OK, 1 row affected (0.30 sec)

mysql> select length(v),length(c) from t4;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
|         3 |         2 |--------------------------------->char类型少了个字节
+-----------+-----------+
1 row in set (0.09 sec)

mysql> select concat(v,+),concat(c,+) from t4;------------>添加+,让效果更佳明显
+---------------+---------------+
| concat(v,+) | concat(c,+) |
+---------------+---------------+
| ab +          | ab+           |
+---------------+---------------+
1 row in set (0.06 sec)

mysql> 

如果某一项中设置的是varchar(50)那么对英文当然是50那么对中文呢utf-8的中文占3个字节那么,这个varchar(50)是不是只能存16个汉字了? 不是这样的,mysql低版本之前是这样的,但是5.0以后就不是了mysql varchar(50)  不管中文还是英文都是存50个的,但是一个表中所有varchar字段的总长度跟编码有关,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2编码长度限制字符类型若为gbk,每个字符最多占2个字节字符类型若为utf8,每个字符最多占3个字节。

ENUM和SET类型:

enum一般是多选一,我们可以做性别选择,set是多个成员可以选择多个。

 

mysql> create table t5(sex enum(man,woman));

Query OK, 0 rows affected (0.11 sec)

mysql> insert into t5 values(man);
Query OK, 1 row affected (0.07 sec)

mysql> insert into t5 values(men);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> select * from t5;
+------+
| sex  |
+------+
| man  |
|      |
+------+
2 rows in set (0.00 sec)

mysql> show warnings;
Empty set (0.00 sec)

mysql> insert into t5 values(men);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column sex at row 1 |-------------------->看警告
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into t5 values(‘man,woman‘);
uery OK, 1 row affected, 1 warning (0.04 sec)

mysql> show warnings;

+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column ‘sex‘ at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> create table t6(raw set(a,b,c));

Query OK, 0 rows affected (0.08 sec)


mysql> insert into t6 values(a,b);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t6;
+------+
| raw  |
+------+
| a,b  |
+------+
1 row in set (0.00 sec)

 








以上是关于Mysql数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在代码片段中包含类型转换

对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

从mysql的片段中加载ListView

硬核!管理mysql数据库的工具

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段