MySQL 数据类型详情
作者:随风去远方 发布时间:2024-01-21 11:51:12
1、数值类型
1.1、数值类型分类
严格数值类型(
INTEGER
、SMALLINT
、DECIMAL
和NUMERIC
)近似数值数据类型(
FLOAT
、REAL
和DOUBLE PRECISION
)
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 | 有符号-9223372036854775808 无符号 0 | 有符号 9223372036854775807 无符号 18446744073709551615 |
浮点数类型 | 字节 | 最小值 | 最大值 |
FLOAT | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
定点数类型 | 字节 | 描述 | |
DEC(M,D), DECIMAL(M,D) | M+2 | 最大取值范围与 DOUBLE 相同,给定 DECIMAL 的有效取值范围由 M 和 D 决定 | |
位类型 | 字节 | 最小值 | 最大值 |
BIT(M) | 1~8 | BIT(1) | BIT(64) |
1.1.1、浮点数
浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值 decimal(10,0)
来进行操作,并且如果数据超越了精度和标度值,系统则会报错。
1.1.2、位类型
BIT(位)类型:范围从1-64,如果不写,默认为1位,对于此字段,直接使用select命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为16进制格式)函数进行读取
例:
mysql> desc t2;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id | bit(1) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t2 values(1);
Query OK, 1 row affected (0.05 sec)
mysql> select * from t2;
+------+
| id |
+------+
| |
+------+
1 row in set (0.00 sec)
mysql> select bin(id),hex(id) from t2;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1 | 1 |
+---------+---------+
1 row in set (0.03 sec)
bit
类型数据插入时,首先将值转换为二进制,如果允许,则进行插入,如果位数小于实际定义的位数,则插入失败。
例:如果在刚刚的那张表中插入2,实际转换为二进制为10,超出了bit(1)
的实际定义位数,就会报异常,将id定义为bit(2),在插入,就会成功
mysql> insert into t2 values(2);
ERROR 1406 (22001): Data too long for column 'id' at row 1
mysql> alter table t2 modify id bit(2);
Query OK, 1 row affected (0.67 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into t2 values(2);
Query OK, 1 row affected (0.03 sec)
mysql> select bin(id),hex(id) from t2;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1 | 1 |
| 10 | 2 |
+---------+---------+
2 rows in set (0.00 sec)
1.1.3、时间日期类型
1.1.3、时间日期类型
日期和时间类型 | 字节 | 最小值 | 最大值 |
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 | 2038 年的某个时刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
DATE
:用来表示年月日DATETIME
:用来表示年月日时分秒(支持插入格式:2007-9-3 12:10:10'、'2007/9/3 12+10+10'、'20070903121010'、20070903121010 等)TIME
:只用来表示时分秒TIMESTAMP
:经常插入或者更新日期为当前系统时间YEAR
:表示年
例1:创建时间表(dt),字段分别为 date、time、datetime 三种日期类型,并插入数值,查看显示结果
mysql> create table dt(d date,t time,dt datetime);
Query OK, 0 rows affected (0.23 sec)
mysql> insert into dt values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.05 sec)
mysql> select * from dt;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2021-05-13 | 10:14:07 | 2021-05-13 10:14:07 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
例2:创建测试表t,字段id1为TIMESTAMP类型,插入空值,并显示
mysql> create table t(id1 timestamp);
Query OK, 0 rows affected (0.22 sec)
mysql> insert into t values(null);
Query OK, 1 row affected (0.05 sec)
mysql> select * from t;
+---------------------+
| id1 |
+---------------------+
| 2021-05-13 10:18:05 |
+---------------------+
1 row in set (0.00 sec)
可以发现,系统给 id1 自动创建了默认值 CURRENT_TIMESTAMP
(系统日期)。(注意,MySQL
只给表中的第一个TIMESTAMP
字段设置默认值为系统日期,如果有第二个TIMESTAMP
类型,则默认值设置为0值)
例3:解释如上说明
mysql> alter table t add column id2 timestamp;
Query OK, 0 rows affected (0.48 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t \G;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
1.1.4、字符串类型
字符串类型 | 字节 | 描述及存储需求 |
CHAR(M) | M | M 为 0~255 之间的整数 |
VARCHAR(M) | M 为 0~65535 之间的整数,值的长度+1 个字节 | |
TINYBLOB | 允许长度 0~255 字节,值的长度+1 个字节 | |
BLOB | 允许长度 0~65535 字节,值的长度+2 个字节 | |
MEDIUMBLOB | 允许长度 0~167772150 字节,值的长度+3 个字节 | |
LONGBLOB | 允许长度 0~4294967295 字节,值的长度+4 个字节 | |
TINYTEXT | 允许长度 0~255 字节,值的长度+2 个字节 | |
TEXT | 允许长度 0~65535 字节,值的长度+2 个字节 | |
MEDIUMTEXT | 允许长度 0~167772150 字节,值的长度+3 个字节 | |
LONGTEXT | 允许长度 0~4294967295 字节,值的长度+4 个字节 | |
VARBINARY(M) | 允许长度 0~M 个字节的变长字节字符串,值的长度+1 个字节 | |
BINARY(M) | M | 允许长度 0~M 个字节的定长字节字符串 |
CHAR
:固定长度,在检索时,会删除尾部的空格VARCHAR
:可变长字符串,在检索时,会保留这些空格
例:
mysql> create table varc(v varchar(4),c char(4));
Query OK, 0 rows affected (0.20 sec)
mysql> insert into varc values('abc ','abc ');
Query OK, 1 row affected (0.03 sec)
mysql> select length(v),length(c) from varc;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
| 4 | 3 |
+-----------+-----------+
1 row in set (0.01 sec)
mysql> select concat(v,'+'),concat(c,'+') from varc;
+---------------+---------------+
| concat(v,'+') | concat(c,'+') |
+---------------+---------------+
| abc + | abc+ |
+---------------+---------------+
1 row in set (0.00 sec)
BINARY
:类似于char
,但他是二进制字符串VARBINARY
:类似于varchar
,单他是存储二进制字符串
例:
mysql> create table bina(c binary(3));
Query OK, 0 rows affected (0.22 sec)
mysql> insert into t set c='a';
ERROR 1054 (42S22): Unknown column 'c' in 'field list'
mysql> insert into bina set c='a';
Query OK, 1 row affected (0.05 sec)
mysql> select *,hex(c),c='a',c='a\0',c='a\0\0' from bina;
+------+--------+-------+---------+-----------+
| c | hex(c) | c='a' | c='a\0' | c='a\0\0' |
+------+--------+-------+---------+-----------+
| a | 610000 | 0 | 0 | 1 |
+------+--------+-------+---------+-----------+
1 row in set (0.00 sec)
可以发现,当保存 BINARY
值时,在值的最后通过填充“0x00”(零字节)以达到指定的字段定义长度。从上例中看出,对于一个 BINARY(3)
列,当插入时'a'变为'a\0\0'
1.1.5、ENUM 类型
ENUM
:对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。
例:
mysql> create table gend(gender enum('M','F'));
Query OK, 0 rows affected (0.20 sec)
mysql> insert into gend values('M'),('F'),('1'),(null);
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from gend;
+--------+
| gender |
+--------+
| M |
| F |
| M |
| NULL |
+--------+
4 rows in set (0.00 sec)
由此可以看出,枚举类型的插入值得时候,是忽略大小写的,初始下标从1开始;查询的时候会转换为大写,也可以插入空(null)
1.1.6、SET类型
SET
:字符串对象,里面可以包含64个成员,成员不同,存储上也有所不同
1~8 成员的集合,占 1 个字节。
9~16 成员的集合,占 2 个字节。
17~24 成员的集合,占 3 个字节。
25~32 成员的集合,占 4 个字节。
33~64 成员的集合,占 8 个字节。Set
和EMUN
区别在于,Set一次可以选则多个成员,而ENUM则只能选择一个
例:
mysql> create table st(col set('a','b','c','d'));
Query OK, 0 rows affected (0.20 sec)
mysql> insert into st values('a,b'),('a,d,a'),('a,c'),('a');
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> insert into st values('f');
ERROR 1265 (01000): Data truncated for column 'col' at row 1
mysql> insert into st values(null);
Query OK, 1 row affected (0.03 sec)
mysql> select * from st;
+------+
| col |
+------+
| a,b |
| a,d |
| a,c |
| a |
| NULL |
+------+
5 rows in set (0.00 sec)
由此可以看出,set是可以插入多个成员的,也可以插入null,插入不存在的定义列时,会报异常插入失败
来源:https://www.cnblogs.com/19930521zhang/p/14756392.html


猜你喜欢
- 1、引言通过参考相关博客对hdf5格式简要介绍。hdf5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持
- 1.Order By原理MySQL的Order By操作用于排序,并且会有多种不同的排序算法,他们的性能都是不一样的。假设有一个表,建表的s
- 前言很多中后台业务的系统中,表格是最高频的组件之一,其中一般包括搜索条件、表格展示、表格操作列、分页等。那么我们二次封装的这个表格组件就需要
- 项目地址:https://github.com/astak16/shortlink错误处理在处理业务逻辑时,如果出错误了,需要统一处理错误响
- 本文实例为大家分享了用户登录系统python实现代码,供大家参考,具体内容如 * 意事项: 1、使用python3执行程序。按提示输入1或2,
- 1、说明(1)写函数时,可以为每个参数指定默认值。当调用函数为参数提供实际参数时,Python将使用指定的实际参数;否则,将使用参数的默认值
- 今天偶然看到“一个有将近两年的div + CSS 开发经验和历史,曾经是Web标准绝对拥趸的同志”在自己的blog上发表放弃div+css的
- 在ASP的实际操作中,总会发生这样的情况,如在银行,从我的帐户往费文华的帐户划款,我的帐户显示已经划出,但因银行的系统出现故障,导致费文华帐
- 如IP为192.168.1.111现要截取第二个.之前的值,得到结果192.168,很多网站都只显示前面2个值 &nb
- 1.python 和 pytorch的数据类型区别在PyTorch中无法展示字符串,因此表达字符串,需要将其转换成编码的类型,比如one_h
- python svm实现手写数字识别——直接可用最近在做个围棋识别的项目,需要识别下面的数字,如下图:我发现现在网上很多代码是良莠不齐,…真
- 可实现功能:1.随机生成一个整数。2.随机生成任意范围内的一个整数。3.随机生成指定长度的整数组4.随机生成指定长度的任意范围的整数组5.随
- 目前很多公司业务已经上云,使用了大量的云主机。当前大多数云厂商的云主机公网都是采用的eip,也就是内网和外网使用的同一张网卡,所以流量全部经
- 这样就将你所有微信好友的信息都返回了,我们并不需要这么多的信息,我们选取一些信息存储到 csv 文件中注意:返回的信息是一个 list,其中
- 一、Slice数据结构是什么?切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕
- 如下所示:#待处理列表A= [1,2,3,4,5]#移动次数a = 3右移比较简单for i in range(a): A.insert(0
- 本节重点掌握Cpython的GIL解释器锁的工作机制掌握GIL与互斥锁掌握Cpython下多线程与多进程各自的应用场景本节时长需控制在45分
- 使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体,打包位置是
- 这里其实是通过获取视频截图的方式获得大小的下面列举两个小demoimport cv2 #引入模块 获取视频截图的from PIL impor
- overflow:hidden 用在div上时很好用,但直接用在td上,好像没有任何效果。td中的文本过长时依然自动换了一行像下面这要设定一