MySQL 数据类型详情

目录
  • 1、数值类型
    • 1.1、数值类型分类
      • 1.1.1、浮点数
      • 1.1.2、位类型
      • 1.1.3、时间日期类型
      • 1.1.4、字符串类型
      • 1.1.5、ENUM 类型
      • 1.1.6、SET类型

1、数值类型

1.1、数值类型分类

  • 严格数值类型(INTEGERSMALLINTDECIMAL NUMERIC
  • 近似数值数据类型(FLOATREAL DOUBLE PRECISION

MySQL中数值类型:

整数类型 字节  最小值 最大值

TINYINT
1
有符号-128

无符号 0


有符号 127

无符号 255


SMALLINT


有符号-32768

无符号 0


有符号 32767

无符号 65535 


MEDIUMINT 


有符号-8388608

无符号 0


有符号 8388607

无符号 1677215


INT、INTEGER
4
有符号-2147483648

无符号 0 


有符号 2147483647

无符号 4294967295


BIGINT
8
有符号-9223372036854775808

无符号 0


有符号 9223372036854775807

无符号 18446744073709551615


浮点数类型

字节
最小值 最大值

FLOAT 


±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 


1000-01-01 

9999-12-31 

DATETIME


1000-01-01 00:00:00

9999-12-31 23:59:59 

TIMESTAMP
4
19700101080001 

2038 年的某个时刻 

TIME 


-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 个字节。
SetEMUN区别在于,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,插入不存在的定义列时,会报异常插入失败

(0)

相关推荐

  • MySQL为id选择合适的数据类型

    选择 id 的数据类型,不仅仅需要考虑数据存储类型,还需要了解 MySQL 对该种类型如何计算和比较.例如,MySQL 将 ENUM 和 SET 类型在内部使用整型存储,但是在字符串场景下会当做字符串进行比较.一旦选择了 id 的数据类型后,需要保证引用 id 的相关数据表的数据类型一致,而且是完全一致,这包括属性,例如长度.是否有符号!如果混用不同的数据类型可能导致性能问题,即便是没有性能问题,在进行比较时的隐式数据转换可能导致难以捉摸的错误.而如果在实际开发过程中忘记了数据类型不同这个问题,

  • MySql数据类型教程示例详解

    目录 1.简要概述 2. MySQL数据类型详解 1) 字符串类型 2) 整数类型 3)浮点数类型 4)日期/时间类型 1.简要概述 为什么要开通MySQL这个学习板块呢?因为这是一名数据分析师必要的一项技能.分析数据什么最重要?当然是数据,既然如此!在数据呈现爆发式增长的年代,怎么能够不学学数据库呢?其实这也是很多读者朋友希望看到的,也是他们建议我写的. 难者不会,会者不难!其实网上很多MySQL的总结文章,不可否认,知识点写的都很全,但是呢!这个只是会使用MySQL数据库的朋友的一个查询手册

  • MySQL 5.7常见数据类型

    --<深入浅出MySQL(第二版)>笔记 数值类型 整数类型 字节 最小值 最大值 TINYINT 1 有符号 -128:无符号 0 有符号 127:无符号 255 SMALLINT 2 有符号 -2^16:无符号 0 有符号 2^16-1:无符号 2^17-1 MEDIUMINT 3 有符号 -2^24:无符号 0 有符号 2^24-1:无符号 2^25-1 INT\INTEGER 4 有符号 -2^32:无符号 0 有符号 2^32-1:无符号 2^33-1 BIGINT 8 有符号 -2

  • mysql 数据类型转换的实现

    一.问题 有一张如下图所示的表,需要我们查出 result 值大于 reference_high值的数据 然后我们写了下面的SQL查询语句 SELECT i.result,i.reference_high FROM report_item i LEFT JOIN report r ON r.id=i.report_id WHERE r.org_id=54 AND r.report_status=1 AND r.add_date BETWEEN '2020-12-01' AND '2020-12-

  • MySQL数据类型DECIMAL用法详解

    MySQLDECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: column_name DECIMAL(P,D); 在上面的语法中: P是表示有效数字数的精度.P范围为1〜65. D是表示小数点后的位数.D的范围是0~30.MySQL要求D小于或等于(<=)P. DECIMAL(P,D)表示列可以存储D位小数的P位数.十进制列的实际范围取决于精度和刻度. 与IN

  • MySQL 数据类型选择原则

    小而美 通常来说,尽可能使用占用存储空间小的数据类型来存储数据.这类数据类型通常也会更快,并且占用的磁盘空间.内存乃至缓存都更小,而且占用的 CPU 处理周期也少. 但是,务必准确估计要存储的数据值的范围.因为在数据表结构的多个地方扩充数据范围会是一个痛苦且耗时的过程.如果在犹豫哪种数据类型合适,那就选择你认为不会超出范围的最小空间的类型(在系统早期或者数据表 数据不多的情况下也可以进行调整). 简单至上 数据类型越简单意味着处理数据的 CPU 周期越少.例如,整型相比字符型而言,处理起来更容易

  • mysql中decimal数据类型小数位填充问题详解

    前言 在开发过程中,我们往往会用到decimal数据类型.因为decimal是MySQL中存在的精准数据类型. MySQL中的数据类型有:float,double等非精准数据类型和decimal这种精准. 区别:float,double等非精准类型,在DB中保存的是近似值. Decimal则以字符串的形式保存精确的原始数值. decimal介绍: decimal(a,b) 其中:a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38.b指定小数点右边可以存储的十进制数字的最大个数

  • mysql decimal数据类型转换的实现

    最近在工作遇到数据库中存的数据类型是: decimal(14,4) 遇到的问题是: 当我使用python 读取到内存中时,总是带着 decimal字符, 再写入其它mysql表中时,数据类型为int型,导致数据入库不成功. import pymysql # 创建数据库连接 con = pymysql.connect() sql = '''select created_time from schma.table LIMIT 10''' try: cur = con.cursor(cursor=py

  • MySQL 数据类型详情

    目录 1.数值类型 1.1.数值类型分类 1.1.1.浮点数 1.1.2.位类型 1.1.3.时间日期类型 1.1.4.字符串类型 1.1.5.ENUM 类型 1.1.6.SET类型 1.数值类型 1.1.数值类型分类 严格数值类型(INTEGER.SMALLINT.DECIMAL 和 NUMERIC) 近似数值数据类型(FLOAT.REAL 和 DOUBLE PRECISION) MySQL中数值类型: 整数类型 字节 最小值 最大值 TINYINT 1 有符号-128 无符号 0 有符号 1

  • 详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义

    同事问MySQL数据类型DECIMAL(N,M)中N和M分别表示什么含义,M不用说,显然是小数点后的小数位数,但这个N究竟是小数点之前的最大位数,还是加上小数部分后的最大位数?这个还真记不清了.于是乎,创建测试表验证了一番,结果如下: 测试表,seller_cost字段定义为decimal(14,2) CREATE TABLE `test_decimal` ( `id` int(11) NOT NULL, `seller_cost` decimal(14,2) DEFAULT NULL ) EN

  • MySQL数据类型中DECIMAL的用法实例详解

    MySQL数据类型中DECIMAL的用法实例详解 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮点列的值被四舍五入到这个列所指定的十进制数.如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2.如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6. 这表示应该定义具有足够位数的浮点列以便

  • Java数据类型与MySql数据类型对照表

    本文讲述了Java数据类型与MySql数据类型对照表.分享给大家供大家参考,具体如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNE

  • MySQL 数据类型 详解

    1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~25

  • MySQL数据类型和常用字段属性总结

    前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键.M前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键.MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如大小.类型及格式. 这里先总结数据类型.MySQL中的数据类型

  • 详解MySQL数据类型int(M)中M的含义

    介绍 MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) 占用的存储空间比 int(4) 要小, int(4) 占用的存储空间比 int(8) 小. 后来,参看 MySQL 手册,发现自己理解错了. int(M): M indicates the maximum display width for integer types. 在 integer

  • (MariaDB)MySQL数据类型和存储机制全面讲解

    1.1 数据类型概览 数据类型算是一种字段约束,它限制每个字段能存储什么样的数据.能存储多少数据.能存储的格式等.MySQL/MariaDB大致有5类数据类型,分别是:整形.浮点型.字符串类型.日期时间型以及特殊的ENUM和SET类型. 这5种数据类型的意义.限制和相关说明如下图所示: 各数据类型占用字节数,参见mariadb官方手册. 1.2 存储机制和操作方式 数据类型之所以能限定字段的数据存储长度,是因为在创建表时在内存中严格划定了地址空间,地址空间的长度是多少就能存储多少字节的数据.当然

  • mysql数据类型和字段属性原理与用法详解

    本文实例讲述了mysql数据类型和字段属性.分享给大家供大家参考,具体如下: 本文内容: 数据类型 数值类型 整数型 浮点型 定点型 日期时间类型 字符串类型 补充: 显示宽度与zerofll 记录长度 字段属性 空\不为空值:NULL.NOT NULL 主键:primary key 唯一键:unique key 自增长:auto_increment 默认值:default 字段描述:comment 补充: 复合键 首发日期:2018-04-08 数据类型: mysql的数据类型就是存储数据的类

  • 三种常用的MySQL 数据类型

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准SQL数值数据类型. 这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOUBLE PRECISION). 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词. BIT数据类型保存位字段值,并且支持MyIS

随机推荐