Oracle字符类型与数值类型的转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle字符类型与数值类型的转换相关的知识,希望对你有一定的参考价值。

“避免改变索引列的类型.:
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
Sql代码
SELECT … FROM EMP WHERE EMPNO = ‘123'

实际上,经过ORACLE类型转换, 语句转化为:
Sql代码
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')

幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123

这个语句被ORACLE转换为:
SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123

因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型”

但我这里怎么看都是" 注意当字符和数值比较时, ORACLE会优先转换字符类型到数值类型"?哪个正确呢?谢谢!

额,我对你上面的话的理解是:每次进行筛选的时候,一定要避免隐式转换。在索引字段上使用函数,或者其他的转换都会导致索引不可用,而你说的优先转换字符类型到数值类型,假如你进行筛选的字段是字符类型,那Oracle绝对不会给你转成数值类型,你的那句话应该是相对于其他类型来说的吧我认为,比如date类型之类的。所以我认为两个应该都是对的,只是说的是两个不同方面的规则吧。

我做过一个项目,用两张有3千万的表进行join,结果发现速度慢得受不了,该加的索引都加了,用执行计划看了,发现索引用不到,问题也就出在隐式转换身上。所以,第一句是对的,而第二句其实我也不是很确定哪个优先,从表面上看是看不出来的,要了解到Oracle内部的转换机制。。。小小意见,一起探讨探讨。。。
参考技术A 应该是优先转换定值,滞后转化甚至不转换变量

比如 SELECT × FROM EMP WHERE EMP_TYPE = TO_CHAR(123)
只需要在编译时候转换一次;

SELECT * FROM EMP WHERE TO_NUMBER(EMP_TYPE) = 123
会在每条记录都to_number一次

完全不是一个概念!
参考技术B 当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。

所以,你的理解是对的。
上面的例子也正是这样的意思。

oracle中的number类型对应mysql里面啥类型啊

Number在Oracle中是数值型的统称,可以表示Oracle中的所有数值。而MySQL没有数值的统称,只有分别的数据类型,例如 INT、FLOAT、DOUBLE等。

MySQL的数值类型有如下几种 :

扩展资料

ORACLE的数据类型

    CHAR 固定长度字符串,最大长度2000 bytes;

    VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749;

    NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes;

    NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes;

    DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS);

    LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB;

    RAW 固定长度的二进制数据 最大长度2000 bytes 可存放多媒体图象声音等;

    LONG RAW 可变长度的二进制数据 最大长度2G 可存放多媒体图象声音等;

    BLOB 二进制数据 最大长度4G;

    CLOB 字符数据 最大长度4G;

    CLOB 根据字符集而定的字符数据 最大长度4G ;

    BFILE 存放在数据库外的二进制数据 最大长度4G ;

    ROWID 数据表中记录的唯一行号 10 bytes ********.****.****格式,*为0或1;

    NROWID 二进制数据表中记录的唯一行号 最大长度4000 bytes;

    NUMBER(P,S) 数字类型 P为总位数,S为小数位数;

    DECIMAL(P,S) 数字类型 P为总位数,S为小数位数;

    INTEGER 整数类型 小的整数;

    FLOAT 浮点数类型 NUMBER(38),双精度;

    REAL 实数类型 NUMBER(63),精度更高。

MySQL的数据类型

    整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT;

    浮点数类型:FLOAT、DOUBLE、DECIMAL;

    字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB;

    日期类型:Date、DateTime、TimeStamp、Time、Year;

    其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection。

参考资料来源:MySQL官方文档

参考资料来源:Oracle官方文档

参考技术A

1、第一步,双击打开SQLyog客户端软件,新建数据库表t_date_time,直接在客户端进行创建。


2、在Python 3里,只有一种整数类型 ,不分整型和长整型。使用Python的内置函数type可以查看变量所指的数据类型。

3、整型计算。

4、 浮点类型,Python中的浮点类型类似Java语言中的double 类型,是双精度浮点型,可以直接用十进制或科学计数法表示。

5、布尔类型是表示逻辑状态的类型,用 True 和 False 来表示真假,任何非 0 数字都为 True。所以,在一定意义上可以把 布尔类型看成整型。

参考技术B oracle中的number类型是广泛的数字类型,由number(M,N)来确定精度,n=0为整数,M确定的是数据大小的范围,所以说不能与mysql中的进行唯一对应。 参考技术C Oracle的number 可以用

sql标准的 numeric/decimal来 对应。

mysql应该支持numeric/decimal类型。
参考技术D decimal ,如果想表示的全面点,就可以用decimal类型,但是mysql中的数据类型比较宽松,你定义成varchar类型也可以和数字进行匹配,但是最好自己定义的严谨点儿。

以上是关于Oracle字符类型与数值类型的转换的主要内容,如果未能解决你的问题,请参考以下文章

oracle常用函数之 转化函数

sql server将字符串类型转换为数值类型

常用函数——数据类型转换函数

4 Oracle表的创建与修改

Sql中有没有把字符串转换成int数值类型

类型转换 隐式转换 自动提升 强制转换