问题单:Oracle DBLINK查询崖山DB报错
oracle服务器上ODBC安装
unixodbc安装:yum -y install unixODBC
mysql
配置安装对应版本的odbc:
myodbc-installer -d -a -n "MySQL8.0" -t "DRIVER=/home/oracle/tools/mysql-connector-odbc-8.0.20/lib/libmyodbc8w.so;SETUP=/home/oracle/tools/mysql-connector-odbc-8.0.20/lib/myodbc8S.so"
yashandb
安装yasdb-odbc
安装yasdb-client
配置odbc驱动:
添加环境变量:
配置数据源
配置oracle dblink环境
监听文件配置
/data/app/oracle/product/19.3/dbhome_1/network/admin
vi listener.ora
新增:
坑1:
配置这个后,oracle的远程连接报错。
修改如下:
listener.ora有三个部分
详解各个属性:
1、LISTENER部分包含协议地址列表,每个实例一个入口,监听名称,可以配置多个监听,多个监听的端口号要区分开来
2、SID_LIST_LISTENER部分标识全局数据库名称、标识监听程序正在服务的每个实例的Oracle软件主目录以及实例或SID。
3、SID_LIST描述用于静态数据库注册、保持和以前的版本兼容性以及供Oracle Enterprise Manager使用,因为我本地有三个数据库
把SID_DESC 放到SID_LIST_LISTENER中
配置tns文件
vi tnsnames.ora
新增:
配置odbc监听
cd /data/app/oracle/product/19.3/dbhome_1/hs/admin
mysql
添加文件:
yashandb
重启监听
创建链接异构数据库连接
在yashandb和mysql上建表如下:
mysql
yashandb
问题原因
dblink使用odbc连接其它数据库,如yashandb、mysql等
● 把其它数据库的varchar类型会变成oralce中的nvarchar2类型,如下组图1。
● nvarchar2类型2个字节存储一个字符,超过varchar(2000)的字段类型因为超过了4000个字节,在oracle中变成了long类型,如下组图2。
● long类型不能在where、group by、order by中使用。
问题复现
组图1:
mysql中的表类型:

oracle中的表类型:

查询正常:

组图2:
mysql中的表类型:

oracle中的表类型:

查询报错:

oracle long类型限制
- LONG数据类型中存储的是可变长字符串,最大长度限制是2GB。
- 对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG来存储的。
- LONG类型主要用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。
- 很多工具,包括SQLPlus,处理LONG 数据类型都是很困难的。
- LONG数据类型的使用中,要受限于磁盘的大小。
能够操作LONG的SQL语句:
- Select语句
- Update语句中的SET语句
- Insert语句中的VALUES语句
限制:
- 一个表中只能包含一个 LONG 类型的列。
- 不能索引LONG类型列。
- 不能将含有LONG类型列的表作聚簇。
- 不能在SQLPlus中将LONG类型列的数值插入到另一个表格中,如insert into …select。
- 不能在SQL*Plus中通过查询其他表的方式来创建LONG类型列,如create table as select。
- 不能对LONG类型列加约束条件(NULL、NOT NULL、DEFAULT除外),如:关键字列(PRIMARY KEY)不能是 LONG 数据类型。
- LONG类型列不能用在Select的以下子句中:where、group by、order by,以及带有distinct的select语句中。
- LONG类型列不能用于分布查询。
- PL/SQL过程块的变量不能定义为LONG类型。
- LONG类型列不能被SQL函数所改变,如:substr、instr。 因为long类型的数值不能用insert into … select的方法插入,故我们要分两步走,先插入其它字段,最后再插入long类型字段,这可以通过过程来实现.
参考: oracle里long类型的总结_oracle long-CSDN博客
char类型区别
char
1、char的长度是固定的。比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节;
2、char是区分中英文的。中文在char中占两个字节,而英文占一个,所以char(20)你只能存20个字母或10个汉字。
char适用于长度比较固定的,一般不含中文的情况。
varchar/varchar2
1、varchar是长度不固定的。比如说,你定义了varchar(20),当你插入abc,则在数据库中只占3个字节。
2、varchar同样区分中英文。这点同char。
3、varchar2基本上等同于varchar。它是oracle自己定义的一个非工业标准varchar,不同在于,varchar2用null代替varchar的空字符串。
varchar/varchar2适用于长度不固定的,一般不含中文的情况。
nvarchar/nvarchar2
1、nvarchar和nvarchar2是长度不固定的;
2、nvarchar不区分中英文。比如说:你定义了nvarchar(20),你可以存入20个英文字母/汉字或中英文组合,这个20定义的是字符数而不是字节数;
3、nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占两个字节。
大多数情况下,ORACLE中的国家字符集是默认的,以下结论成立:
如果要省存储空间,建表时,字段内容里如果中文占了大多数,就用nvarchar2类型;如果内容是英文和数字为主的字符串,就用varchar2类型。
注意:
- ORACLE中的国家字符集,只有在数据类型为NCHAR/NVARCHAR/NCLOB时才会被使用,也就是前面带N(national)的字符类型;
- ORACLE默认国家字符集为AL16UTF16,完全对应UNICODE的UTF-16标准(有别于数据库字符集)
- ORACLE中的UTF-8,不是标准的UTF-8,而是CESU-8。
参考: Oracle字段类型char、varchar2、nvarchar2的区别与使用_oracle varchar2-CSDN博客
规避方法
varchar最大支持长度为4000字节,通过参数MAX_STRING_SIZE控制 MAX_STRING_SIZE默认为STANDARD,修改成EXTENDED支持32K
修改步骤:

244

被折叠的 条评论
为什么被折叠?



