Mysql中有很多字段类型,比如整数、文本、浮点数等等。如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度,相反,如果数据类型的定义不合

理,就有可能会导致数据超出取值范围,引发系统报错,甚至可能出现计算错误的情况,进而影响整个系统,

1.整数类型

整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT,它们的区别如下表所示:

那么怎么选择?

在评估用哪种整数类型的时候,你需要考虑存储空间和可靠性的平衡问题:一方面,用占用字节数少的整数类型可以节省存储空间;另一方面,要是为了节省存储

空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,就可能引起系统错误,影响可靠性。

  • bigint

    • 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到18446744073709551615。一位为 8 个字节。
  • int
    • 一个正常大小整数。有符号的范围是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字),无符号的范围是0到4294967295。一位大小为 4 个字节。
      int 的 SQL-92 同义词为 integer。
  • mediumint
    • 一个中等大小整数,有符号的范围是-8388608到8388607,无符号的范围是0到16777215。 一位大小为3个字节。
  • smallint
    • 一个小整数。有符号的范围是-2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据,无符号的范围是0到65535。一位大小为 2 个字节。MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
  • tinyint
    • 有符号的范围是-128 - 127,无符号的范围是 从 0 到 255 的整型数据。一位大小为 1 字节。

2.浮点数类型和定点数类型

浮点数和定点数类型的特点是可以处理小数,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,就比整数大多了。

我们先来了解下 MySQL 支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL。

  • FLOAT 表示单精度浮点数;

  • DOUBLE 表示双精度浮点数;

  • REAL 默认就是 DOUBLE。如果你把 SQL 模式设定为启用“REAL_AS_FLOAT”,那么,MySQL 就认为 REAL 是 FLOAT。如果要启用“REAL_AS_FLOAT”,就可以通过以下 SQL 语句实现:

FLOAT 和 DOUBLE 这两种数据类型的区别是啥呢?其实就是,FLOAT 占用字节数少,取值范围小;DOUBLE 占用字节数多,取值范围也大。

为什么浮点数类型的无符号数取值范围,只相当于有符号数取值范围的一半,也就是只相当于有符号数取值范围大于等于零的部分呢?

其实,这里的原因是,MySQL 是按照这个格式存储浮点数的:符号(S)、尾数(M)和阶码(E)。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号

的部分。因此,所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。

**浮点数类型有个缺陷,就是不精准。**因此,在一些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。

MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表

达,就是 1001.101,或者表达成 1.001101×2^3。看到了吗?如果尾数不是 0 或 5(比如 9.624),你就无法用一个二进制数来精确表达。怎么办呢?就只好在取

值允许的范围内进行近似(四舍五入)。

为什么数据类型是 DOUBLE 的时候,我们得到的结果误差更小一些,而数据类型是 FLOAT 的时候,误差会更大一下。原因就是,DOUBLE 有 8 位字节,精度更高。

那么,MySQL 有没有精准的数据类型呢?当然有,这就是定点数类型:DECIMAL

就像浮点数类型的存储方式,决定了它不可能精准一样,DECIMAL 的存储方式决定了它一定是精准的。

浮点数类型是把十进制数转换成二进制数存储,DECIMAL 则不同,它是把十进制数的整数部分和小数部分拆开,分别转换成十六进制数,进行存储。这样,所有

的数值,就都可以精准表达了,不会存在因为无法表达而损失精度的问题。

MySQL 用 DECIMAL(M,D)的方式表示高精度小数。其中,M 表示整数部分加小数部分,一共有多少位,M<=65。D 表示小数部分位数,D<M。

简单小结下浮点数和定点数的特点:浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建

模、流体动力学等);定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景(比如涉及金额计算的场景)。

3.文本类型

在实际的项目中,我们还经常遇到一种数据,就是字符串数据。

TEXT 类型是 MySQL 支持的文本类型的一种。此外,MySQL 还支持 CHAR、VARCHAR、ENUM 和 SET 等文本类型。我们来看看它们的区别。

  • CHAR(M):固定长度字符串。CHAR(M) 类型必须预先定义字符串长度。如果太短,数据可能会超出范围;如果太长,又浪费存储空间
  • VARCHAR(M): 可变长度字符串。VARCHAR(M) 也需要预先知道字符串的最大长度,不过只要不超过这个最大长度,具体存储的时候,是按照实际字符串长度存储的。
  • TEXT:字符串。系统自动按照实际长度存储,不需要预先定义长度。
  • ENUM: 枚举类型,取值必须是预先设定的一组字符串值范围之内的一个,必须要知道字符串所有可能的取值。
  • SET:是一个字符串对象,取值必须是在预先设定的字符串值范围之内的 0 个或多个,也必须知道字符串所有可能的取值。

对于 ENUM 类型和 SET 类型来说,你必须知道所有可能的取值,所以只能用在某些特定场合,比如某个参数设定的取值范围只有几个固定值的场景。

因为不需要预先知道字符串的长度,系统会按照实际的数据长度进行存储,所以 TEXT 类型最为灵活方便,所以下面我们重点学习一下它。

TEXT 类型也有 4 种,它们的区别就是最大长度不同。

  • TINYTEXT:255 字符(这里假设字符是 ASCII 码,一个字符占用一个字节,下同)。
  • TEXT: 65535 字符。
  • MEDIUMTEXT:16777215 字符。
  • LONGTEXT: 4294967295 字符(相当于 4GB)。

由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M)。

4.日期和时间类型

用得最多的日期时间类型,就是 DATETIME

虽然 MySQL 也支持 YEAR(年)、TIME(时间)、DATE(日期),以及 TIMESTAMP 类型,但是我建议你,在实际项目中,尽量用 DATETIME 类型。因为这个

数据类型包括了完整的日期和时间信息,使用起来比较方便。毕竟,如果日期时间信息分散在好几个字段,就会很不容易记,而且查询的时候,SQL 语句也会更加

复杂。

1.mysql字段类型该怎么选择?相关推荐

  1. Mysql字段类型与合理选择

    字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数. 许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允 ...

  2. php数据库字段类型,mysql 字段类型说明

    mysql 字段类型说明 更新时间:2007年04月27日 00:00:00   作者: MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用 ...

  3. MySQL字段类型解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  4. MySQL字段类型详解

    MySQL字段类型详解 2009-01-05 09:25 来源:泡菜博客 0个评论 分享文章 A- A+ 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 MySQL支持 ...

  5. MySQL字段类型对应Java字段

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  6. MySql 字段类型对应 Java 实体类型

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  7. 原 hibernate与mysql字段类型对应关系

    原 hibernate与mysql字段类型对应关系 发表于8个月前(2015-04-17 08:56)   阅读(1102) | 评论(0) 2人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC ...

  8. MySQL 字段类型解析

    MySQL字段类型 MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 字符串 char和varchar: 1.char(n) 若存入字符数小于n,则以空格补于 ...

  9. MySQL字段类型与Java中类型的对应

    MySQL字段类型与Java中类型的对应 在设计数据的时候,需要与Java里的类型进行匹配,我自己在设计过程中参考的内容如下 编号 类型名称 显示长度 数据库类型 Java类型 备注/描述 0 VAR ...

最新文章

  1. Pycharm显示行号,修改字号大小
  2. python listbox排序_python – 从tkinter.Listbox中提取项目列表
  3. 练习利用LSTM实现手写数字分类任务
  4. 【VBS】一款无聊的 Visual Basic Script 表白程序
  5. ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
  6. 在线便携小电视源码 云电视源码
  7. 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#
  8. linux DHCP多作用域
  9. 话单分析 之 含小数保留9位
  10. java 继承 序列化_Java中带继承的对象序列化 - Break易站
  11. 每秒50W笔交易,阿里双十一,架构如何优化到极致!
  12. 虚拟仪器项目实战——一个用Labview做的水位水温控制模拟系统
  13. 如何利用python画三棱锥_blender插件DEMO,添加一个三菱锥
  14. MATLAB数字图像处理(一)——图像打开、保存与显示
  15. 轻松搞定EasyUI
  16. c语言中符号是什么作用是什么,c语言中的符号|=是什么意思?
  17. 损失37亿!Intel将彻底退出傲腾存储业务;车主因眼睛小被自动驾驶误判“开车睡觉”;微信安装包11年膨胀575倍 | EA周报...
  18. grasps元素_从玛祖卡舞曲肖邦钢琴音乐中民族元素的运用.pdf
  19. 关于新版微信内核x5问题
  20. windows远程关机

热门文章

  1. 不刷新页面更新内容的方法
  2. Android商城项目
  3. 计算机应用类专业综合知识月考试卷,计算机应用类专业综合复习试题(一)
  4. GHz指计算机的,ghz指的是计算机的
  5. 恋与制作人元旦服务器,恋与制作人2018元旦活动详解大全
  6. 第12周项目2—摩托车继承自行车和机动车
  7. JAVA 设计模式(三)—— 设计模式之工厂模式
  8. 超级计算机“看”新冠疫情,进一步观察缓激肽假说
  9. Happy Wu-新人报道!
  10. java html pdf 中文_java html 转pdf 中文可显示