数据库基础01——ANSI SQL数据类型
首先总结下ANSI SQL支持的基本数据类型
主要有三:
- 字符串类型
- 数值类型
- 日期和时间类型
- 其他
1、字符串类型
1.1定长字符串
类型 | 描述 |
---|---|
CHARACTER(n) | n定义了字段能够保存的最多字符串数量。使用定长字符串,通常会用空格来填充数量不足的字。所以,不要使用定长数据类型来保存长度不定的数据,会导致空间浪费。 |
1.2 变长字符串
类型 | 描述 |
---|---|
CHARACTER VARYING(n) | ANSI 标准的sql,一般用以下几个 |
VARCHAR(n) | Sql server 和MySql ; 字符/字符串。可变长度。最大长度 n。 |
VARINARY(n) | Oracle; 字符/字符串。 可变长度。最大长度 n。 |
VARCHAR2(n) | Oracle; 字符/字符串。可变长度。最大长度 n。 |
1.3 定长、变长串,用于存二进制数据
类型 | 描述 |
---|---|
BINARY(n) | 固定长度为 n 字节,其中 n 值从 1 到 8,000 ,存储空间为 n 字节 |
VARBINARY( n|max) | 可变长度,n 的取值范围为 1 至 8,000, max 是指最大存储空间是 2^31-1 个字节,即最大4GB; |
注意都是字节 | n:在表列定义或变量声明语句中没有指定 n,则默认长度为 1; 在CAST 函数中没有指定 n,则默认长度为 30; |
这两种表示存储的的都是字节,这种数据类型通常用来保存数字式数据,例如图像文件。
1.3 大对象数据
常见的有:BLOB 和 TEXT
类型 | 描述 |
---|---|
BLOB | BLOB是二进制大对象,它的数据是很长的二进制字符串(字节串),BLOB适合在数据库里存储二进制媒体文件,比如图像和mp3 |
TEXT | TEXT数据类型是一种字符串类型,通常用于在数据库里保存大字符集,可以理解为是一种很大的VARCHAR, 比如博客站点的HTML输入 |
2、数值类型
SQL数值的标准有:
BIT(n)
BIT VARYING(n)
DECIMAL(p,s)
INTEGER
SMALLINT
BIGINT
FLOAT(p,s)
DOUBLE PRECISION(p,s)
REAL(s)
一般常用 DECIMAL(p,s) p表示字段的最大长度,s表示小数点后面的位数
2.1 小数类型
类型 | 描述 |
---|---|
DECIMAL(p,s) | p表示有效位数(总体长度),s表示标度。 小数点不算做一个字符 |
超过定义的位数会被四舍五入,比如 DECIMAL(4,2)表示的字符, 12.449 就会被四舍五入为12.45 |
2.2 整数类型
类型 | 描述 |
---|---|
INTEGER§ | 整数值,精度为p |
SMALLINT | 整数值,精度为5 |
BIGINT | 整数值,精度为19 |
INTEGER | 整数值,精度为10 |
2.3 浮点数
浮点数是有效位数和标度都可变并且没有限制的小数数值 。
类型 | 描述 |
---|---|
REAL | 单精度浮点数值 |
DOUBLE PRECISION | 双精度浮点数值 |
FLOAT | 近似数值,尾数精度 16。 |
FLOAT(n) | 近似数值,尾数精度为n |
3、日期和时间类型
标准SQL 支持 DATETIME数据类型,包括
DATE 、 TIME 、DATETIME、 TIMESTAMP
DATETIME 元素包括:
YEAR、 MONTH、 DAY 、HOUR 、MINUTE 、SEOND
类型 | 描述 |
---|---|
DATE | 存储年、月、日的值。 |
TIME | 存储小时、分、秒的值。 |
DATETIME | 存储年、月、日、小时、分、秒的值。 |
TIMESTAMP | 存储年、月、日、小时、分、秒的值。 |
4、其他类型概念
4.1、直义字符串
直义字符串就是一系列字符, 比如姓名或电话号码, 这是由用户或程序明确指定的。 直义字符串包含
的数据与前面介绍的数据类型具有一样的属性, 但字符串的值是已知的。 列本身的值通常是不能确定的,
因为每一列通常包含了字段在全部记录里的不同值。比如我们查询的时候 ,where name=‘zhangsan’ 这个‘zhangsan’就是一个直义字符串,知道有这么回事就行
4.2、Null 数据类型
NULL值表示没有值。 NULL值在SQL里有广泛的应用, 包括表的创建、 查询的搜索
条件, 甚至是在直义字符串里。
4.3、布尔值
布尔值的取值范围是TRUE、 FALSE和NULL, 用于进行数据比较。 举例来说, 在查询中设置条件时,
每个条件都会被求值, 得到TRUE、 FALSE或NULL。 如果查询中所有条件的值都是TRUE, 数据就会被返
回; 如果某个条件的值是FALSE或NULL, 数据就不会返回。
注意;
大多数数据库实现并没有一个严格意义上的BOOLEAN类型, 而是代之以各自不同的实现方法。
MySQL拥有BOOLEAN类型, 但实质上与其现有的TINYINT类型相同。 Oracle倾向于让用户使用一个
CHAR(1)值来代替布尔值, 而SQL Server则使用BIT来代替。
4.4、自定义类型
语句CREATE TYPE用于创建自定义类型。
举例来说, 在MySQL和Oracle中, 可以像下面这样创建一个类型:
CREATE TYPE PERSON OBJECT
(NAME VARCHAR(30),
SSH VARCHAR(9));
然后就可以像这样引用自定义类型:
CREATE TABLE EMP_PAY
(EMPLOYEE PERSON,
SALARY DECIMAL(10,2),
hIRE_DATE DATE);
4.5 域
域是能够被使用的有效数据类型的集合。 域与数据相关联, 从而只接受特定的数据。 在域创建之后,
我们可以向域添加约束。 约束与数据类型共同发挥作用, 从而进一步限制字段能够接受的数据。 域的使用
类似于自定义类型。
像这样可以创建域:
CREATE DOMAIN MONEY_D NUMBER(8,2)
像下面这样为域添加约束
ALTER DOMAIN MONEY_D
ADD CONSTRAINT MONEY_CON1
CHECK (VALUE >5)
然后像下面这样引用域
CREATE TABLE EMP_PAY
(EMP_ID NUMBER(9),
EMP_NAME VARCHAR2(30),
PAY_RATE MONEY_D)