SQL:2016標(biāo)準(zhǔn)概念之?dāng)?shù)據(jù)類型

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


文章目錄

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

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

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

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

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

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

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

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

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

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

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

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

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

一個(gè)字符串類型的值是特定字符集中的字符串(序列)。字符串S中的字符也來自相同的字符集CS。如果S是某個(gè)表達(dá)式E的值,CS就是為E的聲明類型所指定的字符集。字符串類型可以是固定長度,也可以是可變長度,最大長度取決于具體SQL實(shí)現(xiàn)。一個(gè)字符大對象類型的值是某個(gè)字符集中的一個(gè)字符串,并且總是與某一個(gè)確定的字符串相關(guān)。大對象字符串長度可變,最大長度取決于具體SQL實(shí)現(xiàn),通常可以比其他字符串長度更大。

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

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

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

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

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

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

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

一個(gè)DATE值是一個(gè)有效的公歷日期。一個(gè)TIME值是一個(gè)有效的時(shí)間。

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

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

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

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

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

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

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

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

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

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

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

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