zoukankan      html  css  js  c++  java
  • 【转载】SQLite 3 中的数据类型

    SQLite使用动态类型系统,在SQLite中,值的数据类型和值本身,而不是和它的容器,关联在一起的。(值的数据类型和值本身是关联在一起的)SQLite的动态类型系统和其他数据库引擎的静态类型系统是兼容的,这样在静态类型的数据库上执行的SQL语句也可以在SQLite中执行。

    1.0 存储类(storage class)和数据类型

    每个存储在SQLite数据库中(或被数据库引擎操纵的)的值都有下列存储类的一个:

    • NULL。空值。
    • INTEGER。有符号整数,存储在1、2、3、4、6或8个字节中。
    • REAL。浮点数,存储为8字节的IEEE浮点数。
    • TEXT。文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储。
    • BLOB。大块数据。

    注意存储类(storage class)比数据类型更一般。INTEGER存储类,例如,包含6种长度不同的整数数据类型。这在磁盘中是有区别的。不过一旦INTEGER值从磁盘读到内存中进行处理的时候,这些值会转化为更普通的数据类型(8位有符号整数)。因此在大部分情况下,存储类和数据类型是不易分辨的,这两个术语可以交换使用。

    在SQLite 3 数据库中,任何列,除了INTEGER PRIMARY KEY列,都可以存储任何存储类的值。

    SQL语句中的所有值,不管是SQL语句中嵌入的字面值,还是预编译的SQL语句中的参数,都有一个隐式的存储类。在下面描述的条件下,在查询执行阶段,数据库引擎可能会在数字存储类(INTEGER和REAL)和TEXT存储类之间转换。(转换为数字存储类、或者转换为TEXT存储类

    1.1 Boolean数据类型

    SQLite没有单独的Boolean存储类,相反,Booean值以整数0(false)和1(true)存储。

    1.2 日期和时间数据类型

    SQLite没有为存储日期和/或时间设置专门的存储类,相反,内置的日期和时间函数能够把日期和时间作为TEXT,REAL或INTEGER值存储:

    • TEXT:作为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS")。
    • REAL:作为Julian天数,……(原文:as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.)
    • INTEGER:作为Unix Time,即自1970-01-01 00:00:00 UTC以下的秒数。

    2.0 类型相像(type affinity)

    为了最大化SQLite和其他数据库引擎之间的兼容性,SQLite支持列的“类型相像”的概念。这里重要的思想是,类型是推荐的,不是必需的。任何列仍然能够存储任何类型的数据。只是某些列,能够选择优先使用某种存储类。这个对列的优先存储类称作它的“相像”。

    SQLite 3 数据库中的每个列都赋予下面类型相像中的一个:

    • TEXT
    • NUMERIC
    • INTEGER
    • REAL
    • NONE

    带有TEXT相像的列会使用存储类NULL、TEXT或BLOB来存储所有的数据。如果数据数据被插入到带有TEXT相像的列中,它会在插入前转换为文本格式。

    带有NUMERIC相像的列可以使用所有5个存储类来包含值。当文本数据被插入到一个NUMERIC列,文本的存储类会被转换成INTEGER或 REAL(为了优先),如果这个转换是无损的和可逆的话。如果TEXT到INTEGER或REAL的转换是不可能的,那么值会使用TEXT存储类存储。不 会试图转换NULL或BLOB值。

    ……

    2.1 列相像的确定

    列相像是由列声明的类型确定的,规则是按照下面的顺序:

    1. 如果声明的类型包含字符串”INT“那么它被赋予INTEGER相像。

    2. 如果列声明的类型包含任何字符串”CHAR“,”CLOB“,或”TEXT“,那么此列拥有TEXT相像。注意类型VARCHAR包含”CHAR“,因此也会赋予TEXT相像。

    3. 如果列声明的类型包含”BLOB“或没有指定类型,那么此列拥有NONE相像。

    4. 如果列声明的类型包含任何”REAL“,”FLOA“,或”DOUB“,那么此列拥有REAL相像。

    5. 其他情况,相像是NUMERIC。

    注意规则的顺序是重要的。声明类型为“CHARINT”的列同时匹配规则1和规则2,但第一个规则会优先采用,因此此列的相像是INTEGER。

    2.2 相像示例

    示例 相像结果 规则
    INT
    INTEGER
    TINYINT
    SMALLINT
    MEDIUMINT
    BIGINT
    UNSIGNED BIG INT
    INT2
    INT8
    INETGER 1
    CHARACTER(20)
    VARCHAR(255)
    VARYING CHARACTER(255)
    NCHAR(55)
    NATIVE CHARACTER(70)
    NVARCHAR(100)
    TEXT
    CLOB
    TEXT 2
    BLOB
    未指定数据类型
    NONE 3
    REAL
    DOUBLE
    DOUBLE PRECISION
    FLOAT
    REAL 4
    NUMERIC
    DECIMAL(10, 5)
    BOOLEAN
    DATE
    DATETIME
    NUMERIC 5

    注意“FLOATING POINT”类型会指定INTEGER相像,而不是REAL相像,因为”INT“在末尾。”STRING“类型会拥有NUMERIC相像,而不是TEXT。

    (略)

    http://www.sqlite.org/datatype3.html

  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/2767596.html
Copyright © 2011-2022 走看看