zoukankan      html  css  js  c++  java
  • mysql

    分类:

    类型名称说明存储需求
    CHAR(M) 固定长度非二进制字符串 M 字节,1<=M<=255
    VARCHAR(M) 变长非二进制字符串 L+1字节,在此,L< = M和 1<=M<=255
    TINYTEXT 非常小的非二进制字符串 L+1字节,在此,L<2^8
    TEXT 小的非二进制字符串 L+2字节,在此,L<2^16
    MEDIUMTEXT 中等大小的非二进制字符串 L+3字节,在此,L<2^24
    LONGTEXT 大的非二进制字符串 L+4字节,在此,L<2^32
    ENUM 枚举类型,只能有一个枚举字符串值 1或2个字节,取决于枚举值的数目 (最大值为65535)
    SET 一个设置,字符串对象可以有零个或 多个SET成员 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)

    CHAR 与 VARCHAR:

    存储规则:

    1. 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 
    2. 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 

    char 与 varchar区别:

    1. char是一种固定长度的类型,
    2. varchar则是一种可变长度的类型,
    3. 它们的区别是:
      1. char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)
      2. 在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)

     

    数据列类型转换的规则:

    1. 在一个数据表里,如果每一个数据的长度都是固定的,那么每一个数据的长度也将是固定的
    2. 只要数据表里有一个数据长度可变的,那么各数据行的长度都是可变的
    3. 如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型例外长度小于4个字符的char数据列不会被转换为varchar类型

    限制规则:

    存储限制:

    1. varchar最多能存储65535个字节的数据。
    2. varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小这个上限。
    3. 65535个字节包括:
      1. 所有字段的长度,
      2. 变长字段的长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度)
      3. NULL标识位的累计。

    编码长度限制:

    1. 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
    2. 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
    3. 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning

    行长度限制:

    1. 导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示
    2. ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

    TEXT 类型

    TEXT 列保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。

    TEXT 类型分为 4 种:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。

    • TINYTEXT 表示长度为 255(28-1)字符的 TEXT 列。
    • TEXT 表示长度为 65535(216-1)字符的 TEXT 列。
    • MEDIUMTEXT 表示长度为 16777215(224-1)字符的 TEXT 列。
    • LONGTEXT 表示长度为 4294967295 或 4GB(232-1)字符的 TEXT 列。

    ENUM 类型

    ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。其语法格式如下:

    <字段名> ENUM( '值1', '值1', …, '值n' )

    字段名指将要定义的字段,值 n 指枚举列表中第 n 个值。

    ENUM 类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个。如果创建的成员中有空格,尾部的空格将自动被删除。

    ENUM 值在内部用整数表示,每个枚举值均有一个索引值;列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号,枚举最多可以有 65535 个元素。

    例如,定义 ENUM 类型的列('first','second','third'),该列可以取的值和每个值的索引如下表所示。

    索引
    NULL NULL
    '' 0
    ’first 1
    second 2
    third 3


    ENUM 值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚举值前。

    提示:ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULL,NULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。

    SET 类型

    SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用逗号,隔开,语法格式如下:

    SET( '值1', '值2', …, '值n' )

    与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。

    但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。

    提示:如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。

    参考:

    https://www.cnblogs.com/canger/p/9850727.html

    http://c.biancheng.net/view/2426.html

  • 相关阅读:
    python中的面向对象编程
    python global vs nonlocal (2)
    python3 nonlocal vs global
    poj蚂蚁问题
    C/C++ static vs global
    砝码问题
    Wythoff's game
    C++中的::operator new, ::operator delete
    客户信息表 自我汇总 待确认
    Oracle Savepoint
  • 原文地址:https://www.cnblogs.com/gengyufei/p/14284099.html
Copyright © 2011-2022 走看看