SQL:2016標準概念之數(shù)據(jù)類型

作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學,十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗,目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設(shè)計。CSDN學院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


文章目錄

        基本信息
        空值
        預定義類型
            數(shù)字類型
            字符串類型
            二進制串類型
            布爾類型
            日期時間類型
            時間間隔類型
            XML類型
        原子構(gòu)造類型
            引用類型
        復合構(gòu)造類型
            集合類型
            字段
            行類型

我在 CSDN 學院發(fā)布的 SQL 入門視頻教程。

本文介紹ISO/IEC 9075:2016中對SQL數(shù)據(jù)類型的規(guī)范描述。
基本信息

每個數(shù)據(jù)值都屬于某種數(shù)據(jù)類型。

數(shù)據(jù)類型分為預定義類型、構(gòu)造類型和自定義類型。每個數(shù)據(jù)類型都有一個名稱。預定義類型和構(gòu)造類型的名稱屬于保留字,由ISO/IEC 9075中描述這些數(shù)據(jù)類型的相應部分指定。自定義類型的名稱在類型的定義中指定。自定義類型屬于模式對象(schema object)。

預定義數(shù)據(jù)類型由ISO/IEC 9075指定,因此,各種SQL實現(xiàn)都提供支持。即使在指定時,某些數(shù)據(jù)類型要求(或者允許)提供某種參數(shù)(例如數(shù)字類型的精度),它們?nèi)匀粚儆陬A定義類型。

預定義數(shù)據(jù)類型具有原子性。原子類型是指那些值不是由其他數(shù)據(jù)類型值組成的數(shù)據(jù)類型。某些操作能夠獲取部分字符串或者日期時間值(SUBSTRING、EXTRACT),但這并不意味著字符串或日期時間不是原子類型。

構(gòu)造類型可以是原子類型或者復合類型。復合類型的值由零個或多個值組成,它們屬于某個已聲明的數(shù)據(jù)類型。
空值

每個數(shù)據(jù)類型都包含一個特殊值,稱為空值,有時候使用關(guān)鍵字NULL表示??罩蹬c其他值存在以下幾個方面的不同:

    因為每個數(shù)據(jù)類型都存在空值,使用關(guān)鍵字NULL表示的空值,它的類型是不確定的;所以NULL只能在某些上下文中表示空值,而不是所有能夠使用字面值的地方。
    雖然空值既不等于任何其他值,也不不等于任何其他值–判斷空值等于或者不等于任何值的結(jié)果是未知的。但是,在某些情況下,多個空值將被歸為一類;例如,分組操作<group by clause>將所有空值當作一個組。

預定義類型
數(shù)字類型

數(shù)字類型分為兩種:精確數(shù)字類型,包括整數(shù)類型和指定了精度及小數(shù)位數(shù)的數(shù)字類型;近似數(shù)字類型,也就是浮點數(shù),它的精度是可選的。

每個數(shù)字都擁有精度(數(shù)字位數(shù)),精確數(shù)字類型還擁有刻度(小數(shù)位數(shù))。算術(shù)運算可能使用不同的數(shù)字類型或者相同的數(shù)字類型,運算結(jié)果的類型取決于操作數(shù)的類型。如果運算結(jié)果的類型不能精確地表示結(jié)果值,各種SQL實現(xiàn)可以自己決定進行舍入還是截斷。如果結(jié)果值超出了運算結(jié)果類型的數(shù)值范圍,或者在操作數(shù)上沒有定義該種算術(shù)運算,將會拋出異常。
字符串類型

一個字符串類型的值是特定字符集中的字符串(序列)。字符串S中的字符也來自相同的字符集CS。如果S是某個表達式E的值,CS就是為E的聲明類型所指定的字符集。字符串類型可以是固定長度,也可以是可變長度,最大長度取決于具體SQL實現(xiàn)。一個字符大對象類型的值是某個字符集中的一個字符串,并且總是與某一個確定的字符串相關(guān)。大對象字符串長度可變,最大長度取決于具體SQL實現(xiàn),通??梢员绕渌址L度更大。

一個字符串可以基于某種具體的字符集指定,方式就是在數(shù)據(jù)類型中指定CHARACTER SET。具體SQL實現(xiàn)可以指定一個特殊的字符集作為國家字符集,在指定數(shù)據(jù)類型是可以使用NATIONAL CHARACTER、NATIONAL CHARACTER VARYING或者NATIONAL CHARACTER LARGE OBJECT(或者其他等價的語法形式)指定基于國家字符集的字符串類型。
二進制串類型

一個二進制串類型的值是一個字節(jié)串(序列)。二進制串類型可以是固定長度,也可以是可變長度,最大長度取決于具體SQL實現(xiàn)。一個二進制大對象類型的值是一個字節(jié)串。二進制大對象串長度可變,最大長度取決于具體SQL實現(xiàn),通??梢员绕渌M制串長度更大。
布爾類型

一個布爾數(shù)據(jù)類型的值可以是true或者false。unknown的實際值有時候可以使用空值表示。
日期時間類型

日期時間類型存在3種形式,可以用于指定包含日期時間各個部分的值。

一個TIMESTAMP數(shù)據(jù)類型的值包含日期時間中的YEAR(從0001到9999)、MONTH、DAY、HOUR、MINUTE和SECOND值。

一個TIME數(shù)據(jù)類型的值包含日期時間中的HOUR、MINUTE和SECOND值。

一個DATE數(shù)據(jù)類型的值包含日期時間中的YEAR(從0001到9999)、MONTH、DAY值。

一個DATE值是一個有效的公歷日期。一個TIME值是一個有效的時間。

TIMESTAMP和TIME可以指定小數(shù)秒的精度位數(shù)。

TIMESTAMP和TIME還可以指定WITH TIME ZONE,這樣的值都包含一個時區(qū)偏移量。在比較WITH TIME ZONE數(shù)據(jù)類型的值時,時區(qū)偏移量不會考慮在內(nèi)。
時間間隔類型

一個時間間隔類型的值表示一段時間。時間間隔存在兩種類型。第一種類型,稱為year-month時間間隔,包含了YEAR和/或MONTH的間隔精度值。另一種類型,稱為day-time時間間隔,包含了除YEAR和MONTH部分之外的任何連續(xù)的日期時間間隔精度值。
XML類型

XML類型的值稱為XML值。
原子構(gòu)造類型
引用類型

引用類型是一個構(gòu)造數(shù)據(jù)類型,它的值引用(指向)了某個被引用類型值的存儲地址。唯一可能被引用的對象是類型表(typed tables,使用自定義的結(jié)構(gòu)化類型定義的表)中的行。所以每個被引用的類型都是一個結(jié)構(gòu)化類型。
復合構(gòu)造類型
集合類型

一個集合由零個或多個指定數(shù)據(jù)類型(稱為元素類型)的元素組成。

數(shù)組是一個有序集合,數(shù)組中的元素可以存在重復值,通過它們在數(shù)組中的位置進行引用。

數(shù)組類型通過數(shù)組類型構(gòu)造函數(shù)創(chuàng)建。

多重集合(multiset)是一個允許包含重復值的無序集合。

多重集合類型通過多重集合類型構(gòu)造函數(shù)創(chuàng)建。
字段

字段是一個(字段名, 數(shù)據(jù)類型)對。字段的值是它的數(shù)據(jù)類型的值。
行類型

一個行類型是由一個或多個字段組成的序列。一個行類型的值是由這些字段值組成的序列。