分享

MySQL数据类型

 为你放纵一生 2016-10-26

MySQL数据类型

1. 环境登录

无需密码自动登录,系统用户名shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

  1. 命令行终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令

  2. Firefox及Opera:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可

  3. gvim:非常好用的Vim编辑器,最简单的用法可以参考课程Vim编辑器

  4. gedit及Brackets:如果您对gvim的使用不熟悉,可以用这两个作为代码编辑器,其中Brackets非常适用于前端代码开发

3. 环境使用

使用GVim编辑器输入实验所需的代码及文件,使用Xfce终端(XfceTerminal)运行所需命令进行操作。

实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

4. 数据类型

4.1 数值类型

下面为数值类型的概述。详细信息参见数值类型。列存储需求参见列类型存储需求

M指的是整型数据的最大显示宽度,且最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关,相关描述见数值类型

如果为一个数值列指定ZEROFILL,MySQL将自动为该列添加UNSIGNED属性,其中数值型数据允许为UNSIGNED属性和SIGNED属性,然而由于这种数据类型默认的属性是SIGNED,因此没有必要额外声明SIGNED属性;SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名;在给整数类型的列定义时,SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE的一个别名。

注意:在进行两个整数的减法运算时,如果其中一个整数的属性为UNSIGNED,那么减法的结果也是无符号的,除非在是开启SQL模式为NO_UNSIGNED_SUBTRACTION

  • BIT[(M)]

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

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

    很小的整数。带符号的范围是-128到127。无符号的范围是0到255。

  • BOOL,BOOLEAN

    是TINYINT(1)的同义词。0值被视为假。非0值视为真。

  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

    小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。

  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

    中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。

  • INT[(M)] [UNSIGNED] [ZEROFILL]

    普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

  • INTEGER[(M)] [UNSIGNED] [ZEROFILL]

    这是INT的同义词。

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

    大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

    应清楚BIGINT类型列的下述内容:

    • 所有的算术都是使用带符号的BIGINTDOUBLE类型的数值,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数! 如果这样做,结果中的最后几位可能出错,这是由于将BIGINT值转换为DOUBLE进行四舍五入时造成的错误。

    MySQL可以在以下情况下处理BIGINT

    • BIGINT列中使用整数保存大的无符号的值时。
    • MIN(col_name)MAX(col_name)中,其中col_nameBIGINT列。
    • 使用操作符(+-*等等)并且两边操作数均为整数时。
    • 也可以在在BIGINT列中使用一个字符串保存一个固定的整数值。在这种情况下,MySQL执行字符串到数字之间的转换,其间不存在双精度表示。
    • 当两个操作数均为整数值时,-+*操作符使用BIGINT算数。这说明如果乘两个大整数(函数返回的整数值),当结果大于9223372036854775807时,会得到意想不到的结果。
  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

    M是浮点数的总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。

    如果指定UNSIGNED,不允许负值。

    使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。参见解决与不匹配行有关的问题

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

    M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。

    如果指定UNSIGNED,不允许负值。

  • DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

    DOUBLE的同义词。除非:如果SQL服务器模式启动REAL_AS_FLOAT选项,REALFLOAT的同义词而不是DOUBLE的同义词。

  • FLOAT(p) [UNSIGNED] [ZEROFILL]

    浮点数.p表示精度,但MySQL只使用该值来确定列的数据类型是否为FLOATDOUBLE。如果p取值在0到24之间,数据类型将变为没有MD值的FLOAT类型。如果p取值为2553,数据类型将变为没有MD值的DOUBLE型。这种情况下列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。

    FLOAT(p)语法与ODBC兼容。

4.2 日期和时间类型

本节综合讨论了时间数据类型。详细信息,参见日期和时间类型。数据存储需求参见列类型存储需求

  • DATE

    日期。支持的范围为1000-01-019999-12-31。MySQL以YYYY-MM-DD格式显示DATE值,但允许使用字符串或数字类型数据为DATE列赋值。

  • DATETIME[(fsp)]

    日期和时间的组合。支持的范围是1000-01-01 00:00:009999-12-31 23:59:59。MySQL以YYYY-MM-DD HH:MM:SS格式显示DATETIME值,但允许使用字符串或数字为DATETIME列赋值。

    其中,可选参数fsp取值范围是0-6可以指定精确到秒的分位数,默认的是0,指精确到秒。

  • TIMESTAMP[(fsp)]

    时间戳。范围是1970-01-01 00:00:002038-01-19 03:14:07.999999

    TIMESTAMP列用于执行INSERTUPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。

  • TIME 时间。范围是-838:59:59838:59:59。MySQL以HH:MM:SS格式显示TIME值,但允许使用字符串或数字为TIME列分配值。

  • YEAR[(2|4)] 两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是190121550000。在两位格式中,允许的值是7069,表示从1970年到2069年。MySQL以YYYY格式显示YEAR值,但允许使用字符串或数字为YEAR分配值。

4.3 字符串类型

本节综合讨论了字符串数据类型。详细信息参见String类型

在某些情况中,MySQL可以将一个字符串数据更改为不同于CREATE TABLEALTER TABLE语句中所给出的类型(参见沉寂的列规格变更)。

MySQL 5.1字符串数据类型包括在MySQL 4.1之前的版本中没有的特性部分:

  • 许多字符串数据类型的列定义可以包括指定字符集的CHARACTER SET属性或校对规则。(CHARSETCHARACTER SET的一个同义词)。这些属性适用于CHARVARCHARTEXT类型、ENUMSET。例如:

    CREATE TABLE t
    (
        c1 CHAR(20) CHARACTER SET utf8,
        c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin
        );
    

    该表的定义创建了一个名为c1的列,具有一个utf8字符集和该字符集的默认校对规则,和一个名为c2的列以及latin1字符集和该字符集的二元校对规则,其中二元校对规则对大小写不敏感。

    MySQL 5.1用字符单位作为在字符列定义中的长度规范。(以前的一些MySQL版本以字节作为长度)。

    对于CHARVARCHARTEXT类型,BINARY属性可以为列分配该列字符集的 校对规则。字符列的排序和比较基于分配给列的字符集。在以前的版本中,排序和比较基于服务器字符集的校对规则。对于CHARVARCHAR列,你可以用BINARY属性声明列让排序和校对规则使用当前的字符代码值而不是词汇顺序。

    关于MySQL 5.1中字符集的支持,参见字符集支持

  • [NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE]

    固定长度字符串,当保存数据时在右侧自动填充空格以达到指定的长度。M表示列长度。M的范围是0255个字符。

    注:当检索CHAR类型值时尾部空格将被删除。

    如果想要将某个CHAR的长度设为大于255,执行CREATE TABLEALTER TABLE语句时将失败并提示错误,尝试输入:

    mysql> CREATE TABLE c1 (col1 INT, col2 CHAR(500));
    mysql> SHOW CREATE TABLE c1;
    

    CHARCHARACTER的简写。NATIONAL CHAR(或其等效短形式NCHAR)是标准的定义CHAR列应使用默认字符集的SQL方法。BINARY属性是指定列字符集的二元校对规则的简写。排序和比较基于数值字符值。列类型CHAR BYTECHAR BINARY的一个别名,这是为了保证兼容性。通过指定latin1字符集,可以为CHAR指定ASCII属性。通过指定ucs2字符集可以为CHAR指定UNICODE属性。

    MySQL允许创建类型为CHAR(0)的列。这主要用于与必须有一个列但实际上不使用它的值的旧版本中应用程序相兼容。

  • CHAR

    这是CHAR(1)的同义词。

  • [NATIONAL] VARCHAR(M) [BINARY]

    变长字符串。M表示最大列长度。M的范围是065,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。

    注:MySQL 5.1遵从标准SQL规范,并且不自动移除VARCHAR值的尾部空格。

    VARCHAR是字符VARYING的简写。BINARY属性是指定列的字符集的二元校对规则的简写。排序和比较基于数值字符值。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。

  • BINARY(M)

    BINARY类型类似于CHAR类型,但存储二进制字节字符串而不是非二进制字符串。

  • VARBINARY(M)

    VARBINARY类型类似于VARCHAR类型,但存储二进制字节字符串而不是非二进制字符串。

  • TINYBLOB

    最大长度为255字节的BLOB列。

  • TINYTEXT

    最大长度为255字符的TEXT列。

  • BLOB[(M)]

    最大长度为65,535字节的BLOB列。

    可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。

  • TEXT[(M)]

    最大长度为65,535字符的TEXT列。

    可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。

  • MEDIUMBLOB

    最大长度为16,777,215字节的BLOB列。

  • MEDIUMTEXT

    最大长度为16,777,215字符的TEXT列。

  • LONGBLOB

    最大长度为4,294,967,2954GB字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端或服务器协议中配置最大包大小和可用的内存。

  • LONGTEXT

    最大长度为4,294,967,2954GB字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端或服务器协议中配置最大包大小和可用的内存。

  • ENUM('value1','value2',...)

    枚举类型。一个字符串只能由一个值,从值列列表'value1','value2',...,NULL中或特殊''错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。

  • SET('value1','value2',...)

    一个SET类型列可以64个不同值。字符串对象可以有零个或多个值,每个值必须来自列表值'value1','value2',...SET对应的值在内部用整数表示。

动手实践是学习 IT 技术最有效的方式! 开始实验

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多