ps:此随笔基于mysql 5.7.*版本。

补充:

  • UNSIGNED:所有整数类型都可以有一个可选(非标准)UNSIGNED属性。无符号类型可用于在列中仅允许非负数存在,或者当开发者需要该列的较大数值范围时。例如,如果一个INT类型的列使用UNSIGNED属性,则该列范围的大小相同,但其端点向上移动,从-2147483648~2147483647到0~4294967295。浮点和定点类型也可以使用UNSIGNED属性。与整数类型一样,此属性可防止将负值存储在列中。与整数类型不同,列值的上限保持不变。
  • ZEROFILL:当数值显示宽度比定义的列指定的宽度小时,空格的默认填充将替换为0,即会在数值前面自动进行补0操作。如果ZEROFILL为数字列所指定,MySQL会自动为该列添加UNSIGNED属性。

以test表为例,演示效果。

id字段具有ZEROFILL属性时,创建的test表如下:

添加数据并查询该表,可以发现id字段不足指定宽度的值左侧全部被0填充。

修改该表,去掉id字段的ZEROFILL属性,再次进行查询。

注意:对于表达式或查询具有ZEROFILL属性的列,该属性将被忽略。如果将大于显示宽度的值存储在具有具有ZEROFILL属性的整数列中,当MySQL为某些复杂的连接生成临时表时,可能会出现问题。

数值数据类型

整数类型(精确值)

MySQL支持SQL标准整数类型INTEGER(或INT)和SMALLINT。作为标准的扩展,MySQL还支持整数类型TINYINT、MEDIUMINT和 BIGINT。下表显示了每种整数类型所需的存储空间和范围。

类型 存储所需字节 最小值(带符号) 最大值(带符号) 最小值(无符号) 最大值(无符号)
TINYINT 1 -128 127 0 255
SMALLINT 2 -32768 32767 0 65535
MEDIUMINT 3 -8388608 8388607 0 16777215
INT 4 -2147483648 2147483647 0 4294967295
BIGINT 8 -9223372036854775808 -9223372036854775807 0 18446744073709551615
  • TINYINT

格式:TINYINT[(M)] [UNSIGNED] [ZEROFILL]

一个非常小的整数。有符号范围-128~127。无符号范围是0~255。

  • SMALLINT

格式:SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

一个小整数。有符号范围-32768~32767。无符号范围是0~65535。

  • MEDIUMINT

格式:MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

一个中等大小的整数。有符号范围-8388608~8388607。无符号范围是0~16777215。

  • INT(等同于INTEGER)

格式:INT[(M)] [UNSIGNED] [ZEROFILL]

一个正常大小的整数。有符号范围-2147483648~2147483647。无符号范围是0~4294967295。

  • BIGINT

格式:BIGINT[(M)] [UNSIGNED] [ZEROFILL]

一个大整数。有符号范围-9223372036854775808~9223372036854775807。无符号范围是0~18446744073709551615。

定点类型(精确值)

DECIMAL和NUMERIC类型存储精确的数字数据值。当需要的精度很重要时使用这些类型,例如货币数据。在MySQL中,NUMERIC被实现为DECIMAL,所以以下关于DECIMAL的语法同样适用于NUMERIC。下表显示了每种定点类型所需的存储空间。此处暂不列出范围。

类型 存储所需字节
DECIMAL 不定长(长度可变)
NUMERIC 不定长(长度可变)
  • DECIMAL

格式:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

一个压缩的”精确”定点数。M是总位数(精度),M的范围为1~65。D是小数点后的位数(小数位数),D的范围为0~30。小数点(".")和负数符号("-")不计入M。如果D为0,则值没有小数点或小数部分。最大位数(M)为65。支持的最大小数位数(D)为30。如果D省略,则默认为0。如果M被省略,默认值为10。

注意:如果指定UNISIGNED,则不允许负值。所有带有列的基本计算 ("+","-","*","/"),DECIMAL都以65位的精度完成

浮点类型(近似值)

FLOAT和DOUBLE类型表示近似数值数据值。下表显示了每种浮点类型所需的存储空间。此处暂不列出范围。

类型 存储所需字节
FLOAT 4
DOUBLE 8
  • FLOAT

格式1:FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

一个小的(单精度)浮点数。允许的值为-3.402823466E+38~-1.175494351E-38、0和1.175494351E-38~3.402823466E+38。这些是基于 IEEE标准的理论限制。根据不同的硬件或操作系统,实际范围可能会稍小一些。FLOAT(M,D)是一个非标准的MySQL扩展。M是总位数,D是小数点后的位数。如果省略M和D,则将值存储在硬件允许的范围内。单精度浮点数精确到大约7位小数。

注意:如果指定UNISIGNED,则不允许负值。同时,使用FLOAT可能会导致一些意想不到的问题,因为MySQL中的所有计算都是以双精度完成的。

格式2:FLOAT[(P)] [UNSIGNED] [ZEROFILL]

一个浮点数。p表示以位为单位的精度,但MySQL仅使用此值来确定是使用FLOAT还是DOUBLE用于生成的数据类型。如果p是从0到24,则数据类型变为FLOAT无M或D值。如果p是从25到53,则数据类型变为DOUBLE无M或D值。结果的范围与一般的单精度FLOAT或双精度数据类型相同。

  • DOUBLE

格式:DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

一个正常大小(双精度)的浮点数。允许的值为-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。这些是基于IEEE标准的理论限制。根据不同的硬件或操作系统,实际范围可能会稍小一些。DOUBLE(M,D)是一个非标准的MySQL扩展。

注意:如果指定UNISIGNED,则不允许负值。

位值类型

BIT数据类型用于存储位值。这种类型允许存储位值。

  • BIT

格式:BIT[(M)] [UNSIGNED] [ZEROFILL]

位值类型。M表示每个值的位数,从1到64。如果M省略,则默认为1。

日期和时间数据类型

DATE、DATETIME和TIMESTAMP类型

  • DATE

格式:DATE

日期类型。支持的范围为"1000-01-01"到"9999-12-31"。MySQL以"YYYY-MM-DD"格式显示日期值,但允许使用字符串或数字将值分配给日期列。

  • DATETIME

格式:DATETIME[(fsp)]

日期和时间的组合。支持的范围是"1000-01-01 00:00:00.000000"到"9999-12-31 23:59:59.99999"。MySQL以"YYYY-MM-DD hh:MM:ss[.fraction]"格式显示日期时间值,但允许使用字符串或数字将值分配给日期时间列。可以给出0~6范围内的可选fsp值,用来指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。

  • TIMESTAMP

格式:TIMESTAMP[(fsp)]

时间戳。范围为"1970-01-01 00:00:01.000000"UTC到"2038-01-19 03:14:07.9999"UTC。时间戳值存储为自历元(1970-01-01 00:00:00 UTC)以来的秒数。时间戳不能表示值"1970-01-01 00:00:00",因为这相当于从纪元开始的0秒,而值0保留用于表示"0000-00-00 00:00-00",即“零”时间戳值。可以给出0~6范围内的可选fsp值,用来指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。

时间类型

MySQL以"hh:mm:ss"格式检索和显示时间值(对于大的小时值,则以"hhh:mm:ss"形式)。时间值的范围可以从"-838:59:59"到"838:59:59"。小时部分可能大一些或小一些,因为时间类型不仅可用于表示一天中的时间(必须小于24小时),还可用于表示两个事件之间的经过时间或时间间隔(可能远大于24小时,甚至为负)。

格式:TIME[(fsp)]

一段时间。范围为"-838:59:59.000000”到“838:59:59.00000"。MySQL以"hh:mm:ss[.fraction]"格式显示时间值,但允许使用字符串或数字将值分配给时间列。可以给出0~6范围内的可选fsp值,以指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。

年份类型

该YEAR类型是用于表示年份值的1字节类型。可以将其声明为YEAR具有4个字符的隐式显示宽度,或者等效地声明为YEAR(4)具有显式显示宽度。

格式:YEAR[(4)]

4位格式的年份。MySQL以YYYY格式显示年份值,但允许使用字符串或数字将值分配给年份列。值显示为1901~2155或是0000。此外,YEAR(2)数据类型已被弃用,MySQL 5.7.5版本中已删除对它的支持。

字符串数据类型

CHAR和VARCHAR类型

  • CHAR

格式:[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]

一个固定长度的字符串,在存储时总是用空格右填充到指定的长度。M表示以字符为单位的列长度。M的范围是0~255。如果M省略,则长度为1。

注意:除非启用严格的SQL模式,CHAR否则检索值时将删除尾随空格。

  • VARCHAR

格式:[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]

一个可变长度的字符串。M表示最大列长度(以字符为单位),且范围是0~65535。VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列中共享)和所使用的字符集。例如,utf8字符每个字符最多需要三个字节,因此使用utf8字符串集的VARCHAR列最多可以声明为21844个字符。

注意:MySQL遵循标准SQL规范,并且不会从VARCHAR值中删除尾随空格。

BINARY和VARBINARY类型

  • BINARY

格式:BINARY[(M)]

该BINARY类型与CHAR类型类似,但存储的是二进制字节字符串而不是非二进制字符串。可选长度M表示以字节为单位的列长度。如果省略,M则默认为1。

  • VARBINARY

格式:VARBINARY(M)

该VARBINARY类型与VARCHAR类型类似,但存储的是二进制字节字符串而不是非二进制字符串。M表示以字节为单位的最大列长度。

BLOB和TEXT类型

  • BLOB

BLOB是一个二进制大对象,可以保存可变数量的数据。四种BLOB类型是TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。

格式:BLOB[(M)]

最大长度为65535(216−1)字节。每个BLOB值使用2字节长度前缀存储,该前缀指示值中的字节数。对于这种类型,可以给出可选长度M。如果这样做了,MySQL会将列创建为最小的BLOB类型,该类型足够大,可以容纳M字节长的值。其他同类型如TINYBLOB、MEDIUMBLOB和LONGBLOB与之类似。

  • TEXT

这四种文本类型是TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。它们对应于四种BLOB类型,具有相同的最大长度和存储要求

格式:TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]

TEXT最大长度为65535 (216−1)个字符的列。如果值包含多字节字符,则有效最大长度较小。每个文本值使用2字节长度的前缀存储,该前缀指示值中的字节数。对于这种类型,可以给出可选长度M。如果这样做了,MySQL会将列创建为最小的文本类型,其大小足以容纳M个字符长的值。其他同类型如TINYTEXT、MEDIUMTEXT和LONGTEXT与之类似。

枚举类型

ENUM是一个字符串对象,其值选自创建表时列规范中明确枚举的允许值列表。

  • ENUM

格式:ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]

一个枚举。只能有一个值的字符串对象,从值列表"value1"、"value2"、"NULL"或特殊的错误值中选择。枚举值在内部表示为整数。一个ENUM列最多可以有65535个不同的元素(实际限制小于3000)。

SET类型

SET是一个字符串对象,可以有零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。 SET包含多个集合成员的列值使用逗号","分隔的成员指定。这样做的结果是SET成员值本身不应包含逗号。

格式:SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]

一个集合。一个字符串对象,可以有零个或多个值,每个值必须从值列表"value1"、"value2"中选择。集合值在内部表示为整数。

注:部分内容参考自MySQL官方手册。地址:https://dev.mysql.com/doc/refman/5.7/en/

MySQL学习(2)---MySQL数据类型的更多相关文章

  1. MySQL学习笔记-MySQL体系结构总览

    MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...

  2. MySQL学习(4)---MySQL索引

    ps:没有特殊说明,此随笔中默认采用innoDB存储引擎中的索引,且索引都是指B+树(多路平衡搜索树)结构组织的索引.其中聚集索引.复合索引.前缀索引.唯一索引默认都是使用B+树,统称为索引. 索引概 ...

  3. 我的MYSQL学习心得 mysql的权限管理

    这一篇<我的MYSQL学习心得(十三)>将会讲解MYSQL的用户管理 在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有: 1.user表 2.db表 ...

  4. 我的MYSQL学习心得 mysql日志

    这一篇<我的MYSQL学习心得(十五)>将会讲解MYSQL的日志 MYSQL里的日志主要分为4类,使用这些日志文件,可以查看MYSQL内部发生的事情. 分别是 1.错误日志:记录mysql ...

  5. MySQL学习11 - MySQL创建用户和授权

    权限管理 权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师 ...

  6. MySQL学习笔记——MySQL启动过程(一)

    首先去官网或者github下载MySQL5.7的源码. 官网地址:https://dev.mysql.com/downloads/mysql/ github地址:https://github.com/ ...

  7. MySQL学习(3)---MySQL常用命令

    ps:此随笔基于mysql 5.7.*版本. 准备 net start mysql 启动MySQL服务 net stop mysql 关闭MySQL服务 mysql [-h<IP地址>] ...

  8. MySQL学习(1)---MySQL概述

    什么是数据库 概述 数据库(Database)是长期存储在计算机内有组织.大量.共享的数据集合.它可以供各种用户共享,具有最小冗余度和较高的数据独立性.数据库管理系统DBMS(Database Man ...

  9. MySQL学习笔记之数据类型

    数据类型在所有的数据库使用当中,都是避免不了的部分.以前每次写SQL语句,对于定义成哪种数据类型总是迷迷糊糊,今天就来彻底弄清.以下介绍仅针对MySQL 5.5以上版本. 一.字符串类型 1.char ...

  10. mysql学习1:数据类型:数字型,日期和时间,字符串类型(总结)

    mysql数据类型:数字型,日期和时间,字符串类型 摘要 MySQL中定义数据字段的类型对数据库的优化是非常重要的: MySQL支持多种类型,大致可以分为三类,如下. 数字类型 整数:tinyint. ...

随机推荐

  1. [BJDCTF2020]EasySearch-1

    1.打开之后界面如下: 2.在首界面审查源代码.抓包未获取到有效信息,就开始进行目录扫描,获取到index.php.swp文件,结果如下: 3.访问index.php.swp文件获取源代码信息,结果如 ...

  2. CF1612D X-Magic Pair

    题意: 给一个数对 \((a,b)\) ,每次可以进行操作 \((a,b) \to (|a-b|,b)\) 或 \((a,b) \to (a,∣a−b∣)\),问最后能否令 \(a=x\) 或 \(b ...

  3. OpenWrt之feeds.conf.default详解

    目录 OpenWrt之feeds.conf.default详解 文件内容 命令解释 src-svn与src-gitsvn src-git与src-git-full src-cpy与src-link 其 ...

  4. 剑指offer——day-1

    今天开始记录一下剑指offer的题目训练,提升一下自己的编程能力吧 题目一: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列 ...

  5. php rand()和mt_ran(),还有随机数生成器

    PHP 的 rand() 函数默认使用 libc 随机数发生器.mt_rand() 函数是非正式用来替换它的.该函数用了 Mersenne Twister 中已知的特性作为随机数发生器,它可以产生随机 ...

  6. 基于UiAutomator2+PageObject模式开展APP自动化测试实战

    前言 在上一篇<APP自动化测试框架-UiAutomator2基础>中,重点介绍了uiautomator2的项目组成.运行原理.环境搭建及元素定位等基础入门知识,本篇将介绍如何基于uiau ...

  7. 来看看这位年轻的 eBay 小伙是如何成为 Committer

    介绍一下我自己 目前就职于eBay中国,专注于微服务中间件,分布式架构等领域,同时也是狂热的开源爱好者. 如何成为一个commiter 过去几个月,我一直持续在为 Apache DolphinSche ...

  8. 如果让我设计一套,TPS百万级API网关!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 是滴,小傅哥又要准备搞事情了!这次准备下手API网关项目,因为这是所有互联网大厂都有的一个核心 ...

  9. SPI:Java的高可扩展利器

    摘要:JAVA SPI,基于接口的编程+策略模式+配置文件的动态加载机制. 本文分享自华为云社区<一文讲透Java核心技术之高可扩展利器SPI>,作者: 冰 河. SPI的概念 JAVA ...

  10. C++ 一键关闭屏幕

    Demo下载地址:http://pan.baidu.com/s/1vN4wF #include <windows.h> #include "resource.h" LR ...