Datatypes translation between Oracle and SQL Server
Datatypes translation between Oracle and SQL Server part 1: character, binary strings
Datatypes translation is one of the most important things you need to consider when migrate your application from one database to the other. This is an article in the series that we talking about translate SQL query among different databases.
This article will focused on conversion of those datatypes: character, binary strings between Oracle and SQL Server. We will talk about conversion of other datatypes such as nunber, float, date and etc in other articles later.
When you convert character datatypes from Oracle to SQL Server or vice verse, you not only need to find corresponding datatype name but also need to find out how string was stored in database. Is this string stored in character or byte? and you must be aware of the maximum length of datatype in source and target databases.
In SQL Server, char [ ( n ) ] is fixed-length, non-Unicode character data with a length of n bytes. n must be a value from 1 through 8,000. You can easily find corresponding datatype name “char” in Oracle, but char in oracle with a maximum length of 2000 bytes. So you can’t migrate char(2048) in your SQL Server script to Oracle without any changes, you should use clob instead if n > 2000.
In Oracle database, char[(size)] can be also be used in fixed-length character data of length size in characters. When you use char qualifier, for example char(10 char), then you supply the column length in characters. A character is technically a code point of the database character set. Its size can range from 1 byte to 4 bytes, depending on the database character set. When translate this datatype to SQL Server, target datatype can be char(10) or char(40) depends on the database character set in source database(Oracle).
Detailed information about Oracle datatypes and SQL Server datatypes: including datatype name, description and what’s the corresponding datatype in other databases.
Below are summary tables show how Character and binary string datatypes translated from Oracle to SQL Server and vice verse.
| Oracle(source) | SQL Server(target) |
| CHAR [(size [BYTE | CHAR])] | char[(size)] |
| VARCHAR2(size [BYTE | CHAR]) | varchar(size) |
| NCHAR[(size)] | nchar[(size)] |
| NVARCHAR2(size) | nvarchar(size) |
| long | varchar(max) |
| long raw | varbinary(max) |
| raw(size) | varbinary(size) |
| blob | varbinary(max) |
| clob | varchar(max) |
| nclob | ntext |
| bfile | N/A |
How Character and binary string datatypes translated from SQL Server to Oracle.
| SQL Server(source) | Oracle(target) |
| char [ ( n ) ] | char[(n)], 1<=n<=2000; clob, n>2000 |
| varchar [ ( n | max ) ] | varchar2(n), 1<=n<=4000; clob (n>4000) |
| text | clob |
| nchar [ ( n ) ] | nchar[(n)], 1<=n<=2000; nclob(n>2000) |
| nvarchar [ ( n | max ) ] | nvarchar2[(n)], 1<=n<=4000; nclob( n>4000 ) |
| ntext | nclob |
| binary [ ( n ) ] | raw(1)(n was omitted); raw(n), 1<=n<=2000; blob(n>2000) |
| varbinary [ ( n | max) ] | raw(1)(n was omitted); raw(n), 1<=n<=2000; blob(n>2000) |
| image | blob |
Datatypes translation between Peoplesoft and Oracle :


Note: LONG columns cannot appear in these parts of SQL statements:
GROUPBYclauses,ORDERBYclauses, orCONNECTBYclauses or with theDISTINCToperator inSELECTstatementsThe
UNIQUEoperator of aSELECTstatementThe column list of a
CREATECLUSTERstatementThe
CLUSTERclause of aCREATEMATERIALIZEDVIEWstatementSQL built-in functions, expressions, or conditions
SELECTlists of queries containingGROUPBYclausesSELECTlists of subqueries or queries combined by theUNION,INTERSECT, orMINUSset operatorsSELECTlists ofCREATETABLE...ASSELECTstatementsALTERTABLE...MOVEstatementsSELECTlists in subqueries inINSERTstatements
TO_LOB函数是一个很特殊的函数,特殊之处在于,这个函数可以处理LONG类型数据,而且这个函数和LONG类型一样,拥有很多的限制。不过,这些还不是很特殊的地方,下面简单看一下TO_LOB这个函数。
Oracle的LONG类型可谓“臭名昭著”,由于LONG类型的限制太多,以至于Oracle很少去提LONG类型有哪些限制条件,而一般都是通过说明在哪些情况下,可以使用LONG类型。
正是这些限制阻止了LONG的使用,Oracle也在推出了大对象类型——LOB之后,强烈建议用户不要在使用LONG类型。
但是,具有讽刺意味的是,Oracle建议用户不要再使用LONG类型,可是数据字典中,随处可以看到LONG的身影。而且,即使是目前使用的最高版本10R2,LONG类型仍然在数据字典中随处可见。不知道Oracle是考虑兼容性的问题还是其他什么原因,反正Oracle仍然没有把LONG类型从数据字典中移出去。不知道11g中是否有所改观。
虽然Oracle自己没有做到,但是仍然建议用户不要在使用LONG,并使用BLOB、CLOB来替换现有系统中的LONG字段。而且LONG类型的限制也确实使人头疼,将LONG类型转化为LOB类型的工具,就是TO_LOB函数。
TO_LOB函数和LONG类型一样,限制有很多。简单的说,TO_LOB一般只用在CREATE TABLE或INSERT TABLE语句后面的子查询中。在其他地方使用会报错,比如UPDATE语句。
这还不是最大的问题,最大的问题在于,TO_LOB函数似乎并没有真正的将LONG类型转化为LOB数据类型。个人感觉,Oracle只是对LONG类型做了一些处理,使之可以存放到一个LOB类型中去。
SQL> CREATE TABLE T1 (ID NUMBER, TEXT CLOB);
表已创建。
SQL> CREATE TABLE T2 (ID NUMBER, TEXT VARCHAR2(4000));
表已创建。
SQL> INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*第 1 行出现错误:
ORA-00997: illegal use of LONG datatype
SQL> INSERT INTO T1 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;
已创建2268行。
SQL> COMMIT;
提交完成。
使用TO_LOB可以将LONG数据插入到CLOB字段中,但是如果想要将LONG数据插入到VARCHAR2中:
SQL> INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*第 1 行出现错误:
ORA-00997: illegal use of LONG datatype
SQL> INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS
*第 1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got LONG
直接插入肯定不行,但是刚才已经得到了CLOB类型,那么将CLOB转化为VARCHAR2不就可以了?但是结果确出人意料。观察错误信息,Oracle认为返回的数据类型是LONG。似乎TO_LOB并没有进行数据类型的转化。下面再验证一下:
SQL> SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS;
SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS
*第 1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got LONG
SQL> SELECT DUMP(TEXT) FROM T1;
SELECT DUMP(TEXT) FROM T1
*第 1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
从这个对比中已经可以清楚的看到,TO_LOB函数并不像想象中的那样返回CLOB类型,而实际上返回的仍然是LONG类型。
SQL> INSERT INTO T2 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;
已创建2268行。
直接使用TO_LOB似乎可以插入,但是仔细对比一下结果就会发现,LONG类型数据没有真正的插入到表中:
SQL> COL TEXT FORMAT A50
SQL> SET LONG 50
SQL> SELECT * FROM T2 WHERE ROWNUM < 3;
ID TEXT
---------- --------------------------------------------------
1
2
SQL> SELECT * FROM T1 WHERE ROWNUM < 3;
ID TEXT
---------- --------------------------------------------------
1 select OWNER, TABLE_NAME, TABLESPACE_NAME, CLUSTER
2 select a.apply_name, a.queue_name, a.queue_owner,
Related Links
- Datatypes translation between Oracle and SQL Server part 2: number (8/4/2010)
- A list of SQL best practices (10/3/2011)
- http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm(Oracle Help center ,datatype)
Datatypes translation between Oracle and SQL Server的更多相关文章
- MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...
- Oracle与SQL SERVER编程差异分析(入门)
网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin update 某个sqlserver的表@dblink名字 .... ...
- Oracle与SQL Server事务处理的比较
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...
- ORACLE和SQL SERVER的数据同步常用方法
ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...
- InstallShield高级应用--检查是否安装ORACLE或SQL Server
InstallShield高级应用--检查是否安装ORACLE或SQL Server 实现原理:判断是否存在,是通过查找注册表是否含有相应标识来判断的. 注意:XP与WIN7系统注册表保存方式不一 ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- MySql/Oracle和SQL Server的分页查
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: 1 SELECT 2 * 3 ...
- Oracle和SQL SERVER在SQL语句上的差别
Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表 ...
随机推荐
- [机器学习] 虚拟机VMware中使用Ubuntu的联网问题
在VMware中安装Ubuntu要解决两个问题: 1.VMware Tools安装使用 2.Ubuntu联网的虚拟机设置 1.VMware Tools安装 它的作用就是使用户可以从物理主机直接往虚拟机 ...
- 我的jQuery源码读后感
(function(window, undefined) { // 构造jQuery对象 var jQuery = (function() { var jQuery = function(select ...
- js 类型转换学习
类型转换分为显示转换和隐式转换 参考http://www.cnblogs.com/mizzle/archive/2011/08/12/2135885.html 先事件显示的 通过手动进行类型转换,Ja ...
- 【资源】NOIP2013测试数据senior/junior 普及/提高 数据
https://yunpan.cn/cRSepfcG4XX3V 访问密码 48e1 NOIP2013测试数据senior/junior 普及/提高 数据都在了
- 伸展树Splay
新学的,其实吧,就那么回事.... 看了几天,splay处理序列问题,真的非常厉害,翻转,插入,删除,线段树实现不了的功能,splay用起来很方便. POJ 3580 SuperMemo 这题基本就是 ...
- BZOJ1055: [HAOI2008]玩具取名
... #include<bits/stdc++.h> using namespace std; int q[255]; char s[205]; char p[]={'W','I','N ...
- php字符串笔记
1.explode:英语的意思就是爆炸,此函数用于将字符串切成数组 2.implode:英语意思是向心聚,将数据拼成字符串. 3.substr:截取字符串,从指定位置截取指定长度,不指定就到最后 4. ...
- 常用Jquery插件整理
虽然自己也写过插件,但JQuery插件种类的繁多,大多时候,我还是使用别人写好的插件,这些都是我用了同类插件里较为不错的一些,今天就整理一下公开放出来. UI: jquery.HooRay(哈哈,自己 ...
- Thinking Of Matrix
http://blog.163.com/bzm_square/blog/static/9355546320129582254842/ PS: 一种有关于矩阵的思维方法.....WiKi 向量空间,不定 ...
- python2.x与3.x差别
数字常量: 八进制 十六进制 二进制 2:0177 0o177 0x9ff 0b101010 3:0o177 0x9ff 0b101010 多种字符串: 2:一般字符串,Unicode字符串 3: ...