SQL:2016标准概念之数据类型

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


文章目录

        基本信息
        空值
        预定义类型
            数字类型
            字符串类型
            二进制串类型
            布尔类型
            日期时间类型
            时间间隔类型
            XML类型
        原子构造类型
            引用类型
        复合构造类型
            集合类型
            字段
            行类型

我在 CSDN 学院发布的 SQL 入门视频教程。

本文介绍ISO/IEC 9075:2016中对SQL数据类型的规范描述。
基本信息

每个数据值都属于某种数据类型。

数据类型分为预定义类型、构造类型和自定义类型。每个数据类型都有一个名称。预定义类型和构造类型的名称属于保留字,由ISO/IEC 9075中描述这些数据类型的相应部分指定。自定义类型的名称在类型的定义中指定。自定义类型属于模式对象(schema object)。

预定义数据类型由ISO/IEC 9075指定,因此,各种SQL实现都提供支持。即使在指定时,某些数据类型要求(或者允许)提供某种参数(例如数字类型的精度),它们仍然属于预定义类型。

预定义数据类型具有原子性。原子类型是指那些值不是由其他数据类型值组成的数据类型。某些操作能够获取部分字符串或者日期时间值(SUBSTRING、EXTRACT),但这并不意味着字符串或日期时间不是原子类型。

构造类型可以是原子类型或者复合类型。复合类型的值由零个或多个值组成,它们属于某个已声明的数据类型。
空值

每个数据类型都包含一个特殊值,称为空值,有时候使用关键字NULL表示。空值与其他值存在以下几个方面的不同:

    因为每个数据类型都存在空值,使用关键字NULL表示的空值,它的类型是不确定的;所以NULL只能在某些上下文中表示空值,而不是所有能够使用字面值的地方。
    虽然空值既不等于任何其他值,也不不等于任何其他值–判断空值等于或者不等于任何值的结果是未知的。但是,在某些情况下,多个空值将被归为一类;例如,分组操作<group by clause>将所有空值当作一个组。

预定义类型
数字类型

数字类型分为两种:精确数字类型,包括整数类型和指定了精度及小数位数的数字类型;近似数字类型,也就是浮点数,它的精度是可选的。

每个数字都拥有精度(数字位数),精确数字类型还拥有刻度(小数位数)。算术运算可能使用不同的数字类型或者相同的数字类型,运算结果的类型取决于操作数的类型。如果运算结果的类型不能精确地表示结果值,各种SQL实现可以自己决定进行舍入还是截断。如果结果值超出了运算结果类型的数值范围,或者在操作数上没有定义该种算术运算,将会抛出异常。
字符串类型

一个字符串类型的值是特定字符集中的字符串(序列)。字符串S中的字符也来自相同的字符集CS。如果S是某个表达式E的值,CS就是为E的声明类型所指定的字符集。字符串类型可以是固定长度,也可以是可变长度,最大长度取决于具体SQL实现。一个字符大对象类型的值是某个字符集中的一个字符串,并且总是与某一个确定的字符串相关。大对象字符串长度可变,最大长度取决于具体SQL实现,通常可以比其他字符串长度更大。

一个字符串可以基于某种具体的字符集指定,方式就是在数据类型中指定CHARACTER SET。具体SQL实现可以指定一个特殊的字符集作为国家字符集,在指定数据类型是可以使用NATIONAL CHARACTER、NATIONAL CHARACTER VARYING或者NATIONAL CHARACTER LARGE OBJECT(或者其他等价的语法形式)指定基于国家字符集的字符串类型。
二进制串类型

一个二进制串类型的值是一个字节串(序列)。二进制串类型可以是固定长度,也可以是可变长度,最大长度取决于具体SQL实现。一个二进制大对象类型的值是一个字节串。二进制大对象串长度可变,最大长度取决于具体SQL实现,通常可以比其他二进制串长度更大。
布尔类型

一个布尔数据类型的值可以是true或者false。unknown的实际值有时候可以使用空值表示。
日期时间类型

日期时间类型存在3种形式,可以用于指定包含日期时间各个部分的值。

一个TIMESTAMP数据类型的值包含日期时间中的YEAR(从0001到9999)、MONTH、DAY、HOUR、MINUTE和SECOND值。

一个TIME数据类型的值包含日期时间中的HOUR、MINUTE和SECOND值。

一个DATE数据类型的值包含日期时间中的YEAR(从0001到9999)、MONTH、DAY值。

一个DATE值是一个有效的公历日期。一个TIME值是一个有效的时间。

TIMESTAMP和TIME可以指定小数秒的精度位数。

TIMESTAMP和TIME还可以指定WITH TIME ZONE,这样的值都包含一个时区偏移量。在比较WITH TIME ZONE数据类型的值时,时区偏移量不会考虑在内。
时间间隔类型

一个时间间隔类型的值表示一段时间。时间间隔存在两种类型。第一种类型,称为year-month时间间隔,包含了YEAR和/或MONTH的间隔精度值。另一种类型,称为day-time时间间隔,包含了除YEAR和MONTH部分之外的任何连续的日期时间间隔精度值。
XML类型

XML类型的值称为XML值。
原子构造类型
引用类型

引用类型是一个构造数据类型,它的值引用(指向)了某个被引用类型值的存储地址。唯一可能被引用的对象是类型表(typed tables,使用自定义的结构化类型定义的表)中的行。所以每个被引用的类型都是一个结构化类型。
复合构造类型
集合类型

一个集合由零个或多个指定数据类型(称为元素类型)的元素组成。

数组是一个有序集合,数组中的元素可以存在重复值,通过它们在数组中的位置进行引用。

数组类型通过数组类型构造函数创建。

多重集合(multiset)是一个允许包含重复值的无序集合。

多重集合类型通过多重集合类型构造函数创建。
字段

字段是一个(字段名, 数据类型)对。字段的值是它的数据类型的值。
行类型

一个行类型是由一个或多个字段组成的序列。一个行类型的值是由这些字段值组成的序列。