| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Oracle 与 Mysql 数据类型差异 -> 正文阅读 |
|
[大数据]Oracle 与 Mysql 数据类型差异 |
目录 最近在做 Oracle 数据库 往 Maria 数据库的迁移工作,在此记录一下 Oracle 与 Maria 数据结构的差异。 1.?整数类型(精确值)1.1. MySQLMySQL 支持 SQL 标准整数类型?
1.1.1. 签名和无符号上图有一个令人疑惑的地方,为什么有?签名的最小值?和 签名的最大值?这一对之外,还有 最小值无符号 和?最大值无符号 这一对呢? 我们以 我们看上图中发现,这个范围正好是 签名 的取值范围。其实这个签名翻译不算准确,准确的说法应该是 有符号的 。这样就匹配了。因为官方的说法就是: ?那这究竟是什么意思呢? Signed 分正负数,Unsigned 只有正数。 如果是?Unsigned 的,那么存储需要1个字节,那就是8位,等于是最小值是0,最大值是 255。换成二进制是8个0和8个1。
8个0是0,8个1是255。 但是如果计算机想表示负数呢? 那么8位数字的最高位就会变成符号位,0代表正数,1代表负数,那么它的范围就变成:
?十进制: -128 至 127 不过我们在数据库中存储的数据,肯定存在负数的情况,我们的村粗都是是 Signed 的,也就是有-128 至 127的。 所以我们只需要看?签名的最小值?和 签名的最大值 即可。 1.2. OracleOracle 没有对应的证书类型,它只有数值类型:
number数据类型可以存储正数,负数,0,定点数和精度为38为的浮点数,该数据类型格式为
其中,p表示精度,表示有效的位数,在1~38之间。有效数:从左边第一个不为0的数算起,小数点和负号不计入有效数。 s为范围,表示小数点右边数字的位数,它在- 84 ~ +127之间。 规则:
?解读:
如果我们我们定义一个数值:
因为小数点后要三位,而精度也是三位,那么这个数字就只能是0和小于1的数字,不然会报错。 负数范围也是如此,必须是大于-1小于等于0的数字。 如果我们我们定义一个数值:
因为小数点后要4位,而精度是三位,那么这个数据类型虽然可以创建,但是不能插入任何数据,除了0。0插入之后也会变为,0.0000。但是,貌似好像没有人这么做吧,也许极少数场景会需要把! 综述:
结论 Oracle 的 number 数据类型不仅支持整型,还支持浮点数,也就是带小数点的数字。 只能存储是数字。 如果我整数,则小数位数是0,也可以不写,只写精度p。 2.?定点类型(精确值)——DECIMAL、NUMERIC
在本例中, 标准 SQL 要求
3.?浮点类型(近似值)——FLOAT、DOUBLE和类型表示 具体情况参考官网:浮点类型(近似值) Oracle 没有浮点数这个概念。 4.?日期和时间数据类型用于表示时间值的日期和时间数据类型是?DATE、?TIME、?DATETIME、?TIMESTAMP和?YEAR。每种时间类型都有一个有效值范围,以及一个“零”值,当您指定 MySQL 无法表示的无效值时,可以使用该值。TIMESTAMP和 类型具有特殊的DATETIME自动更新行为,在?第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”中进行了描述。 4.1. dateOracle 的 date 类型 可以存储时间,例如时间:2022-05-04 11:45:37 MySQL 不可以,只能显示日期,不显示时间,即2022-05-04 即使我们给它设置时间,它也会自动截取的:
结果如下: ?我们可以看到,时间没有显示。 4.2. datetimeMySQL有 datetime,Oracle没有这个数据类型。 mysql的 datetime 对应 Oracle的 date。
4.3.?timestamp两个数据库都有?timestamp 数据类型,两者有一些区别。 mysql 的 timestamp:
因为他们使用了time这一32位数字来表示时间,这就是著名的2038年问题。 所以,目前 mysql 和 Maria 数据库,日期时间格式建议尽量不要使用 timestamp。 Oracle 的 timestamp 就是正常的日期时间,可以带毫秒数,不会自动赋值。比如我们建表时,希望更新时间这个字段随着每次数据的新增和修改都会自动添加和修改这个字段,那我们的 Oracle 这个字段不会自动实现,需要我们自己去实现。 但是 mysql 会自动添加时间。 5. 字符类型mysql的分为 varchar 和 char,Oracle 不但有 varchar 和 char,还有 varchar2,nvarchar, nvarchar2。 mysql 定义该数据类型为:
Oracle 也一样。至于varchar2,nvarchar, nvarchar2 的定义方式也一样,具体差异可以自行百度,这里只告诉大家一点,如果你做Oracle迁移到 mysql 或者Maria,那么Oracle的几种字符类型,你都可以使用 varchar来转换。 其实 mysql 也有nvarchar类型,但是是一个保留字,你这么定义不会错,但是系统会自动给你转化为 varchar。 6. clob 大字段Oracle 的大字段类型是 clob,它存储的其实就是字符串,源文字是什么,它就存储什么。 对应的 mysql 的数据类型 可以使用?LONGTEXT 来存储,当然使用varchar也可以,但是小心varchar的存储范围不足,所以建议使用?LONGTEXT 。 在 mysql 中还有一个大字段类型,blob,它的存储是二进制字节码,和clob还是不一样的。如果你在里面输入,你好,那么显示的就会是乱码,但是如果你使用查看器的话发现还是 你好 。 ?7.? INTERVALDS这个是Oracle独有的数据类型,意思是时间间隔的意思,显示到数据库一般是:
?这里面会有一定的数字来做限制,我们取一个真实定义的类型来看看。
什么意思呢? 意思是,这是一个时间间隔,天的精度为3位数,也就是最大999天,秒的小数部分精度为6位数。此时,不但有天和秒,还会有时分。具体数据如:
在mysql和Maria中没有这个数据类型,我们可以使用varchar来接收或者转换。 此时如果使用Maria的varchar来表示,长度为:1+3+1+8+1+6=20,那么varchar的长度可以设置为20,或者稍微大一点。 注意: 这是我们在数据库中定义的类型,但是我们查询到数据之后拿什么来接收呢? 在mysql中,我们直接使用 String 接收没问题。但是在 Oracle 中,是不可以的,它有一个专门接收的类型:
至此,关于 Oracle 和MySQL的数据类型之间的差异我们统计完了,万一漏万,不足之处,烦请谅解! 对比情况参见下图: ?7.1. 需要提醒大家的是:7.1.1. Oracle 的 timestamp查询到数据后接收的类型是?
?而不是
这个需要你自行做转换。 7.1.2. Oracle的???INTERVALDSmysql没有这个数据类型,需要我们自行转换。 7.2. 转换代码
?convertOracleTIMESTAMP2JavaTimestamp 方法:
convertOracleINTERVALDS2JavaString 方法:
8. 参考文章 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 19:58:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |