精华内容
下载资源
问答
  • 常用数据库的字段类型及大小

    千次阅读 2019-08-16 14:51:22
    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小 ORACLE的数据类型 常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes ` VARCHAR2 可变长度的字符...

    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小

    这里写图片描述

    这里写图片描述 
    这里写图片描述

    这里写图片描述 
    这里写图片描述

    这里写图片描述

    ORACLE的数据类型 
    常用的数据库字段类型如下: 
    字段类型 中文说明 限制条件 其它说明 
    CHAR 固定长度字符串 最大长度2000 bytes ` 
    VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 
    NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes 
    NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes 
    DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS) 经过严格测试,无千虫问题 
    LONG 超长字符串 最大长度2G(231-1) 足够存储大部头著作 
    RAW 固定长度的二进制数据 最大长度2000 bytes 可存放多媒体图象声音等 
    LONG RAW 可变长度的二进制数据 最大长度2G 同上 
    BLOB 二进制数据 最大长度4G CLOB 字符数据 最大长度4G 
    NCLOB 根据字符集而定的字符数据 最大长度4G 
    BFILE 存放在数据库外的二进制数据 最大长度4G 
    ROWID 数据表中记录的唯一行号 10 bytes **.*.*格式,*为0或1 
    NROWID 二进制数据表中记录的唯一行号 最大长度4000 bytes 
    NUMBER(P,S) 数字类型 P为整数位,S为小数位 
    DECIMAL(P,S) 数字类型 P为整数位,S为小数位 
    INTEGER 整数类型 小的整数 FLOAT 浮点数类型 
    NUMBER(38),双精度 
    REAL 实数类型

    NUMBER(63),精度更高

    Oracle支持的数据类型可以分为三个基本种类:字符数据类型、数字数据类型以及表示其它数据的数据类型。 
    字符数据类型 
    CHAR CHAR数据类型存储固定长度的子符值。一个CHAR数据类型可以包括1到2000个字符。如果对CHAR没有明确地说明长度,它的默认长度则设置为1.如果对某个CHAR类型变量赋值,其长度小于规定的长度,那么Oracle自动用空格填充。 
    VARCHAR2存储可变长度的字符串。虽然也必须指定一个VARCHAR2数据变量的长度,但是这个长度是指对该变量赋值的的最大长度而非实际赋值长度。不需要用空格填充。最多可设置为4000个字符。 
    因为VARCHAR2数据类型只存储为该列所赋的字符(不加空格),所以VARCHAR2需要的存储空间比CHAR数据类型要小。 
    Oracle推荐使用VARCHAR2 
    NCHAR和NVARCHAR2 NCHAR和NVARCHAR2数据类型分别存储固定长度与可变长度的字符数据,但是它们使用的是和数据库其他类型不同的字符集。在创建数据库时,需要指 定所使用的字符集,以便对数据库中数据进行编码。还可以指定一个辅助的字符集[即本地语言集(National Language Set,简称NLS)]。NCHAR和NVARCHAR2类型的列使用辅助字符集。 
    在Oracle9i中,可以以字符而不是字节为单位来表示NCHAR和NVARCHAR2列的长度。 
    LONG LONG数据类型可以存放2GB的字符数据,它是从早期版本中继承来的。现在如果想存储大容量的数据,Oracle推荐使用CLOB和NCLOB数据类型。在表和SQL语句中使用LONG类型有许多限制。 
    CLOB和NCLOB CLOB和NCLOB数据类型可以存储多达4GB的字符数据。NCLOB数据类型可存储NLS数据。 
    数字数据类型 
    Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。 
    NUMBER数据类型可以有两个限定符,如: 
    column NUMBER ( precision, scale) 
    precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。 
    scale表示数字小数点右边的位数,scale默认设置为0.  如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。 
    日期数据类型 
    Oracle标准日期格式为:DD-MON-YY HH:MI:SS 
    通过修改实例的参数NLS_DATE_FORMAT,可以改变实例中插入日期的格式。在一个会话期间,可以通过ALTER SESSION SQL命令来修改日期,或者通过使用SQL语句的TO_DATE表达式中的参数来更新一个特定值。 
    其它的数据类型 
    RAW和LONG RAW RAW和LONG RAW数据类型主要用于对数据库进行解释。指定这两种类型时,Oracle以位的形式来存储数据。RAW数据类型一般用于存储有特定格式的对象,如位图。 RAW数据类型可占用2KB的空间,而LONG RAW数据类型则可以占用2GB大小。 
    ROWID ROWID是一种特殊的列类型,称之为伪列(pseudocolumn)。ROWID伪列在SQL SELECT语句中可以像普通列那样被访问。Oracle数据库中每行都有一个伪列。ROWID表示行的地址,ROWID伪列用ROWID数据类型定义。 
    ROWID与磁盘驱动的特定位置有关,因此,ROWID是获得行的最快方法。但是,行的ROWID会随着卸载和重载数据库而发生变化,因此建议不要在事务 中使用ROWID伪列的值。例如,一旦当前应用已经使用完记录,就没有理由保存行的ROWID.不能通过任何SQL语句来设置标准的ROWID伪列的值。 
    列或变量可以定义成ROWID数据类型,但是Oracle不能保证该列或变量的值是一个有效的ROWID. 
    LOB 
    LOB(大型对象)数据类型,可以保存4GB的信息。LOB有以下3种类型: 
    。CLOB,只能存储字符数据 
    。NCLOB,保存本地语言字符集数据 
    。BLOB,以二进制信息保存数据 
    可以指定将一个LOB数据保存在Oracle数据库内,还是指向一个包含次数据的外部文件。 
    LOB可以参与事务。管理LOB中的数据必须通过DBMS_LOB PL/SQL内置软件包或者OCI接口。 
    为了便于将LONG数据类型转换成LOB,Oracle9i包含许多同时支持LOB和LONG的函数,还包括一个ALTER TABLE语句的的新选择,它允许将LONG数据类型自动转换成LOB. 
    BFILE 
    BFILE数据类型用做指向存储在Oracle数据库以外的文件的指针。 
    XMLType 
    作为对XML支持的一部分,Oracle9i包含了一个新的数据类型XMLType.定义为XMLType的列将存储一个在字符LOB列中的XML文档。有许多内置的功能可以使你从文当中抽取单个节点,还可以在XMLType文档中对任何节点创建索引。 
    用户自定义数据 
    从Oracle8以后,用户可以定义自己的复杂数据类型,它们由Oracle基本数据类型组合而成。 
    AnyType、AnyData和AnyDataSet 
    Oracle包括3个新的数据类型,用于定义在现有数据类型之外的数据结构。其中每种数据类型必须用程序单元来定义,以便让Oracle9i知道如何处理这些类型的特定实现。 
    类型转换 
    Oracle会自动将某些数据类型转换成其他的数据类型,转换取决于包括该值的SQL语句。 
    数据转换还可以通过Oracle的类型转换函数显示地进行。 
    连接与比较 
    在大多数平台上Oracle SQL中的连接操作符用两条竖线(||)表示。连接是将两个字符值连接。Oracle的自动类型转换功能使得两个数字值也可以进行连接。 
    NULL 
    NULL值是关系数据库的重要特征之一。实际上,NULL不代表任何值,它表示没有值。如果要创建表的一个列,而这个列必须有值,那么应将它指定为NOT NULL,这表示该列不能包含NULL值。 
    任何数据类型都可以赋予NULL值。NULL值引入了SQL运算的三态逻辑。如果比较的一方是NULL值,那么会出现3种状态:TURE、FALSE以及两者都不是。 
    因为NULL值不等于0或其他任何值,所以测试某个数据是否为NULL值只能通过关系运算符IS NULL来进行。 
    NULL值特别适合以下情况:当一个列还未赋值时。如果选择不使用NULL值,那么必须对行的所有列都要赋值。这实际上也取消了某列不需要值的可能性,同时对它赋的值也很容易产生误解。这种情况则可能误导终端用户,并且导致累计操作的错误结果。

    SQL SERVER 数据类型详解 
    数据类型类型描述 
    1)二进制数据类型 
      二进制数据包括 Binary、Varbinary 和 Image 
      Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。 
      Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。 
      Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是n 个字节。 
      在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。 
    (2)字符数据类型 
      字符数据的类型包括 Char,Varchar 和 Text 
      字符数据是由任何字母、符号和数字任意组合而成的数据。 
      Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。 
    (3)Unicode 数据类型 
      Unicode 数据类型包括 Nchar,Nvarchar 和Ntext 
      在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。 
      在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。 
    (4)日期和时间数据类型 
      日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型 
      日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。 
      日期的格式可以设定。设置日期格式的命令如下: 
      Set DateFormat {format | @format _var| 
      其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。 
      例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式 
    (5)数字数据类型 
      数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数 
      整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 
    Int,Smallint和 Tinyint。 
    Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。 
      精确小娄数据在 SQL Server 中的数据类型是Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。 
      在SQL Server 中,近似小数数据的数据类型是Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。 
    (6)货币数据表示正的或者负的货币数量 。 
      在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney  Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。 
    (7)特殊数据类型 
      特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即   Timestamp、Bit 和 Uniqueidentifier。 
      Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。 
      Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。 
      Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。 2.用户定义的数据类型 
      用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为   postal_code 的数据类型,它基于 Char 数据类型。 
      当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。 
    (1)创建用户定义的数据类型 
      创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下: 
      sp_addtype {type},[,system_data_bype][,’null_type’] 
      其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char   等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如’NULL’、’NOT NULL’或者’NONULL’。 
      例子: 
      Use cust 
      Exec sp_addtype ssn,’Varchar(11)’,”Not Null’ 
      创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。 
      例子: 
      Use cust 
      Exec sp_addtype birthday,datetime,’Null’ 
      创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。 
      例子: 
      Use master 
      Exec sp_addtype telephone,’varchar(24),’Not Null’ 
      Eexc sp_addtype fax,’varchar(24)’,’Null’ 
      创建两个数据类型,即 telephone 和 fax 
    (2)删除用户定义的数据类型 
      当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {‘type’}。 
      例子: 
      Use master 
      Exec sp_droptype ‘ssn’ 
      注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。 
    SQL SERVER的字段类型说明 
      以下为SQL SERVER7.0以上版本的字段类型说明。SQL SERVER6.5的字段类型说明请参考SQL SERVER提供的说明。 
    字段类型描述 
    bit 0或1的整型数字 
    int 从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字 
    smallint 从-2^15(-32,768)到2^15(32,767)的整型数字 
    tinyint 从0到255的整型数字 
    decimal 从-10^38到10^38-1的定精度与有效位数的数字 
    numeric decimal的同义词 
    money 从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十 
    smallmoney 从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十 
    float 从-1.79E+308到1.79E+308可变精度的数字 
    real 从-3.04E+38到3.04E+38可变精度的数字 
    datetime 从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒 
    smalldatetime 从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟 
    timestamp 时间戳,一个数据库宽度的唯一数字 
    uniqueidentifier 全球唯一标识符GUID 
    char 定长非Unicode的字符型数据,最大长度为8000 
    varchar 变长非Unicode的字符型数据,最大长度为8000 
    text 变长非Unicode的字符型数据,最大长度为2^31-1(2G) 
    nchar 定长Unicode的字符型数据,最大长度为8000 
    nvarchar 变长Unicode的字符型数据,最大长度为8000 
    ntext 变长Unicode的字符型数据,最大长度为2^31-1(2G) 
    binary 定长二进制数据,最大长度为8000 
    varbinary 变长二进制数据,最大长度为8000 
    image 变长二进制数据,最大长度为2^31-1(2G) 
    段类型说明请参考SQL SERVER提供的说明。

    这里写图片描述 
    这里写图片描述 
    SYBASE的字段类型如下: 
    字段类型描述字段长度及其缺省值 
    Char(Size) 
    用于保存定长(Size)字节的字符串数据。

    每行定长(不足部分补为空格);最大长度为255字节,缺省值为每行1字节。 
    Varchar(Size) 
    用于保存变长的字符串数据。其中最大字节长度由(Size)指定。 
    每行长度可变,最大长度为255字节。数据长度缺省为1 
    Nchar(Size) 
    多字节字符串。 
      
    每行定长(不足部分补为空格)。 长度(Size)是指字符的个数,最大字节数为Size*A@@Nchar Size。 
    Nvarchar(Size) 
    可变长,多字节字符串。 
    每行变长。长度(Size)是指字符的个数,最大字节数为Size*A@@Nchar Size。 
    Binary(Size) 
    固定长度的二进制字符串。 
    每行定长(不足部分补为空格);最大长度为255字节,缺省值为每行1字节。 
    Varbinary(Size) 
    可变长度的长度的二进制字符串。 
    每行长度可变,最大长度为255字节。数据长度缺省为1 
    Timestamp 
    用于改变管理的二进制值。 
    字节数为16 
    Datetime 
    保存定长的日期时间数据,范围为1753年1月1日到公元9999年12月21日,精度为3微秒间隔。 
    每行固定为8字节长度。 
    Smalldatetime 
    保存定长的日期时间数据,范围为1990年1月1日到公元2079年6月6日,精度为分钟间隔。 
    每行固定为4字节长度。 
    Int 
    保存整型数据,范围为-2147483647到+2147483647。 
    最大长度为4字节32 - 1字节或4G。 
    Smallint 
    保存整型数据,范围为-32767到+32767 
    最大长度为2字节32 - 1字节或4G。 
    Tinyint 
    保存整型数据,范围为0到255。 
    最大长度为1字节。 
    Float 
    保存浮点数据类型,范围为-2.23E-308到+2.23E-308。 
    最大长度为8字节。 
    Real 
    保存浮点数据类型,范围为-1.18E-38到+1.18E-38。 
    最大长度为4字节。 
    Numeric(P,S) 
    保存精确数值数据类型,范围为-10E-38到+10E-38,P是精度,总小数位数(1~38),S是小数位(小数位小于等于P) 
    最大长度为2~17字节。 
    Decimal(P,S) 
    保存精确数值数据类型,范围为-10E-38到+10E-38,P是精度,总小数位数(1~38),S是小数位(小数位小于等于P) 
    最大长度为2~17字节。 
    Money 
    保存货币值数据类型,范围为-922337203685477.5808到+922337203685477.5808 
    最大长度为8字节。 
    Smallmoney 
    保存货币值数据类型,范围为-214748.3647到+214748.3647 
    最大长度为4字节。 
    Text 
    保存大于255字节的栏或大于2KB页长度的文本数据。 
    最大长度为2G。 
    Image 
    保存大于255字节的栏或大于2KB页长度的二进制数据。 
    最大长度为2G。

    char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

    展开全文
  • MYSQL的所有字段使用大全,必读,身藏 1.mysql的数值类型 列类型 需要的存储量  TINYINT 1 字节  SMALLINT 2 个字节  MEDIUMINT 3 个字节  INT



    MYSQL的所有字段使用大全,必读,身藏


    1.mysql的数值类型


    列类型                       需要的存储量 
    TINYINT                         1 字节 
    SMALLINT                      2 个字节 
    MEDIUMINT                   3 个字节 
    INT                                 4 个字节 
    INTEGER                       4 个字节 
    BIGINT                           8 个字节 
    FLOAT(X)                       4 如果 X < = 24 或 8 如果 25 < = X < = 53 
    FLOAT                            4 个字节 
    DOUBLE                         8 个字节 
    DOUBLE PRECISION     8 个字节 
    REAL                              8 个字节 

    DECIMAL(M,D)             M字节(D+2 , 如果M < D)


    MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。

    表列出了各种数值类型以及它们的允许范围和占用的内存空间。

    类型

    大小

    范围(有符号)

    范围(无符号)

    用途

    TINYINT

    1字节

    (-128127)

    (0255)

    小整数值

    SMALLINT

    2字节

    (-3276832767)

    (065535)

    大整数值

    MEDIUMINT

    3字节

    (-8388 6088388 607)

    (016777 215)

    大整数值

    INTINTEGER

    4字节

    (-2147 483 6482147 483 647)

    (04294 967 295)

    大整数值

    BIGINT

    8字节

    (-9233 372 036 854 775 8089223 372 036 854 775 807)

    (018446 744 073 709 551 615)

    极大整数值

    FLOAT

    4字节

    (-3.402823 466 E+381.175494 351 E-38)

    0(1.175494 351 E-383.402823 466 351 E+38)

    0(1.175494 351 E-383.402823 466 E+38)

    单精度浮点数值

    DOUBLE

    8字节

    (1.797693 134 862 315 7 E+3082.225073 858 507 201 4 E-308)

    0(2.225073 858 507 201 4 E-3081.797693 134 862 315 7 E+308)

    0(2.225073 858 507 201 4 E-3081.797693 134 862 315 7 E+308)

    双精度
    浮点数值

    DECIMAL

    DECIMAL(M,D),如果M>D,为M+2否则为D+2

    依赖于MD的值

    依赖于MD的值

    小数值



    INT 类型

      在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

      MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围

      万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。

      UNSIGNED(未签署) 修饰符规定字段只保存正值。因为不需要保存数字的正、负符号,可以在储时节约一个“位”的空间。从而增大这个字段可以存储的值的范围。

      ZEROFILL(零填充) 修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。

    FLOAT、DOUBLE 和 DECIMAL 类型

      MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。

      与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字。

      对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

      DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。

      忽略 DECIMAL 数据类型的精度和计数方法修饰符将会使 MySQL 数据库把所有标识为这个数据类型的字段精度设置为 10,计算方法设置为 0。

      UNSIGNED(未签署) 和 ZEROFILL(零填充) 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。


    2、日期和时间类型

    列类型                  需要的存储量 
    DATE                        3 个字节 
    DATETIME                8 个字节 
    TIMESTAMP             4 个字节 
    TIME                         3 个字节 
    YEAR                        1 字节

          在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。根据要求的精度,子类型在每个分类型中都可以使用,并且 MySQL 带有内置功能可以把多样化的输入格式变为一个标准格式


    类型

    大小

    范围(有符号)

    范围(无符号)

    用途

    DATE

    3字节

    1000-01-01/9999-12-31

    YYYY-MM-DD

    日期值

    TIME

    3字节

    '-838:59:59'/'838:59:59'

    HH:MM:SS

    时间值或持续时间

    YEAR

    1字节

    1901/2155

    YYYY

    年份值

    DATETIME

    8字节

    1000-01-0100:00:00/9999-12-31 23:59:59

    YYYY-MM-DDHH:MM:SS

    混合日期和时间值

    TIMESTAMP

    8字节

    1970-01-0100:00:00/2037年某时

    YYYYMMDDHHMMSS

    混合日期和时间值,时间戳


    DATE、TIME 和 TEAR 类型

      MySQL 用 DATE 和 TEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,DATE 类型的值应该使用连字号作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。

      需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

      MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 TEAR 类型输入的两个数字进行最大限度的通译。因为所有 TEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。

    DATETIME 和 TIMESTAMP 类型

       除了日期和时间数据类型,MySQL 还支持 DATEYIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

      如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。


    3、字符串类型

    列类型                                                    需要的存储量 
    CHAR(M)                                                M字节,1 <= M <= 255 
    VARCHAR(M)                                         L+1 字节, 在此L <= M和1 <= M <= 255 
    TINYBLOB, TINYTEXT                           L+1 字节, 在此L< 2 ^ 8 
    BLOB, TEXT                                            L+2 字节, 在此L< 2 ^ 16 
    MEDIUMBLOB, MEDIUMTEXT               L+3 字节, 在此L< 2 ^ 24 
    LONGBLOB, LONGTEXT                        L+4 字节, 在此L< 2 ^ 32 
    ENUM('value1','value2',...)                        1 或 2 个字节, 取决于枚举值的数目(最大值65535) 
    SET('value1','value2',...)                            1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

          MySQL 提供了 8 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。


    类型

    大小

    用途

    CHAR

    0-255字节

    定长字符串

    VARCHAR

    0-255字节  补充,mysql5.5之后,长度为0-65535字节

    变长字符串

    TINYBLOB

    0-255字节

    不超过255个字符的二进制字符串

    BLOB

    0-65535字节

    二进制形式的长文本数据

    MEDIUMBLOB

    0-16777 215字节

    二进制形式的中等长度文本数据

    LOGNGBLOB

    0-4294 967 295字节

    二进制形式的极大文本数据

    TINYTEXT

    0-255字节

    短文本字符串

    TEXT

    0-65535字节

    长文本数据

    MEDIUMTEXT

    0-16777 215字节

    中等长度文本数据

    LONGTEXT

    0-4294 967 295字节

    极大文本数据



    CHAR 和 VARCHAR 类型

      CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

      CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。

      CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MuSQL 数据库处理这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。

      因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

      VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。

    TEXT 和 BLOB 类型

      对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

      TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。


    3、复合类型

      MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

    ENUM 类型

      ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

       ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

      MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

    SET 类型

      SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

      一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。

      希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。


    展开全文
  • 大小 INDEXES 索引信息,比如类型、唯一性和被涉及的表 IND_COLUMNS 索引列信息,比如索引上的列的排序方式 OBJECTS 对象信息,比如状态和DDL time ROLE_PRIVS 角色权限,比如GRANT 和ADMIN选项 SEGMENTS 表和索引...

    Oracle数据库字典
        
    Oracle的绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLESUSER_TABLES这样的视图家族。Oracle中有超过100个视图家族,下表列出了最重要和最常用的视图家族,需要注意的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。

    视图家族

    描述

    COL_PRIVS

    包含了表的列权限,包括授予者、被授予者和权限

    EXTENTS

    数据范围信息,比如数据文件,数据段名(segment_name)和大小

    INDEXES

    索引信息,比如类型、唯一性和被涉及的表

    IND_COLUMNS

    索引列信息,比如索引上的列的排序方式

    OBJECTS

    对象信息,比如状态和DDL time

    ROLE_PRIVS

    角色权限,比如GRANT和ADMIN选项

    SEGMENTS

    表和索引的数据段信息,比如tablespace和storage

    SEQUECNCES

    序列信息,比如序列的cache、cycle和ast_number

    SOURCE

    除触发器之外的所有内置过程、函数、包的源代码

    SYNONYMS

    别名信息,比如引用的对象和数据库链接db_link

    SYS_PRIVS

    系统权限,比如grantee、privilege、admin选项

    TAB_COLUMNS

    表和视图的列信息,包括列的数据类型

    TAB_PRIVS

    表权限,比如授予者、被授予者和权限

    TABLES

    表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量

    TRIGGERS

    触发器信息,比如类型、事件、触发体(trigger body)

    USERS

    用户信息,比如临时的和缺省的表空间

    VIEWS

    视图信息,包括视图定义

    Oracle中还有一些不常用的数据字典表,但这些表不是真正的字典家族,他们都是一些重要的单一的视图。这些视图见下表:

    视图名称

    描述

    USER_COL_PRIVS_MADE

    用户授予他人的列权限

    USER_COL_PRIVS_RECD

    用户获得的列权限

    USER_TAB_PRIVS_MADE

    用户授予他人的表权限

    USER_TAB_PRIVS_RECD

    用户获得的表权限

    Oracle数据库字典的应用
    借助Oracle数据字典,利用OracleDDL语句,我们可以做很多事情,几乎所有的Oracle开发辅助工具都是利用这一点进行设计的。作者将通过如何取得数据库表字段信息来说明。
    首先我们定义一个数据库表,数据库表结构如下:

    数据库表名[TABLE_TEST]

    字段名

    数据类型

    长度

    缺省值

    允许空

    主键

    注释

    NAME

    VARCHAR2

    40

     

    N

    Y

    姓名

    ***

    VARCHAR2

    1

    ''''Y''''

    N

     

    性别

    BIRTHDAY

    DATE

    0

     

    Y

     

    生日

    HEIGHT

    NUMBER

    3,1

     

    Y

     

    身高

    WEIGHT

    NUMBER

    3,1

     

    Y

     

    体重

    MEMO

    BLOB

    0

     

    Y

     

    备注

    创建表的SQL语句如下
    -- 创建数据表
    create table TABLE_TEST
    (
        NAME varchar2(40) not null,
        *** varchar2(1) default ''''Y'''' not null,
        BIRTHDAY date not null,
        HEIGHT number(3,2),
        WEIGHT number(3,2),
        MEMO blob
    );
    -- 给列添加备注
      
    comment on column TABLE_TEST.NAME is ''''姓名'''';
      comment on column TABLE_TEST.*** is ''''
    性别'''';
      comment on column TABLE_TEST.BIRTHDAY is ''''
    生日'''';
      comment on column TABLE_TEST.HEIGHT is ''''
    身高'''';
      comment on column TABLE_TEST.WEIGHT is ''''
    体重'''';
      comment on column TABLE_TEST.MEMO is ''''
    备注'''';
    -- 创建约束关系 主键 外键 其他
      
    alter table TABLE_TEST add constraint TB_TEST_P_NAME primary key (NAME);

    数据表创建完毕,执行下列SQL语句:
    select
        A.column_name 
    字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,
        A.Data_Scale 
    小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注
    from
        user_tab_columns A,user_col_comments B
    where
        A.Table_Name = B.Table_Name
        and A.Column_Name = B.Column_Name
        and A.Table_Name = ''''TABLE_TEST''''

    我们可以得出一下结果:

    字段名

    数据类型

    长度

    整数位

    小数位

    允许空值

    缺省值

    备注

    NAME

    VARCHAR2

    40

     

     

    N

     

    姓名

    ***

    VARCHAR2

    1

     

     

    N

     

    性别

    BIRTHDAY

    DATE

    7

     

     

    N

     

    生日

    HEIGHT

    NUMBER

    22

    3

    2

    Y

     

    身高

    WEIGHT

    NUMBER

    22

    3

    2

    Y

     

    体重

    MEMO

    BLOB

    4000

     

     

    Y

     

    备注

    这样,我们在进行程序设计时,通过一条简单的SQL语句,然好通过Ole调用Word,便可为最终用户导出完整的数据库表字典文档。
    再执行下列SQL语句:
    select
        INDEX_NAME 
    索引名,INDEX_TYPE 索引类型,UNIQUENESS 索引类别
    from
        user_indexes
    where
        TABLE_NAME = ''''TABLE_TEST''''

    得到结果如下(注:SYS_IL0000031226C00006$$索引为系统在创建数据库表时自动创建的,用于数据库表内容的维护):

     

    索引名

    索引类型

    索引类别

    1

    SYS_IL0000031226C00006$$

    LOB

    UNIQUE

    2

    TB_TEST_P_NAME

    NORMAL

    UNIQUE

     

    执行下列SQL语句,我们将得到更多的关于数据库表结构的信息:
    select
        A.column_name 
    字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,
        A.Data_Scale 
    小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注,
        C.IndexCount 
    索引次数
    from
        user_tab_columns A,
        user_col_comments B,
        (select count(*) IndexCount,Column_Name from User_Ind_Columns where Table_Name = ''''TABLE_TEST'''' group by Column_Name) C
    where
        A.Table_Name = B.Table_Name
        and A.Column_Name = B.Column_Name
        and A.Column_Name = C.Column_Name(+)
        and A.Table_Name = ''''TABLE_TEST''''

    得到结果如下:

    字段名

    数据类型

    长度

    整数位

    小数位

    允许空值

    缺省值

    备注

    索引次数

    BIRTHDAY

    DATE

    7

     

     

    N

     

    生日

     

    HEIGHT

    NUMBER

    22

    3

    2

    Y

     

    身高

     

    MEMO

    BLOB

    4000

     

     

    Y

     

    备注

     

    NAME

    VARCHAR2

    40

     

     

    N

     

    姓名

    1

    ***

    VARCHAR2

    1

     

     

    N

     

    性别

     

    WEIGHT

    NUMBER

    22

    3

    2

    Y

     

    体重

     

        当然Oracle数据字典的应用远不止这些,通过Oracle数据库字典的支持,我们可以得到Oracle数据库结构的所有信息,著名的数据库开发工具PL/SQL Developer完全就是基于Oracle的数据库字典实现的。
    展开全文
  • 字段类型与合理的选择字段类型

    千次阅读 2017-09-19 23:11:47
    本篇博客稍微有点长,它实际上包括两个内容:一是mysql字段类型的...许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或

    本篇博客稍微有点长,它实际上包括两个内容:一是mysql字段类型的介绍,二是在mysql建表过程中是如何正确选择这些字段类型;

    字段类型

    数值

    MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。
    许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。

    • INT
      在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

    MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展(如 INT(6),6即是其宽度指示器,该宽度指示器并不会影响int列存储字段的大小,也就是说,超过6位它不会自动截取,依然会存储,只有超过它本身的存储范围才会截取;此处宽度指示器的作用在于该字段是否有zerofill,如果有就未满足6位的部分就会用0来填充),这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

    万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。

    • unsigned 和 zerofill
      UNSIGNED 修饰符规定字段只保存正值,即无符号,而mysql字段默认是有符号的。因为不需要保存数字的正、负符号,可以在储时节约一个"位"的空间(即翻一倍)。从而增大这个字段可以存储的值的范围。注意这个修饰符要紧跟在数值类型后面;
      ZEROFILL 修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值,如果某列设置为zerofill,那它自动就unsigned。这个值要配合int,tinyint,smallint,midiumint等字段的宽度指示器来用;XXint(M),如果没有zerofill,这个M的宽度指示器是没有意义的.(注意,测试前导0的时候,还是去黑窗口测试;)

    为什么mysql存储的值要分有符号和无符号呢?因为一个字节,占8bit;也就1个bit有0和1两种可能,8个bit就是2^8 = 256种可能,也就是0~255;但如果是有符号的话,就得拿一个1bit来存储这个负号,本来8bit只剩7bit,2^7 = 128,也就是-128~127(正数部分包含一个0);

    • FLOAT、DOUBLE 和 DECIMAL 类型
      MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。
      与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器(必须要带有指示器,要不然会查不到结果,并且宽度指示器和XXint类型的宽度指示器不同,这里是有实际限制宽度的)。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字(包括小数位),小数点后面带有 3 位数字。对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。
      DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。
      FLOAT 类型在长度比较高比如 float(10,2)和 decimal(10,2)同时插入一个符合(10,2)宽度的数值,float 就会出现最后小数点出现一些出入;
      UNSIGNED 和 ZEROFILL 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。

    关于flaot和double
    在这里我建议,干脆忘记mysql有double这个数据类型。至于why?就不要管它了

    字符串类型

    MySQL 提供了 8 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

    • BINARY
      BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写

      SELECT BINARY 'ABCD' = 'abcd' as COM1,'ABCD' = 'abcd' as COM2; -- COM1输出为0,COM2输出为1;
      
    • CHAR 和 VARCHAR 类型
      CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补

    CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。

    CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。

    CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。

    因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。但如果确切知道字符串长度,比如就在50~55之间,那就用 CHAR 因为 CHAR 类型由于本身定长的特性使其性能要高于 VARCHAR;

    VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。

    • TEXT 和 BLOB 类型
      对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

    TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。

    时间类型

    在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。

    • DATE、TIME 和 YEAR 类型
      MySQL 用 DATE 和 YEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,DATE 类型的值应该使用连字号作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。

    需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

    MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 YEAR 类型输入的两个数字进行最大限度的通译。因为所有 YEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。

    • DATETIME 和 TIMESTAMP 类型
      除了日期和时间数据类型,MySQL 还支持 DATETIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

    如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。

    复合类型

    MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

    • ENUM 类型
      ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

    ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

    MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

    • SET 类型
      SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。
      一个 SET 类型最多可以包含 64 项元素。还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。
      希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。

    字段类型总结

    1. 虽然上面列出了很多字段类型,但最常用也就是 varchar(255),char(255),text,tinyint(4),smallint(6),mediumint,int(11)几种。

    2. 复合类型我们一般用tinyint,更快的时间更省的空间以及更容易扩展

    3. 关于手机号,推荐用char(11),char(11)在查询上更有效率,因为手机号是一个活跃字段参与逻辑会很多。

    4. 一些常用字段举例
      姓名:char(20)
      价格:DECIMAL(7, 3)
      产品序列号:SMALLINT(5) unsigned
      文章内容: TEXT
      MD5: CHAR(32)
      ip: char(15)
      time: int(10)
      email char(32)

    合理的选择数据类型

    • 选择合理范围内最小的
      我们应该选择最小的数据范围,因为这样可以大大减少磁盘空间及磁盘I/0读写开销,减少内存占用,减少CPU的占用率。

    • 选择相对简单的数据类型
      数字类型相对字符串类型要简单的多,尤其是在比较运算时,所以我们应该选择最简单的数据类型,比如说在保存时间时,因为PHP可以良好的处理LINUX时间戳所以我们可以将日期存为int(10)要方便、合适、快速的多

    但是,工作中随着项目越做越多,业务逻辑的处理越来越难以后,我发现时间类型还是用时间类型本身的字段类型要好一些,因为mysql有着丰富的时间函数供我使用,方便我完成很多与时间相关的逻辑,比如月排行榜,周排行榜,当日热门,生日多少天等等逻辑

    • 不要使用null
      为什么这么说呢,因为MYSQL对NULL字段索引优化不佳,增加更多的计算难度,同时在保存与处理NULL类形时,也会做更多的工作,所以从效率上来说,不建议用过多的NULL。有些值他确实有可能没有值,怎么办呢?解决方法是数值弄用整数0,字符串用空来定义默认值即可。

    • 字符串类型的使用
      字符串数据类型是一个万能数据类型,可以储存数值、字符串、日期等。
      保存数值类型最好不要用字符串数据类型,这样存储的空间显然是会更大,而且在排序时字符串的9是大于22的,其实如果进行运算时mysql会将字符串转换为数值类型,大大降低效果,而且这种转换是不会走原有的索引的。
      如果明确数据在一个完整的集合中如男,女,那么可以使用set或enum数据类型,这种数据类型在运算及储存时以数值方式操作,所以效率要比字符串更好,同时空间占用更少。

    • VARCHAR与CHAR
      VARCHAR是可变长度字符串类型,那么即然长度是可变的就会使用1,2个字节来保存字符的长度,如果长度在255内使用1个字节来保存字符长度,否则使用2个字符来保存长度。由于varchar是根据储存的值来保存数据,所以可以大大节约磁盘空间。
      如果数据经常被执行更新操作,由于VARCHAR是根据内容来进行储存的,所以mysql将做更多的工作来完成更新操作,如果新数据长度大于老数据长度一些存储引擎会进行拆分操作处理。同时varchar会完全保留内部所有数据,最典型的说明就是尾部的空格。
      CHAR固定长度的字符串保存类型,CHAR会去掉尾部的空格。在数据长度相近时使用char类型比较合适,比如md5加密的密码用户名等。
      如果数据经常进行更新修改操作,那么CHAR更好些,因为char长度固定,性能上要快。

    • 数值类型的选择
      数值数据类型要比字符串执行更快,区间小的数据类型占用空间更少,处理速度更快,如tinyint可比bigint要快的多

      选择数据类型时要考虑内容长度,比如是保存毫米单位还是米而选择不同的数值类型

      整数

      整数类型很多比如tinyint、int、smallint、bigint等,那么我们要根据自己需要存储的数据长度决定使用的类型,同时tinyint(10)与tinyint(100)在储存与计算上并无任何差别,区别只是显示层面上,但是我们也要选择适合合适的数据类型长度。可以通过指定zerofill属性查看显示时区别。

      浮点数与精度数值

      浮点数float在储存空间及运行效率上要优于精度数值类型decimal,但float与double会有舍入错误而decimal则可以提供更加准确的小数级精确运算不会有错误产生计算更精确,适用于金融类型数据的存储。

    from: https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39325
    展开全文
  • SQL SERVER中的tinyint:从 0 到 255 的整型数据。...表中的“类型”字段,不会少吧,比如订单有订单类型、取消原因类型等等10来个类型字段,(这些类型,最多有10多个值,再加也多不到哪去),其他的虽然
  • 数据范围信息,比如数据文件,数据段名(segment_name)和大小 INDEXES 索引信息,比如类型、唯一性和被涉及的表 IND_COLUMNS 索引列信息,比如索引上的列的排序方式...
  • MySQL字段类型详解

    2019-04-04 08:48:05
    MySQL 字段类型 ...类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3 字节 (-8 388 6...
  • MySQL 字段类型

    千次阅读 2018-06-19 21:08:56
    值得注意的是---无论数值还是字符,这些类型的子类是字节,它们的不同仅仅在于支持数据大小不同而已。数值 MySQL 的数值类型可大致划分为两个类别,一个是整数,另一个是浮点数或小数。 MySQL 允许我们指定数值...
  • Mysql哪些字段适合建立索引

    万次阅读 2020-06-26 21:34:19
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B 、复合...
  • 检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。 3,尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。 4,对于小型的表,建立索引可能会影响...
  • MySQL字段类型

    千次阅读 2019-06-12 10:26:02
    大小 范围(有符号) 范围(无符号) 用途 tinyint 1 字节 -128 ~ 127 0 ~ 255 小整数值 smallint 2 字节 -32768 ~ 32767 0 ~ 65535 大整数值 mediumint 3 字节 -8388608 ~ 8388607 0 ...
  • mysql常用字段类型简介

    千次阅读 2018-12-11 14:03:16
    ##mysql字段类型 1、tinyint、smallint、mediumint、int、integer、bigint详解 1)tinyint:存储所占一个字节,一个字节等于8bit,根据1bit可以存储0到1两种可能性,因此tinyint类型可以存储2的8次方,也就是256种...
  • 数据范围信息,比如数据文件,数据段名(segment_name)和大小 INDEXES 索引信息,比如类型、唯一性和被涉及的表 IND_COLUMNS 索引列信息,比如索引上的列的排序方式...
  • Mysql字段类型与合理选择

    千次阅读 2018-07-26 11:54:21
    许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。 INT 在 MySQL 中支持的 5 个主要...
  • 属性和字段 kotlin官方中文属性和字段 传送门 在java中 有类成员变量的定义,而且类成员变量可以只声明不初始化...属性是一个类的某个特征,这个特征可能是可变的如年龄,也可能是不可变的如性别,我们在使用某个类的...
  • 那些字段适不适合建索引

    千次阅读 2019-05-28 11:30:19
    数据库建立索引常用的规则如下: 1、表的主键、外键必须有索引;...6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段...
  • dedecms数据库表和字段说明汇总

    千次阅读 2017-05-27 08:39:33
    表名:dede_addonarticle (ENGINE=MyISAM/CHARSET=gbk) ...字段名 说明描述 具体参数 aid 文章ID mediumint(8) unsigned NOT NULL default '0' typeid 栏目ID smallint(5) uns
  • 为表中的字段选择合适的数据类型 1、当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期和二进制类型,最后是字符类型。 2、对于相同级别的数据类型,应该优先选择占用空间小的数据类型。 之所以...
  • Mysql 字段类型分析

    万次阅读 2013-02-22 13:21:08
    mysql建表初步知识及字段类型 一、如何登录phpMyAdmin环境  phpMyAdmin可以对mysql数据库进行完全管理。在IE地址中输入地址,输入数据库帐号和密码,登录phpMyAdmin。 二、几个概念 1、数据库:在...
  • MySQL字段类型(转)

    千次阅读 2018-08-02 11:39:07
    MySQL字段类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。   数值类型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,588
精华内容 10,635
关键字:

性别的字段大小是