- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 清空表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - Select Into
- SQL - Insert Into Select
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - Where 子句
- SQL - Top 子句
- SQL - Distinct 子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL - Having 子句
- SQL - AND & OR
- SQL - BOOLEAN (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接与右连接
- SQL - Union 与 Join
- SQL 密钥
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 复合键
- SQL - 备用键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - Min & Max
- SQL - Null 函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - Group By 与 Order By
- SQL - IN 与 EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
SQL - 数据类型
什么是 SQL 数据类型?
SQL 数据类型是指可以存储在数据库表列中的数据类型。在列中,用户可以通过定义数据类型来存储数字、字符串、二进制等。例如整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
在数据库中创建数据库表时,我们需要指定以下两个属性来定义表列
- 列名
- 列的数据类型
数据库表的列定义数据,而数据库表的行将数据填充到表中。
例如,如果要在一个列中存储学生姓名,则应将列名命名为类似student_name,其数据类型为char(50),这意味着它可以存储最多 50 个字符的字符串。
数据类型为SQL提供了指导,使其了解每列中期望的数据类型,从而防止用户在列中输入任何意外或无效的数据。例如,如果我们希望一个列仅存储整数值,我们可以将其数据类型指定为 INT。如果在该特定列中插入任何整数值以外的值,SQL 将显示错误。
不同的 RDBMS 支持不同类型的数据类型来定义其表。本SQL 数据类型教程将列出 MySQL、Oracle、MS SQL Server 和 MS Access 数据库中可用的不同数据类型。
定义数据类型
SQL 数据类型在数据库中创建表时定义。创建表时,需要指定其相应的数据类型和大小以及列名。
以下是指定 MySQL 中数据类型的语法:
CREATE TABLE table_name(column1 datatype, column2 datatype....)
让我们看下面的示例查询以更好地理解。
CREATE TABLE Customers (Name VARCHAR (25), Age INT);
在上面的 SQL 查询中,我们正在创建一个名为 Customers 的表。由于 Name 列仅存储字符串值,因此我们将它的数据类型指定为“VARCHAR”。VARCHAR 数据类型表示 SQL 中的字符串值。类似地,我们使用整数数据类型“INT”定义 Age 列。
当我们将适当的数据类型分配给列时,我们可以通过仅为相关列中的数据分配所需的系统内存量来有效地使用内存。
SQL 数据类型的类型
任何 RDBMS 中都提供三种主要类型的 SQL 数据类型。它们列在下面:
- 字符串
- 数值
- 日期和时间
MySQL、SQL Server、Oracle 和 MS Access 数据库中的数据类型
让我们详细讨论 MySQL、SQL Server、Oracle(PL/SQL)和 MS Access 数据库中的数据类型。下面解释了所有三种主要类型(字符串、数值、日期和时间)的 SQL 数据类型:
MySQL 数据类型
MySQL 数据库中提供了三种主要数据类型:字符串、数值和日期和时间。以下部分列出了 MySQL 8.0 版本中可用的所有数据类型
MySQL - 字符串数据类型
| 数据类型 | 描述 |
|---|---|
| CHAR(size) | 固定长度的字符串,可以包含字母、数字和特殊字符。size 参数指定列的字符长度,可以从 0 到 255 不等。默认大小为 1 |
| VARCHAR(size) | 可变长度的字符串,可以包含字母、数字和特殊字符。size 参数指定字符的最大字符串长度,可以从 0 到 65535 不等。 |
| BINARY(size) | 等于 CHAR(),但存储二进制字节字符串。size 参数指定列的字节长度。默认大小为 1 |
| VARBINARY(size) | 等于 VARCHAR(),但存储二进制字节字符串。size 参数指定列的最大字节长度。 |
| TINYTEXT | 存储最大长度为 255 个字符的字符串 |
| TEXT(size) | 存储最大长度为 65,535 个字节的字符串 |
| LONGTEXT | 存储最大长度为 4,294,967,295 个字符的字符串 |
| TINYBLOB | 表示小型 BLOB(二进制大型对象)。最大长度为 255 个字节 |
| BLOB(size) | 表示 BLOB(二进制大型对象)。存储最多 65,535 个字节的数据 |
| MEDIUMTEXT | 存储最大长度为 16,777,215 个字符的字符串 |
| MEDIUMBLOB | 表示中型 BLOB(二进制大型对象)。存储最多 16,777,215 个字节的数据 |
| LONGBLOB | 表示大型 BLOB(二进制大型对象)。存储最多 4,294,967,295 个字节的数据 |
| ENUM(val1, val2, val3, ...) | 一个字符串对象,只能包含一个值,该值从可能的列表中选择。您可以在 ENUM 列表中列出最多 65535 个值。如果插入的值不在列表中,则将插入一个空值。这些值按您输入的顺序排序 |
| SET(val1, val2, val3, ...) | 一个字符串对象,可以包含 0 个或多个值,这些值从可能的列表中选择。您可以在 SET 列表中列出最多 64 个值 |
MySQL - 数值数据类型
| 数据类型 | 描述 |
|---|---|
| INT | 一个普通大小的整数,可以是有符号或无符号的。如果是有符号的,则允许的范围是从 -2147483648 到 2147483647。如果是无符号的,则允许的范围是从 0 到 4294967295。您可以指定最多 11 位的宽度。 |
| TINYINT | 一个非常小的整数,可以是有符号或无符号的。如果是有符号的,则允许的范围是从 -128 到 127。如果是无符号的,则允许的范围是从 0 到 255。您可以指定最多 4 位的宽度。 |
| SMALLINT | 一个小的整数,可以是有符号或无符号的。如果是有符号的,则允许的范围是从 -32768 到 32767。如果是无符号的,则允许的范围是从 0 到 65535。您可以指定最多 5 位的宽度。 |
| MEDIUMINT | 一个中等大小的整数,可以是有符号或无符号的。如果是有符号的,则允许的范围是从 -8388608 到 8388607。如果是无符号的,则允许的范围是从 0 到 16777215。您可以指定最多 9 位的宽度。 |
| BIGINT | 一个大的整数,可以是有符号或无符号的。如果是有符号的,则允许的范围是从 -9223372036854775808 到 9223372036854775807。如果是无符号的,则允许的范围是从 0 到 18446744073709551615。您可以指定最多 20 位的宽度。 |
| FLOAT(M,D) | 一个浮点数,不能是无符号的。您可以定义显示长度 (M) 和小数位数 (D)。这不是必需的,并将默认为 10,2,其中 2 是小数位数,10 是总位数(包括小数)。FLOAT 的小数精度可以达到 24 位。 |
| DOUBLE(M,D) | 一个双精度浮点数,不能是无符号的。您可以定义显示长度 (M) 和小数位数 (D)。这不是必需的,并将默认为 16,4,其中 4 是小数位数。DOUBLE 的小数精度可以达到 53 位。REAL 是 DOUBLE 的同义词。 |
| DECIMAL(M,D) | 一个未打包的浮点数,不能是无符号的。在未打包的小数中,每个小数对应一个字节。定义显示长度 (M) 和小数位数 (D) 是必需的。NUMERIC 是 DECIMAL 的同义词。 |
MySQL - 日期和时间数据类型
| 数据类型 | 描述 |
|---|---|
| DATE | YYYY-MM-DD 格式的日期,介于 1000-01-01 和 9999-12-31 之间。例如,1973 年 12 月 30 日将存储为 1973-12-30。 |
| DATETIME | YYYY-MM-DD HH:MM:SS 格式的日期和时间组合,介于 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间。例如,1973 年 12 月 30 日下午 3:30 将存储为 1973-12-30 15:30:00。 |
| TIMESTAMP | 一个时间戳,介于1970年1月1日午夜到2037年某个时间之间。这看起来像之前的DATETIME格式,只是数字之间没有连字符;1973年12月30日下午3:30将存储为19731230153000(YYYYMMDDHHMMSS)。 |
| TIME | 以HH:MM:SS格式存储时间。 |
| YEAR(M) | 以2位或4位格式存储年份。如果长度指定为2(例如YEAR(2)),则YEAR可以是1970到2069(70到69)。如果长度指定为4,则YEAR可以是1901到2155。默认长度为4。 |
MS SQL Server 数据类型
正如我们在本章前面讨论过的,MS SQL Server中有三种主要的数据类型。它们是:字符串、数值和日期和时间。
MS SQL Server - 字符串数据类型
SQL中的字符串数据类型允许我们将一组字符(用单引号括起来)存储在表列的记录中。这些字符可以是任何类型:数字、字母、符号等。
用户可以根据自己的喜好存储固定数量的字符或可变数量的字符。
以下是SQL中字符串数据类型下包含的数据类型列表。
| 数据类型 | 描述 |
|---|---|
| char(n) | 它保存具有固定宽度的字符串。此数据类型的最大大小为8000个字符。 |
| varchar(n) | 它保存具有可变宽度的字符串。此数据类型的最大大小也为8000个字符。 |
| varchar(max) | 它保存具有可变宽度的字符串。此数据类型的最大大小为1073741824个字符。 |
| text | 它保存具有可变宽度的字符串。此数据类型最多可以存储2GB的文本数据。 |
| nchar | 它保存具有固定宽度的Unicode字符串。此数据类型的最大大小也为4000个字符。 |
| nvarchar | 它保存具有可变宽度的Unicode字符串。此数据类型的最大大小也为4000个字符。 |
| ntext | 它保存具有可变宽度的Unicode字符串。此数据类型最多可以存储2GB的文本数据。 |
| binary(n) | 它保存具有固定宽度的二进制字符串。 |
| varbinary | 它保存具有可变宽度的二进制字符串。此数据类型的最大大小也为8000字节。 |
| varbinary(max) | 它保存最大长度的可变宽度二进制字符串。此数据类型的最大大小为2 GB。 |
| image | 它保存可以存储二进制数据的数据类型的可变长度。此数据类型的最大大小为2 GB。 |
| Nvarchar(max) | 它保存最大长度的可变宽度Unicode字符串。此数据类型的最大大小为536870912个字符。 |
示例
在下面的示例中,我们正在创建一个名为“students”的表,其中仅包含字符串数据类型值:varchar和char。
CREATE TABLE students ( name varchar(20) NOT NULL, gender char(6) NOT NULL, city text NOT NULL );
输出
执行查询后,将显示输出为 -
(0 rows affected)
验证
在执行SQL查询“EXEC sp_help 'dbo.students';”时,我们获得了表和每个列的数据类型的详细信息。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| name | varchar | no | 20 | no | ||
| gender | char | no | 6 | no | ||
| city | text | no | 16 | no |
MS SQL Server - 数值数据类型
数值数据类型是SQL中使用最广泛的数据类型之一。它们仅用于存储数值。
以下是SQL中数值数据类型下包含的数据类型列表。
| 数据类型 | 描述 |
|---|---|
| bit | 它保存可以为0、1或NULL的整数。 |
| tinyint | 它允许保存0到255之间的整数。 |
| smallint | 它允许保存-32,768到32,767之间的数字。 |
| int | 它允许保存-2,147,483,648到2,147,483,647之间的整数。 |
| bigint | 它允许保存-9,223,372,036,854,775,808到9,223,372,036,854,775,807之间的整数 |
| decimal(p, s) | 它是固定精度和小数位数的数字。允许数字从-10^38 + 1到10^38-1。 参数p指示可以在小数点两侧(左侧和右侧)存储的最大总位数。它必须是1到38之间的值。默认值为18。 参数s指示小数点右侧的最大位数。S必须是0到p之间的值。默认情况下,该值设置为0。 |
| numeric(p, s) | 它是固定精度和小数位数的数字。允许数字从-10^38 + 1到10^38-1。 参数p指示可以在小数点两侧(左侧和右侧)存储的最大总位数。它必须是1到38之间的值。默认值为18。 参数s指示小数点右侧的最大位数。S必须是0到p之间的值。默认情况下,该值设置为0。 |
| smallmoney | 它保存-214,748.3648到214,748.3647之间的货币数据。 |
| Money | 它保存-922,337,203,685,477.5808到922,337,203,685,477.5807之间的货币数据。 |
Float(n) | 它保存或存储-1.79E + 308到1.79E + 308之间的浮点精度数字数据。 参数n指示字段应保存4字节还是8字节。Float(24)包含4字节字段,而Float(53)包含8字节字段。n的默认值为53。 |
| real | 它保存-3.40E + 38到3.40E + 38之间的浮点精度数字数据。 |
示例
在下面的示例中,我们正在创建一个名为employees的表,其中仅包含数值数据类型值。
CREATE TABLE employees ( ID int NOT NULL, myBoolean bit NOT NULL, Fee money, celsius float NOT NULL );
输出
执行查询后,将显示输出为 -
(0 rows affected)
验证
在执行SQL查询“EXEC sp_help 'dbo.employees;”时,我们获得了表和每个列的数据类型的详细信息。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| ID | int | no | 4 | 10 | 0 | no |
| myBoolean | bit | no | 1 | no | ||
| Fee | money | no | 18 | 19 | 4 | yes |
| Celsius | float | no | 8 | 53 | NULL | no |
MS SQL Server - 日期和时间数据类型
datetime数据类型在SQL中用于包含日期和时间的值。datetime和time值的格式分别定义为:yyyy-mm-dd、hh:mm:ss.nnnnnnn(n取决于列定义)。
以下是SQL中日期和时间数据类型下包含的数据类型列表。
| 数据类型 | 描述 |
|---|---|
| datetime | 它存储1753年1月1日至9999年12月31日之间的日期和时间,精度为3.33毫秒。 |
| datetime2 | 它存储0001年1月1日至9999年12月31日之间的日期和时间,精度为100纳秒。 |
| smalldatetime | 它存储1900年1月1日至2079年6月6日之间的日期和时间,精度为1分钟。 |
| date | 它仅存储0001年1月1日至9999年12月31日之间的日期。 |
| time | 它仅存储时间,精度为100纳秒。 |
| datetimeoffset | 它与datetime2相同,并增加了时区偏移量。 |
| timestamp | 它存储每次创建或修改行时都会更新的唯一编号。它与实际时间不对应,并且基于内部时间。每个表只能有一个timestamp变量。 |
注意 - 这里,datetime的精度为3.33毫秒,而smalldatetime的精度为1分钟。
示例
在下面的示例中,我们正在创建一个名为Cust_details的表,其中仅包含日期和时间数据类型值。
CREATE TABLE Cust_details ( HolidayDate DATE NOT NULL, OrderDateTime DATETIME, ScheduleFrom TIME NOT NULL, ShippingDateTime DATETIME2 );
输出
执行查询后,将显示输出为 -
(0 rows affected)
验证
在执行SQL查询“EXEC sp_help 'dbo.Cust_details;”时,我们获得了表和每个列的数据类型的详细信息。
| Column_name | Type | Computed | Length | Prec | Scale | Nullable |
|---|---|---|---|---|---|---|
| HolidayDate | date | no | 3 | 10 | 0 | no |
| OrderDateTime | datetime | no | 8 | yes | ||
| ScheduleFrom | time | no | 5 | 16 | 7 | no |
| ShippingDateTime | datetime2 | no | 8 | 27 | 7 | yes |
注意
- 如果您使用MySQL Workbench运行SQL数据类型及其查询,则某些SQL数据类型和日期和时间的格式将无法使用;例如“money”、“datetime2”、“yyyy/mm/dd”和“time AM”。所有这些指定的数据类型仅与SQL Server兼容。
- 这些数据类型的大小可能会在将来的更新中发生变化,请继续检查SQL文档。
Oracle 数据类型
在Oracle数据库中有四种主要类型的数据类型可用:字符串、数值、日期和时间以及大型对象数据类型。以下部分列出了Oracle数据库中所有可用的数据类型。
Oracle - 字符串数据类型
| 数据类型 | 描述 |
|---|---|
| CHAR(size) | 它用于在预定义的长度内存储字符数据。它最多可以存储2000个字节。 |
| NCHAR(size) | 它用于在预定义的长度内存储国家字符数据。它最多可以存储2000个字节。 |
| VARCHAR2(size) | 它用于在预定义的长度内存储可变字符串数据。它最多可以存储4000个字节。 |
| VARCHAR(SIZE) | 它与VARCHAR2(size)相同。您也可以使用VARCHAR(size),但建议使用VARCHAR2(size) |
| NVARCHAR2(size) | 它用于在预定义的长度内存储Unicode字符串数据。我们必须指定NVARCHAR2数据类型的大小。它最多可以存储4000个字节。 |
Oracle - 数值数据类型
| 数据类型 | 描述 |
|---|---|
| NUMBER(p, s) | 它包含精度p和小数位数s。精度p的范围可以是1到38,小数位数s的范围可以是-84到127。 |
| FLOAT(p) | 它是NUMBER数据类型的一个子类型。精度p的范围可以是1到126。 |
| BINARY_FLOAT | 它用于二进制精度(32位)。它需要5个字节,包括长度字节。 |
| BINARY_DOUBLE | 它用于双精度二进制(64位)。它需要9个字节,包括长度字节。 |
Oracle - 日期和时间数据类型
| 数据类型 | 描述 |
|---|---|
| DATE | 它用于存储具有固定长度的有效日期时间格式。它的范围从公元前4712年1月1日至公元9999年12月31日不等。 |
| TIMESTAMP | 它用于以YYYY-MM-DD格式存储有效日期,时间格式为hh:mm:ss。 |
Oracle - 大型对象数据类型(LOB类型)
| 数据类型 | 描述 |
|---|---|
| BLOB | 它用于指定非结构化二进制数据。它的范围高达232-1字节或4 GB。 |
| BFILE | 它用于在外部文件中存储二进制数据。它的范围高达232-1字节或4 GB。 |
| CLOB | 它用于单字节字符数据。它的范围高达232-1字节或4 GB。 |
| NCLOB | 它用于指定单字节或固定长度多字节国家字符集(NCHAR)数据。它的范围高达232-1字节或4 GB。 |
| RAW(size) | 它用于指定可变长度原始二进制数据。它的范围每行最多2000个字节。必须指定其最大大小。 |
| LONG RAW | 它用于指定可变长度原始二进制数据。它的范围每行最多231-1字节或2 GB。 |
MS Access 数据类型
MS Access 数据库还提供四类数据类型:字符串、数值、日期和时间以及其他专用数据类型。
以下是 MS Access 2013 版本及更高版本提供的所有数据类型。
MS Access - 字符串数据类型
| 数据类型 | 描述 |
|---|---|
| 短文本(以前称为“文本”) | 它是一种字符串数据类型,用于存储字母数字数据,例如姓名、标题等。它最多可以存储 255 个字符。 |
| 长文本(以前称为“备注”) | 它也是一种字符串数据类型,用于存储大型字母数字数据,例如段落等。它最多可以存储 1GB 或 64,000 个字符。 |
MS Access - 数值数据类型
| 数据类型 | 描述 |
|---|---|
| 数字 | 它仅存储数值数据。大小范围从 1 到 16 个字节。 |
| 大数字 | 它也存储数值数据。此数据类型的最大大小为 8 个字节。 |
MS Access - 日期和时间数据类型
| 数据类型 | 描述 |
|---|---|
| 日期/时间 | 它存储日期和时间数据。此数据类型的最大大小为 8 个字节。 |
| 扩展日期/时间 | 它也存储日期和时间数据。此数据类型的最大大小为 42 字节的编码字符串。 |
MS Access - 专用数据类型
| 数据类型 | 描述 |
|---|---|
| 货币 | 此数据类型存储货币数据,最多可精确到小数点后 4 位。此数据类型的大小为 8 个字节。 |
| 自动编号 | 此数据类型存储由 MS Access 为每个新记录生成的唯一值。此数据类型的大小为 4 个字节。 |
| 是/否 | 它以 0 和 1 的形式存储布尔数据。'0' 表示假,'-1' 表示真。最大大小为 1 个字节。 |
| OLE 对象 | 它存储来自另一个基于 Windows 的应用程序的图片、图形或其他 ActiveX 对象。大小可以存储高达 2GB。 |
| 超链接 | 它存储指向 Internet、Intranet、局域网 (LAN) 或本地计算机上文档或文件的链接地址。大小可以高达 8,192 个字符。 |
| 附件 | MS Access 中的附件数据类型允许用户附加图片、文档、电子表格或图表等。每个记录可以有无限数量的附件;但仅限于数据库文件大小的存储限制。 |
| 计算 | 使用此数据类型,您可以创建一个使用一个或多个字段中的数据的表达式。然后,还可以从此表达式创建结果数据类型。但是,此数据类型在 MDB 文件格式中不可用。此数据类型的大小可能因结果类型而异。 |
| 查找向导 | 查找向导在技术上不是数据类型。但是,当选择此条目时,向导将启动以帮助用户定义查找字段。此数据类型的大小取决于查找字段的大小。 |