MySQL中各种数据类型的长度及在开发中如何选择
接触MySQL这个数据库大概快要两年了,不过由于没有特别深入系统的去学习,大多也是停留在一知半解的状态。今天在工作中刚好碰到了表设计的问题,顺便写篇博客,把MySQL中数据类型和字段类型选择这方面给弄清楚。
MySQL中的数据类型大体分为三大类,数值类型,时间日期类型以及字符串类型。下面将对这三种类型进行详细的介绍。
一、数值类型
MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL 和NUMERIC),以及近似数值数据类型(FLOAT、REAL 和DOUBLE PRECISION),并在标准SQL的基础上扩展增加了 TINYINT、MEDIUMINT 和BIGINT 这3 种长度不同的整型和存放位数据的BIT类型。在日常建表定义当中,整型中最常用的依旧是int类型的数据,浮点型中则视情况而定。每种数据类型表示的范围如下表所示:

注:我曾经在电信行业和银行业参与过IT项目的开发,在使用他们提供的数据的时候总会发现数据库中有小数点后数字时大都用的Decimal这种数据类型,而不是采用开发中常用的而且最大取值范围一样的Double类型。Double和Decimal都属于浮点型,但是Decimal在精度上面来说,它的精度是Double的两倍,Float的四倍,在银行或者通信这些对数据要求十分精确的行业,Decimal是优于Double的更好的选择。但是需要注意的事,Decimal也是浮点类型的数据,只不过相对来说精度更高,在实际使用中如果小数点后位数过多一样会存在精度损失的问题。在《阿里巴巴Java编程规范》,明确提出使用Decimal取代double和float

为整型指定宽度,如INT(11),对于存储来说INT(1)和INT(20)是相同的,它不会限制值的合法范围,只是规定了MySQL与客户端的交互应该显示多少位而已,比如你向INT(1)中插入了123456值,数据库中其实已经存入了123456,只是对于客户端查出来是1而已。
二、时间日期类型
MySQL中提供了五种类型的时间类型,分别为DATE,DATETIME,TIMESTAMP,TIME和YEAR。下表是日期类型的详细区间。

- 如果要用来表示年月日,通常用DATE 来表示。
- 如果要用来表示年月日时分秒,通常用DATETIME 表示。
- 如果只用来表示时分秒,通常用TIME 来表示。
- 如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP 来表示。
- TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为19 个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。如果只是表示年份,可以用YEAR 来表示,它比DATE 占用更少的空间。YEAR 有2 位或4 位格式的年。默认是4 位格式。在4 位格式中,允许的值是1901~2155 和0000。在2 位格式中,允许的值是70~69,表示从1970~2069 年。MySQL 以YYYY 格式显示YEAR值。
三、字符串类型
MySQL 中提供了多种对字符数据的存储类型,不同的版本可能有所差异。以5.0 版本为例,MySQL 包括了CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和SET 等多种数据类型。其中常用的为VARCHAR,TEXT等。其中CHAR和VARCHAR存在以下区别
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的
VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,
这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
下表列出了MySQL中所有的字符类型。

在实际的建表定义字段类型时,字符串通常会考虑使用VARCHAR,当字段数据有明确的精度和长度时使用CHAR更加高效。在有长文本输入时选择TEXT输入。其它的在平常开发中很少用到了。
MySQL中各种数据类型的长度及在开发中如何选择的更多相关文章
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...
- JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...
- [更新中]【South使用总结】django开发中使用South进行数据库迁移
Django开发中使用South进行数据库迁移的使用总结 South的详细资料可产看官方文档http://south.readthedocs.org/en/latest South安装配置 pip i ...
- [更新中]【fit-flow使用总结】djang开发中git flow使用总结
djang开发中git flow使用总结 初次接触可以先看看此链接上关于git flow的东西http://danielkummer.github.io/git-flow-cheatsheet/ind ...
- MySQL中的数据类型的长度范围和显示宽度(转)
长度范围是随数据类型就已经是固定的值,而显示宽度与长度范围无关. 以下是每个整数类型的存储和范围(来自MySQL手册) 类型 字节 最小值 最大值 (带符号的/无符号的) (带符号的/无符号的) TI ...
- SQL中各数据类型的长度、精度
在 Microsoft? SQL Server? 中,每个列.局部变量.表达式和参数都有一个相关的数据类型,这是指定对象可持有的数据类型(整型.字符.money 等等)的特性. SQL Server ...
- c语言中各种数据类型的长度
在32位平台和64位平台上,同一种数据类型可能有不同的数据长度: 类型 32位平台 64位平台 char 1 1 short 2 2 int 4 4 long 4 8 long long 8 8 fl ...
- [C++基金会]位计算 游戏开发中的应用
定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...
- OAF开发中一些LOV相关技巧 (转)
原文地址:OAF开发中一些LOV相关技巧 在OAF开发中,LOV的使用频率是很高的,它由两部分构成一是页面上的LOV输入框(如OAMESSageLovInputBean),二是弹出的LOV模式窗口(O ...
随机推荐
- flask_login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- 编码中的setCharacterEncoding 理解<转自-fancychendong>
1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType="text/html;charset=UTF ...
- 命令行界面下使用emca安装配置Oracle Database Control实战
作为命令行忠有用户,server端软件的运维都倾向于使用命令或 脚本完毕,非常讨厌资源占用非常大的GUI.Oracle数据库作为重要的server端软件.其安装运维自然也全然支持纯命令行方式.虽然同一 ...
- iOS有关图片处理的总结 (四)------图片的饱和度,亮度,对照度。
在做图片处理的时候.会遇到调节图片的饱和度的问题,这里就要用到Core Image这个框架,Core Image是一个非常强大的框架. 它能够让你简单地应用各种滤镜来处理图像,比方改动鲜艳程度, 色泽 ...
- 解决IOS微信内置浏览器返回后不执行js脚本的问题
在A页面写一个$(function(){}) 后随便点击一个URL跳转到B页面 利用微信内置浏览器 返回键返回到A页面后发现这段JS不执行,后来找到了解决方案 $(function () { var ...
- 随笔:JavaScript函数中的对象----arguments
关于arguments 调用函数时,如果需要传参,其实参数就是一个数组,在函数体的内置对象arguments可以访问这个数组,如: arguments[0]:第一个参数 arguments[1]:第二 ...
- JMeter获取JSON内容
source("D:\\apache-jmeter-3.0\\用例\\Test.java"); public static void f(){ String response_da ...
- 【python】字符串变量赋值时字符串可用单或双引号
>>> name='萧峰' >>> print(name) 萧峰 >>> name="独孤求败" >>> p ...
- springboot 入门四-时间类型处理
springboot 自带了jackson来处理时间,但不支持jdk8 LocalDate.LocalDateTime的转换. 对于Calendar.Date二种日期,转换方式有二种: 一.统一app ...
- spring boot入门 -- 介绍和第一个例子
"越来越多的企业选择使用spring boot 开发系统,spring boot牛在什么地方?难不难学?心动不如行动,让我们一起开始学习吧!" 使用Spring boot ,可以轻 ...