零基础学SQL
上QQ阅读APP看书,第一时间看更新

2.4 常用数据类型

在创建数据表时,除了需要创建数据表的表名、列名之外,还需要为数据表中的每一列选择合适的数据类型。在数据库中,常用的数据类型包括整数类型、浮点类型、数值类型、日期与时间类型、字符类型、二进制类型等。不同的数据库中,数据类型的定义也不完全相同。这一节就以Oracle数据库、MySQL数据库和Microsoft SQL Server数据库为例,介绍在这3种数据库中,常用的数据类型定义及其使用方法。

2.4.1 整数类型与浮点类型

整数类型的数据可以是正整数,也可以是负整数。在MySQL数据库中主要整数类型及其取值范围如表2.1所示。

表2.1 MySQL中主要整数类型及其取值范围

在MySQL数据库中,这些整数类型还可以带一个参数用来表示数据最大的显示宽度。例如INT(4)表示显示数据列的列宽度为4。使用参数并不影响整数类型的取值范围。这个参数是可选的。

在MySQL数据库中,浮点类型主要包括FLOAT和DOUBLE。其中,FLOAT表示单精度浮点数, DOUBLE表示双精度浮点数。浮点数类型及其取值范围如表2.2所示。

表2.2 MySQL中浮点数类型及其取值范围

在MySQL数据库中,这些浮点数类型还可以包括两个参数。其中,参数m表示存储数据的有效数字的位数;参数n表示小数点后的位数。例如FLOAT(5,2),第一个参数5表示显示的数字总位数为5,第二个参数表示小数点后的数字个数。如果把数据122.456插入到定义为FLOAT(5,2)的数据列中,则实际放入到该列的数据为122.46。

可以看到,MySQL数据库中数字在使用参数进行插入时会对插入的数据进行四舍五入的操作。浮点数类型中这两个参数也是可选的。

在Microsoft SQL Server数据库中,也可以使用TINYINT、SMALLINT、INT和BIGINT存储整型数据,其取值范围与表2.1中TINYINT、SMALLINT、INT和BIGINT类型的取值范围相同。

浮点类型数据可以定义为REAL类型和FLOAT类型。其中,REAL类型占用4个字节的存储空间,可以精确到小数点后7位,其取值范围为-2.4E38~2.4E38;FLOAT类型占用8个字节的存储空间,可以精确到小数点后15位,其取值范围为-2.7E308~2.7E308。

2.4.2 数值类型

在Oracle数据库中。可以使用NUMBER(m,n)来定义数字类型的数据。其中,参数m表示存储数据的有效数字的位数;参数n表示小数点后的位数。例如NUMBER(5,2),第一个参数5表示显示的数字总位数为5,第二个参数表示小数点后的数字个数。如果把数据122.456插入到定义为NUMBER(5,2)的数据列中,则实际放入到该列的数据为122.46。

2.4.3 字符类型

在数据库中,字符类型是用来存储字符串值的。不同的数据库,字符类型的定义也不完全相同,下面以Oracle数据库、MySQL数据库以及Microsoft SQL Server数据库为例,介绍在这3种数据库中字符类型不同的定义方法。

1. Oracle数据库

Oracle数据库中可以使用CHAR或者是VARCHAR2两种形式定义字符数据。其中,CHAR用来定义定长字符串,VARCHAR2用来定义可变长字符串。字符类型及其意义如表2.3所示。

表2.3 Oracle数据库中字符类型及其意义

❑ 如果不指定n的长度,默认值为1个字节的长度。

❑ 如果在定义为字符类型的列中存储汉字,则一个汉字占两个字节。

❑ 对于VARCHAR2类型,如果实际存储的字符长度比参数n所设定的长度小,则Oracle数据库会将其长度自动调节到与该字符的实际长度相同。如果存储的字符串前后存在空格,则Oracle数据库会自动将空格删除。

❑ 如果要存储大量的字符信息,建议使用CLOB类型。

例如,CHAR(200)表示定义的数据列中最多可以存放字符串的大小为200个字节。VARCHAR2 (200 CHAR)表示定义的数据列中最多可以存放200个字符。

注意 使用CHAR定义的列存储的字符串所占空间是不可变的,使用VARCHAR2定义的列存储的字符串所占空间是可变的。

2. MySQL数据库

MySQL数据库中可以使用CHAR、VARCHAR、TEXT等形式定义字符数据。其中,CHAR用来定义定长字符数据,VARCHAR和TEXT用来定义可变长字符数据。字符类型及其意义如表2.4所示。

表2.4 MySQL数据库中字符类型及其意义

❑CHAR(n)和VARCHAR(n)在定义字符类型时需要指定长度,而TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT在定义字符类型时不需要为其指定长度。

❑如果在定义为字符类型的列中存储汉字,则一个汉字占两个字节。

3. Microsoft SQL Server数据库

Microsoft SQL Server数据库中,可以使用CHAR、VARCHAR、TEXT等形式定义字符数据。其中, CHAR用来定义定长字符数据,VARCHAR和TEXT用来定义可变长字符数据。如果字符数据超过了8KB,可以使用TEXT数据类型进行存储。

2.4.4 日期与时间类型

在数据库中,日期与时间类型是用来存储日期和时间值的。不同的数据库,日期与时间类型的定义也不完全相同,下面以Oracle数据库、MySQL数据库以及Microsoft SQL Server数据库为例,介绍在这3种数据库中日期与时间类型不同的定义方法。

1. Oracle数据库

在Oracle数据库中可以使用DATE、TIMESTAMP等形式定义日期时间类型的数据。其中DATE类型的数据在英文版本中日期默认的格式为DD-MON-YY的形式。例如10-SEP-09;在中文版本中的默认格式为日-月-年,如10-9月-09;TIMESTAMP类型在英文版中的默认的格式为YYYY-MM-DD HH.MM.SS.AM如10-SEP-09 12.22.000000PM。在中文版本中的默认日期格式为‘日-月-年时、分、秒’,例如, 09-8月1018.12.22.000000下午。它除了包含时、分、秒之外,还包含了秒的小数部分。秒值精确到小数点后6位。

2. MySQL数据库

在MySQL数据库中,可以使用DATE、TIME、DATETIME等形式定义日期时间类型。其中, DATE类型的数据默认格式为YYYY-MM-DD,例如,2009-08-10;TIME类型的数据默认格式为HH:MM:SS,例如,18:13:23;DATETIME类型的数据默认格式为YYYY-MM-DD HH:MM:SS,例如, 2009-08-10 18:13:23。

3. Microsoft SQL Server数据库

在Microsoft SQL Server数据库中,可以使用DATETIME、SMALLDATETIME两种形式定义日期时间类型。其中,DATETIME类型需要8个字节的存储空间,其日期的取值范围从1753年1月1日到9999年12月31日,时间部分可以精确到2.33毫秒;SMALLDATETIME类型需要4个字节的存储空间,其日期的取值范围从1900年1月1日到2079年6月6日,时间部分可以精确到分钟。SMALLDATETIME类型的精确度没有DATETIME类型的精确度高。

在SQL Server 2008中,增加了四种DATETIME类型的数据,分别为DATE、TIME、DATETIMEOFFSET和DATETIME2。其中DATE类型只用来存储日期,其取值范围为0001-01-01~9999-12-31;TIME类型只用来存储时间,其取值范围为00:00:00.0000000~23:59:59.9999999;DATETIMEOFFSET类型保证了存储的日期和时间的时区一致性;DATETIME2是对DATETIME的扩展,其取值范围要比DATETIME的取值范围大,并可以通过参数设定小数的位数,最多可以精确到小数点后7位。

2.4.5 二进制类型

在数据库中,二进制类型是用来存储二进制数据的。不同的数据库,二进制类型的定义也不完全相同,在Oracle数据库中可以使用BLOB存储二进制数据信息,最多可以存储4GB。

在MySQL数据库中除了可以使用BLOB存储二进制的数据以外,还可以使用TINYBLOB、MEDIUMBLOB、LONGBLOB等存储二进制类型的数据。在Microsoft SQL Server数据库中,可以使用BINARY、VARBINARY和IMAGE存储二进制数据信息。其中,在IMAGE数据类型中存储的数据是以位字符串存储的,它不是通过Microsoft SQL Server解释的,而是需要通过应用程序来解释。