MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL 和NUMERIC),以及近似数值数据类型(FLOAT、REAL 和DOUBLE PRECISION),并在此基础上做了扩展。扩展后增加了TINYINT、MEDIUMINT 和BIGINT 这3 种长度不同的整型,并增加了BIT 类型,用来存放位数据。表3-1 中列出了MySQL 5.0 中支持的所有数值类型,其中INT 是INTEGER 的同名词,DEC 是DECIMAL 的同名词。

  在整数类型中,按照取值范围和存储方式不同,分为tinyint、smallint、mediumint、int、bigint 这5 个类型。如果超出类型范围的操作,会发生“Out of range”错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围,最后根据确定的结果慎重选择数据类型。
  对于整型数据,MySQL 还支持在类型名称后面的小括号内指定显示宽度,例如int(5)表示当数值宽度小于5 位的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。一般配合zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满。以下几个例子分别描述了填充前后的区别。
 (1)创建表t1,有id1 和id2 两个字段,指定其数值宽度分别为int 和int(5)。

  1. mysql> create table t1 (id1 int,id2 int(5));
  2. Query OK, 0 rows affected (0.03 sec)
  3. mysql> desc t1;
  4. +-------+---------+------+-----+---------+-------+
  5. | Field | Type | Null | Key | Default | Extra |
  6. +-------+---------+------+-----+---------+-------+
  7. | id1 | int(11) | YES | | NULL | |
  8. | id2 | int(5) | YES | | NULL | |
  9. +-------+---------+------+-----+---------+-------+
  10. 2 rows in set (0.00 sec)

(2)在id1 和id2 中都插入数值1,可以发现格式没有异常。

  1. mysql> insert into t1 values(1,1);
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> select * from t1;
  4. +------+------+
  5. | id1 | id2 |
  6. +------+------+
  7. | 1 | 1 |
  8. +------+------+
  9. 1 row in set (0.00 sec)

(3)分别修改id1 和id2 的字段类型,加入zerofill 参数:

  1. mysql> alter table t1 modify id1 int zerofill;
  2. Query OK, 1 row affected (0.04 sec)
  3. Records: 1 Duplicates: 0 Warnings: 0
  4. mysql> alter table t1 modify id2 int(5) zerofill;
  5. Query OK, 1 row affected (0.03 sec)
  6. Records: 1 Duplicates: 0 Warnings: 0
  7. mysql> select * from t1;
  8. +------------+-------+
  9. | id1 | id2 |
  10. +------------+-------+
  11. | 0000000001 | 00001 |
  12. +------------+-------+
  13. 1 row in set (0.00 sec)

  可以发现,在数值前面用字符“0”填充了剩余的宽度。大家可能会有所疑问,设置了宽度限制后,如果插入大于宽度限制的值,会不会截断或者插不进去报错?答案是肯定的:不会对插入的数据有任何影响,还是按照类型的实际精度进行保存,这是,宽度格式实际已经没有意义,左边不会再填充任何的“0”字符。下面在表t1 的字段id1 中插入数值1,id2 中插入数值1111111,位数为7,大于id2 的显示位数5,再观察一下测试结果:

  1. mysql> insert into t1 values(1,1111111);
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> select * from t1;
  4. +------------+---------+
  5. | id1 | id2 |
  6. +------------+---------+
  7. | 0000000001 | 00001 |
  8. | 0000000001 | 1111111 |
  9. +------------+---------+
  10. 2 rows in set (0.00 sec)

  很显然,如上面所说,id2 中显示了正确的数值,并没有受宽度限制影响。所有的整数类型都有一个可选属性UNSIGNED(无符号),如果需要在字段里面保存非
负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取0,上限取原值的2 倍,例如,tinyint 有符号范围是-128~+127,而无符号范围是0~255。如果一个列指定为zerofill,则MySQL 自动为该列添加UNSIGNED 属性。
  另外,整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从1 开始,每行增加1。在插入NULL 到一个AUTO_INCREMENT 列时,MySQL 插入一个比该列中当前最大值大1 的值。一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT 的列,应该定义为NOT NULL,并定义为PRIMARY KEY 或定义为UNIQUE 键。例如,可按下列任何一种方式定义AUTO_INCREMENT 列:

  1.   CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
  2.   CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL ,PRIMARY KEY(ID));
  3.   CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL ,UNIQUE(ID));

对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal 一种表示。定点数在MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
  浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示M 位数字(整数位+小数位),其中D 位位于小数点后面,M 和D 又称为精度和标度。例如,定义为float(7,4)的一个列可以显示为-999.9999。MySQL 保存值时进行四舍五入,因此如果在float(7,4)列内插入999.00009,近似结果是999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float 和double 在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而decimal 在不指定精度时,默认的整数位为10,默认的小数位为0。
  下面通过一个例子来比较float、double 和decimal 三者之间的不同。
  (1)创建测试表,分别将id1、id2、id3 字段设置为float(5,2)、double(5,2)、decimal(5,2)。

  1.   CREATE TABLE `t1` (
  2.   `id1` float(5,2) default NULL,
  3.   `id2` double(5,2) default NULL,
  4.   `id3` decimal(5,2) default NULL
  5.   )

  (2)往id1、id2 和id3 这3 个字段中插入数据1.23。

  1.   mysql> insert into t1 values(1.23,1.23,1.23);
  2.   Query OK, 1 row affected (0.00 sec)
  3.   mysql>
  4.   mysql> select * from t1;
  5.   +------+------+------+
  6.   | id1 | id2 | id3 |
  7.   +------+------+------+
  8.   | 1.23 | 1.23 | 1.23 |
  9.   +------+------+------+
  10.   1 row in set (0.00 sec)

  可以发现,数据都正确地插入了表t1。
   (3)再向id1 和id2 字段中插入数据1.234,而id3 字段中仍然插入1.23

  1.   mysql> insert into t1 values(1.234,1.234,1.23);
  2.   Query OK, 1 row affected (0.00 sec)
  3.   mysql> select * from t1;
  4.   +------+------+------+
  5.   | id1 | id2 | id3 |
  6.   +------+------+------+
  7.   | 1.23 | 1.23 | 1.23 |
  8.   | 1.23 | 1.23 | 1.23 |
  9.   +------+------+------+
  10.   2 rows in set (0.00 sec)

  可以发现,id1、id2、id3 都插入了表t1,但是id1 和id2 由于标度的限制,舍去了最后一位,数据变为了1.23。
  (4)同时向id1、id2、id3 字段中都插入数据1.234。

  1.   mysql> insert into t1 values(1.234,1.234,1.234);
  2.   Query OK, 1 row affected, 1 warning (0.00 sec)
  3.   mysql> show warnings;
  4.   +-------+------+------------------------------------------+
  5.   | Level | Code | Message |
  6.   +-------+------+------------------------------------------+
  7.   | Note | 1265 | Data truncated for column 'id3' at row 1 |
  8.   +-------+------+------------------------------------------+
  9.   1 row in set (0.00 sec)
  10.   mysql> select * from t1;
  11.   +------+------+------+
  12.   | id1 | id2 | id3 |
  13.   +------+------+------+
  14.   | 1.23 | 1.23 | 1.23 |
  15.   | 1.23 | 1.23 | 1.23 |
  16.   | 1.23 | 1.23 | 1.23 |
  17.   +------+------+------+
  18.   3 rows in set (0.00 sec)

此时发现,虽然数据都插入进去,但是系统出现了一个warning,报告id3 被截断。如果是在传统的SQLMode(第16 章将会详细介绍SQLMode)下,这条记录是无法插入的。
(5)将id1、id2、id3 字段的精度和标度全部去掉,再次插入数据1.23。

  1.   mysql> alter table t1 modify id1 float;
  2.   Query OK, 3 rows affected (0.03 sec)
  3.   Records: 3 Duplicates: 0 Warnings: 0
  4.   mysql> alter table t1 modify id2 double;
  5.   Query OK, 3 rows affected (0.04 sec)
  6.   Records: 3 Duplicates: 0 Warnings: 0
  7.   mysql> alter table t1 modify id3 decimal;
  8.   Query OK, 3 rows affected, 3 warnings (0.02 sec)
  9.   Records: 3 Duplicates: 0 Warnings: 0
  10.   mysql> desc t1;
  11.   +-------+---------------+------+-----+---------+-------+
  12.   | Field | Type | Null | Key | Default | Extra |
  13.   +-------+---------------+------+-----+---------+-------+
  14.   | id1 | float | YES | | NULL | |
  15.   | id2 | double | YES | | NULL | |
  16.   | id3 | decimal(10,0) | YES | | NULL | |
  17.   +-------+---------------+------+-----+---------+-------+
  18.   3 rows in set (0.00 sec)
  19.   mysql> insert into t1 values(1.234,1.234,1.234);
  20.   Query OK, 1 row affected, 1 warning (0.00 sec)
  21.   mysql> show warnings;
  22.   +-------+------+------------------------------------------+
  23.   | Level | Code | Message |
  24.   +-------+------+------------------------------------------+
  25.   | Note | 1265 | Data truncated for column 'id3' at row 1 |
  26.   +-------+------+------------------------------------------+
  27.   1 row in set (0.00 sec)
  28.   mysql> select * from t1;
  29.   +-------+-------+------+
  30.   | id1 | id2 | id3 |
  31.   +-------+-------+------+
  32.   | 1.234 | 1.234 | 1 |
  33.   +-------+-------+------+
  34.   1 row in set (0.00 sec)

  这个时候,可以发现id1、id2 字段中可以正常插入数据,而id3 字段的小数位被截断。
  上面这个例子验证了上面提到的浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。
  对于BIT(位)类型,用于存放位字段值,BIT(M)可以用来存放多位二进制数,M 范围从1~64,如果不写则默认为1 位。对于位字段,直接使用SELECT 命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为十六进制格式)函数进行读取。
  下面的例子中,对测试表t2 中的bit 类型字段id 做insert 和select 操作,这里重点观察一下
select 的结果:

  1.   mysql> desc t2;
  2.   +-------+--------+------+-----+---------+-------+
  3.   | Field | Type | Null | Key | Default | Extra |
  4.   +-------+--------+------+-----+---------+-------+
  5.   | id | bit(1) | YES | | NULL | |
  6.   +-------+--------+------+-----+---------+-------+
  7.   1 row in set (0.00 sec)
  8.   mysql> insert into t2 values(1);
  9.   Query OK, 1 row affected (0.00 sec)
  10.   mysql> select * from t2;
  11.   +------+
  12.   | id |
  13.   +------+
  14.   | |
  15.   +------+
  16.   1 row in set (0.00 sec

可以发现,直接select * 结果为NULL。改用bin()和hex()函数再试试:

  1.   mysql> select bin(id),hex(id) from t2;
  2.   +---------+---------+
  3.   | bin(id) | hex(id) |
  4.   +---------+---------+
  5.   | 1 | 1 |
  6.   +---------+---------+
  7.   1 row in set (0.00 sec)

结果可以正常显示为二进制数字和十六进制数字。
数据插入bit 类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败,下面的例子中,在t2 表插入数字2,因为它的二进制码是“10”,而id 的定义是bit(1),将无法进行插入:

  1.   mysql> insert into t2 values(2);
  2.   Query OK, 1 row affected, 1 warning (0.00 sec)
  3.   mysql> show warnings;
  4.   +---------+------+------------------------------------------------------+
  5.   | Level | Code | Message |
  6.   +---------+------+------------------------------------------------------+
  7.   | Warning | 1264 | Out of range value adjusted for column 'id' at row 1 |
  8.   +---------+------+------------------------------------------------------+
  9.   1 row in set (0.01 sec)

将ID 定义修改为bit(2)后,重新插入,插入成功:

  1.   mysql> alter table t2 modify id bit(2);
  2.   Query OK, 1 row affected (0.02 sec)
  3.   Records: 1 Duplicates: 0 Warnings: 0
  4.   mysql> insert into t2 values(2);
  5.   Query OK, 1 row affected (0.00 sec)
  6.   mysql> select bin(id),hex(id) from t2;
  7.   +---------+---------+
  8.   | bin(id) | hex(id) |
  9.   +---------+---------+
  10.   | 1 | 1 |
  11.   | 10 | 2 |
  12.   +---------+---------+
  13.   2 rows in set (0.00 sec)

Mysql 数据库数值类型详解的更多相关文章

  1. mysql数据库字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  2. Mysql 数据库字符类型详解

    MySQL 中提供了多种对字符数据的存储类型,不同的版本可能有所差异.以5.0 版本为例,MySQL 包括了CHAR.VARCHAR.BINARY.VARBINARY.BLOB.TEXT.ENUM 和 ...

  3. 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

    重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...

  4. mysql numberic types ---- mysql 数值类型详解

    编程语言中大多都有数据类型一说.虽然mysql 的sql 语句与标准sql 有别.但是宏观上看还是差不多的:下面我们说一下mysql数据库中的数值类型 一.在mysql里有那些类型可以表示数值: 1. ...

  5. mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  6. Mysql 日期时间类型详解

    MySQL 中有多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,表3-2 中列出了MySQL 5.0 中所支持的日期和时间类型. 这些数据类型的主要区别如下: * 如果要用来表示年月日 ...

  7. MYSQL数据库引擎区别详解

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

  8. MySQL数据库图文安装详解及相关问题

    (尊重劳动成果,转载请注明出处: http://blog.csdn.net/qq_25827845/article/details/53366444冷血之心的博客) 首先说明:安装目录中不能有中文和空 ...

  9. linux/Ubuntu系统上安装mysql数据库(附图详解)

    在前面的文章中,我已经分享了如何在Ubuntu系统中安装以及搭建java开发环境,那么当我们需要跟数据打交道的时候,那么就需要在ubuntu系统中安装一个数据库了,那么废话就不多说了,我们这里主要是分 ...

随机推荐

  1. 获取android-5.0.2_r1代码6.7G

    获取 android-5.0.2_r1 源代码的坎坷路: 服务器相关 ====== * 国外服务器直接拉取,我一共有多个国外服务器,在获取android代码时下载速度都能到10MB/s的下载速度甚至更 ...

  2. Linux文件目录的一点小结

    转载:http://blog.chinaunix.net/uid-29171357-id-3889735.html 1. 相关指令:      chgrp:改变文件所属用户组 点击(此处)折叠或打开 ...

  3. OPENGL架构

    第2章 OpenGL 简介 每台计算机都有专门处理图形的硬件,它们控制着屏幕上显示的内容.OpenGL向这种硬件发出命令,告诉它们执行什么操作.计算机游戏或者其他任意软件借助制造商提供的设备驱动程序, ...

  4. .NET:动态代理的 “5 + 1” 模式

    背景 什么叫“动态代理”,代理模式我们都知道,动态代理就是动态生成的代理(采用Emit). 重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一 ...

  5. [Hive]使用HDFS文件夹数据创建Hive表分区

    描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...

  6. jquery获取table指定行和列的数据(当前选中行、列)

    //不多说,直接上代码.$("table tr").click(function() {//为表格的行添加点击事件 var tr = $(this);//找到tr原色 var td ...

  7. highchart demo

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.c ...

  8. 世界围棋人机大战、顶峰对决第一盘:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序

    Match 1 - Google DeepMind Challenge Match: Lee Sedol vs AlphaGo 很多网站对世界围棋大战进行了现场直播,比如YouTube.新浪.乐视.腾 ...

  9. Orchard运用 - 为博客启用Markdown编辑器

    有时决定你是否使用某一个博客系统,最看重就是如何更简便的写博客,不能让其成为一个负担或别扭费力不讨好的工作. 对此一个好的编辑器就是一个最靓丽的卖点.比如最新的博客系统ghost.org就只定位一个最 ...

  10. Java中this与super

    l  对象的this引用 作用: this关键字就是让类中一个方法,访问该类中的另一个方法或属性. 1.构造器中引用该构造器正在初始化的对象. 2.在方法中引用调用该方法的对象(哪个对象调用的方法,t ...