【YashanDB知识库】oracle dblink varchar类型查询报错记录
问题单: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驱动:
sudo vi /etc/odbcinst.ini
[YashanDB] Description=ODBC for yashanDB
Driver=/home/oracle/xp/yashandb-odbc/libyas_odbc.so
Setup=/home/oracle/xp/yashandb-odbc/libyas_odbc.so
Driver64=/home/oracle/xp/yashandb-odbc/libyas_odbc.so
Setup64=/home/oracle/xp/yashandb-odbc/libyas_odbc.so FileUsage=1
[ODBC]
Trace=NO/YES #yes打开odbc日志
TraceFile=/home/oracle/xp/odbc.log
添加环境变量:
vi .bashrc
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/oracle/xp/yashandb-odbc
配置数据源
sudo vi /etc/odbc.ini
[YASDBODBC]
Description = YASODBC
Driver = YashanDB
SERVER = 192.168.18.207 PORT = 8688
USER = sys
PWD = yasdb_123
[MYSQLDB]
Description = MySQL ODBC 5.0 Unicode Driver
Driver = MySQL8.0
Server = 192.168.7.134
Database = zabbix
Port = 3306
USER = zabbix
Password = 123456
Option = 3
CHARSET = UTF8
配置oracle dblink环境
监听文件配置
/data/app/oracle/product/19.3/dbhome_1/network/admin
vi listener.ora
新增:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = YASDBODBC)
(ORACLE_HOME = /data/app/oracle/product/19.3/dbhome_1)
(PROGRAM = dg4odbc)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = MYSQLDB)
(ORACLE_HOME = /data/app/oracle/product/19.3/dbhome_1)
(PROGRAM = dg4odbc)
)
)
坑1:
配置这个后,oracle的远程连接报错。
修改如下:
listener.ora有三个部分
详解各个属性:
1、LISTENER部分包含协议地址列表,每个实例一个入口,监听名称,可以配置多个监听,多个监听的端口号要区分开来
2、SID_LIST_LISTENER部分标识全局数据库名称、标识监听程序正在服务的每个实例的Oracle软件主目录以及实例或SID。
3、SID_LIST描述用于静态数据库注册、保持和以前的版本兼容性以及供Oracle Enterprise Manager使用,因为我本地有三个数据库
把SID_DESC 放到SID_LIST_LISTENER中
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = oracledb)
(ORACLE_HOME = /data/app/oracle/product/19.3/dbhome_1)
(SID_NAME = oracledb)
)
(SID_DESC =
(SID_NAME = YASDBODBC)
(ORACLE_HOME = /data/app/oracle/product/19.3/dbhome_1)
(PROGRAM = dg4odbc)
)
(SID_DESC =
(SID_NAME = MYSQLDB)
(ORACLE_HOME = /data/app/oracle/product/19.3/dbhome_1)
(PROGRAM = dg4odbc)
)
)
配置tns文件
vi tnsnames.ora
新增:
YASDBODBC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.134)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = YASDBODBC)
)
(HS = OK)
)
MYSQLDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.134)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = MYSQLDB)
)
(HS = OK)
)
配置odbc监听
cd /data/app/oracle/product/19.3/dbhome_1/hs/admin
mysql
添加文件:
touch initMYSQLDB.ora
vim initMYSQLDB.ora
HS_FDS_CONNECT_INFO = MYSQLDB
HS_FDS_TRACE_LEVEL = debug
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.US7ASCII
HS_NLS_NCHAR = UCS2
#HS_FDS_SUPPORT_STATISTICS = FALSE
set ODBCINI= /etc/odbc.ini
yashandb
touch initYASDBODBC.ora
vim initYASDBODBC.ora
HS_FDS_CONNECT_INFO = YASDBODBC
HS_FDS_TRACE_LEVEL = debug
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.US7ASCII
HS_NLS_NCHAR = UCS2
#HS_FDS_SUPPORT_STATISTICS = FALSE
set ODBCINI= /etc/odbc.ini
重启监听
lsnrctl stop
lsnrctl start
lsnrctl status
创建链接异构数据库连接
在yashandb和mysql上建表如下:
drop table T1;
create table T1(c1 varchar(2001) ,c2 int,c3 double);
insert into T1 values('book1',51,1),('book2',22,2),('book3',66,3),(NULL,71,4),('book4',NULL,5);
mysql
drop database link TEST_MYSQL;
create database link TEST_MYSQL connect to "zabbix" IDENTIFIED by "123456" using 'MYSQLDB' ;
SELECT * FROM T1@TEST_MYSQL;
SELECT * FROM T1@TEST_MYSQL where "c3"=1 ;
SELECT * FROM T1@TEST_MYSQL where "c2"=51 ;
SELECT * FROM T1@TEST_MYSQL where cast("c1" as varchar(200))='book1';
yashandb
drop database link YASDBODBC_TEST;
create database link YASDBODBC_TEST connect to "sys" identified by "yasdb_123" using 'YASDBODBC';
SELECT * FROM T1@YASDBODBC_TEST;
SELECT * FROM T1@YASDBODBC_TEST where c1='book1';
SELECT * FROM T1@YASDBODBC_TEST where c2=51 ;
SELECT * FROM T1@YASDBODBC_TEST where c3=1 ;
问题原因
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
修改步骤:
sql> shutdown immediate;
sql> startup upgrade;
sql> alter system set max_string_size=EXTENDED scope=both;
sql> @?/rdbms/admin/utl32k.sql
sql> startup;
sql> @?/rdbms/admin/utlrp.sql
【YashanDB知识库】oracle dblink varchar类型查询报错记录的更多相关文章
- JPA连接PG数据库时间类型查询报错的修改
PG数据库中的时间格式规范: https://blog.csdn.net/sky_limitless/article/details/79527665 to_data 转换为 普通的时间格式 to_t ...
- Oracle中建立物化视图报错
Oracle中建立物化视图报错 今天在建立视图的时候,报了一个错:ORA-01723: zero-length columns are not allowed. 建视图的语句: create mate ...
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- myBatis查询报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
myBatis查询报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL se ...
- Java类型转化报错
Java类型转化报错 报错如下: java.lang.ClassCastException:java.util.HashMap cannot be cast to java.util.List.
- #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。
#定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). def get_num(num): i ...
- sqli注入--利用information_schema配合双查询报错注入
目录 sqli-labs 5.6双查询报错注入通关 0x01 获取目标库名 0x02 获取库中表的数量 0x03 获取库中表名 0x04 获取目标表中的列数 0x05 获取目标表的列名 0x06 从列 ...
- sql注入--双查询报错注入
sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...
- MySQL查询报错 ERROR: No query specified
今天1网友,查询报错ERROR: No query specified,随后它发来截图. root case:查询语法错误 \G后面不能再加分号;,由于\G在功能上等同于;,假设加了分号,那么就是;; ...
- 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...
随机推荐
- ubuntu20使用php+apache+adminer搭建mysql网页管理工具
前言 使用 php7+apache2+adminer 搭建网页版mysql管理工具,现将自己的搭建过程记录下来,留作后续参考.可参考其中配置,由于只配置了一次环境,可能有的步骤是多余的,后续可能会 ...
- Mybatis-plus 中Wrapper的使用
mybatis plus条件构造器关系图 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类,可new对象 3.黄色箭头指向为父子类关系,箭头指向为父类 QueryWrapper 继 ...
- Solo 开发者周刊 (第8期):Claude公司再度上新产品,成交额将超73亿美元
这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 Cla ...
- SeaweedFS + TiKV 部署保姆级教程
在使用 JuiceFS 时,我们选择了 SeaweedFS 作为对象存储,以及 TiKV 作为元数据存储,目前在 SeaweedFS 上已经存储了近1.5PB 的数据.关于 SeaweedFS 和 T ...
- 算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
1. RNN(Recurrent Neural Network) 时间轴 1986年,RNN 模型首次由 David Rumelhart 等人提出,旨在处理序列数据. 关键技术 循环结构 序列处理 长 ...
- [oeasy]python0027_整合程序_延迟输出时间_整合两个py程序
整合程序 回忆上次内容 通过搜索发现 time中有函数可以延迟 time.sleep(1) 还可以让程序无限循环 while True: 现在需要两个程序的整合 循环延迟输出 时间输出 编辑 ...
- 记一次 Redisson 线上问题 → 你怎么能释放别人的锁
开心一刻 今天,我的又一个好哥们脱单了,只剩下我自己单身了 我向一个我喜欢的女生吐苦水 我:我这辈子是找不到女朋友了 她:怎么可能,你很优秀的,会有很多女孩子愿意当你女朋友的 我内心窃喜,问道:那你愿 ...
- Linux 中 Crontab 执行时的环境变量问题(allure命令不执行)
前几天做了UI自动化脚本部署linux服务器,但是放下脚本的allure命令不执行(生成allure报告和启动allure服务的命令不执行),然后就各种找问题,一开始怀疑是allure的环境变量问题, ...
- 如何对jar包修改并重新发布在本机
本人苦于jieba不能如何识别伊利丹·怒风,召唤者坎西恩这种名字,对jieba-analysis进行了解包和打包 步骤1:找到对应jar 步骤2:在cmd中输入jar -xvf xxx.jar解压包, ...
- SEO初学指南之关键词研究(3) - 关键词分析实战
经过之前的学习,这次我们开始实战.手把手教大家如何为网站筛选符合条件的关键词. 还不熟练的,建议再反复学习前两篇文章: SEO初学指南之关键词研究 (1) - 入门 SEO初学指南之关键词研究 (2) ...