数据库数据类型对比
1.数字类型
整数/固定精度
oracle
NUMBER(38,127)/DECIMAL
p有效数字的位数;s小数位数,可以大于p左边填充0,当s取负数时,将小数点左边的s位置为0,并四舍五入
s范围是-84到127
精确到小数点右边s位,并四舍五入。然后检验有效位是否<=p
达梦、sql server、mysql
达梦 | sql server | mysql |
---|---|---|
BIGINT -2^63 - 2^63-1 | bigint 8字节 -2^63 - 2^63-1 | bigint 8字节 区分带符号和不带符号 |
INTEGER/INT -2^31 - 2^31-1 | int/integer 4字节 -2^31 - 2^31-1 | int 4字节 mediumint 3字节 |
SMALLINT -2^15 到 2^15-1 | smallint 2字节 -2^15 到 2^15-1 | smallint 2字节 |
TINYINT/BYTE -128 到 127 | tinyint 1字节 0-255 | tinyint 1字节 = bool类型 |
NUMERIC/DECIMAL/DEC/NUMBER(p,s) p精度 1-38 s标度 不超过精度 不可以作为自增 | decimal/numeric(p,s) 固定精度和小数位数 p精度 1-38 s小数位 不超过精度 | decimal(m,d) m<=65 ,d<=30且 d<m 是小数位 decimal/numeric,没有number 不可作为自增 |
近似数值类型/浮点数
不常用,容易出现精度丢失的问题
oracle | 达梦 | sql server | mysql |
---|---|---|---|
FLOAT、BINARY_FLOAT、BINARY_DOUBLE | FLOAT、DOUBLE、REAL | float、real | float、double |
2. 位串数据类型
Oracle: 无
达梦:bit 只能存储0 1 空值,与 SQL SERVER2000 的 BIT 数据类型相似
Mysql: bit存储0和1
3. 字符类型
注意字符和字节的区分
固定长度
Oracle: char 最大2000字节
达梦:CHAR/CHARACTER(n) 相同 不超过32767字节
Sql server: CHAR(n) n的范围是1到8000
Mysql: char固定长度字符串,最多255个字符
可变长度
oracle
- varchar2(size) varchar2是oracle特有的 最大4000个字节
- varchar(3 CHAR) 3个字符,能存三个汉字;varchar(3) 3个字节,不能存两个汉字
- 字符集
ZHS16GBK
一个汉字两个字节- 查询BYTE还是CHAR:
SELECT VALUE FROM nls_database_parameters WHERE PARAMETER = 'NLS_LENGTH_SEMANTICS';
- 查字符集:
SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
达梦
- VARCHAR2和VARCHAR(n) 相同,不超过32767
- 默认以字节为单位,也可以和oracle一样,使用VARCHAR2(3 CHAR)
- 字符集为:GB18030 一个汉字两个字节;字符集为:utf-8 一个汉字三个字节
Sql server
VARCHAR(n) n的范围是1到8000
Mysql
varchar(L),可变长字符串,字符为单位,跟编码有关,MySQL要求一个行的定义长度不能超过65535即64K
大文本
oracle | 达梦 | sql server | mysql |
---|---|---|---|
CLOB 最大长度4G LONG 最多2G,限制较多,推荐使用CLOB | TEXT/LONG/LONGVARCHAR/CLOB 最大为 100G-1 字节 | TEXT 2^31-1个字节 | text类型 |
4. 日期和时间
oracle
- DATE 存储日期和时间 精确到秒
- TIMESTAMP 比DATE精度更高可以精确到微妙
- TIMESTAMP WITH TIME ZONE 时区信息保存在列数据中
- TIMESTAMP WITH LOCAL TIME ZONE 将用户输入的时间转换为数据库服务器所在时区的时间
达梦
DATE 仅日期 TIME 仅时间 TIME(6)微妙级别
- TIMESTAMP / DATETIME 日期+时间 可以精确到小数秒 0-9,缺省精度 6,与 DATE 类型相同,DM 不计算’1582-10-05’到’1582-10-14’之间的 10 天。
- TIME WITH TIME ZONE 仅时间带时区
DATETIME/TIMESTAMP WITH TIME ZONE 日期+时间带时区,时区部分的实质是 INTERVAL HOUR TO MINUTE 类型,取值范围:-12:59 与 +14:00- TIMESTAMP WITH LOCAL TIME ZONE 可以将WITH TIME ZONE转化为本地时区类型
Sql server
- DATE 仅日期 0001-01-01到9999-12-31;TIME 仅时间 7位 100ns
- DATETIME类型:1753-01-01到9999-12-31
DATETIME2类型: 0001-01-01到9999-12-31 秒7位 100ns- datetimeoffset 同DATETIME2带时区
- TIMESTAMP 时间戳 数据发生变化自动更新,不可显示插值
Mysql
- date 3字节 yyyy-MM-dd
time 3字节 HH:mm:ss- datetime 8字节 yyyy-MM-dd HH:mm:ss 1000到9999 5.6支持毫秒
timestamp 4字节 yyyy-MM-dd HH:mm:ss 1970年开始- 时区业务层处理
参考
达梦数据库官网
Sql server官网
从Oracle迁移达梦:
数字类型,达梦NUMBER(p,s)标度不超过精度
字符串类型,达梦varchar和varchar2用法相同;varchar(3 char)是3个字符和varchar(3)不同;oracle插入空字符串变为NULL,跟达梦不同
日期类型,达梦DATE仅日期,带时间用timestamp或datetime