KingbaseES kdb_database_link客户端字符集导致的乱码问题
前言
关于我们经常见到的字符集乱码问题,很可能因为数据库服务器端的操作系统字符集和客户端字符集不一致导致的。
当我们通过kdb_database_link插件访问oracle数据库出现乱码,只需要调整操作系统字符集即可解决。这个案例关键问题在于调整kingbase客户端字符集为GBK。因为oracle端的数据经过dblink传输到操作系统,意味着oracle端的client字符集需要与kingbase数据库所在服务器的操作系统字符集保持一致,所以这里的操作系统字符集也应该为GBK,如果是UTF8就会出现乱码。而操作系统字符集也可理解为kingbase服务器的客户端字符集,对应参数client_encoding,因为案例中不存在终端工具。
注意我们不用特别注意数据库服务器端字符集一定要与客户端或操作系统字符集保持一致,因为数据库进入数据库中会自动转换成数据库服务器设置的字符集。当然前提是数据库服务器端字符集是客户端字符集的超集。
实验环境:
[
](javascript:void(0)
kingbase服务器字符集:show server_encoding ;
test=# show server_encoding ;
server_encoding
-----------------
UTF8
(1 row)
kingbase客户端字符集:
test=# show client_encoding ;
client_encoding
-----------------
UTF8
(1 row)
[
](javascript:void(0)
oracle服务器端字符集:
select * from nls_database_parameters;PARAMETER VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
oracle客户端字符集:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
实验
首先需要搭建dblink环境,配置odbc访问oracle,这个过程记录在文档《Linux 配置ODBC连接Oracle》,这里略过,
需要注意的是在odbcinst -j步骤,需要配置用户的环境变量LD_LIBRARY_PATH=‘Server/lib’
添加插件
create extension kdb_database_link;
create extension oracle_fdw;
create extension kingbase_fdw ;
创建远程链接
[
](javascript:void(0)
test=# create public database link dblink_test connect to 'system' identified by 'system' using ( DriverName = 'KingbaseES V8R6 ODBC Driver' , Host = '192.168.57.30' , Port = 54321 , Dbname = 'test' , Dbtype = 'kingbase');
CREATE DATABASE LINK
test=#
test=# select * from pg_user_mappings;
umid | srvid | srvname | umuser | usename | umoptions
-------+-------+--------------------------------+--------+---------+---------------------------------------------
17319 | 17318 | ora19c | 10 | system | {user=C##FDW_TEST,password=fdw_test}
17328 | 17327 | ora19c_1 | 10 | system | {user=C##FDW_TEST,password=fdw_test}
17341 | 17340 | dblink_server_dblink_test_2200 | 0 | public | {user=system_remote,password=system_remote}
(3 rows)
test=# select * from pg_foreign_server;
oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvopt
ions
-------+--------------------------------+----------+--------+---------+------------+-------------------+-----------------------
----------------------
13686 | sysaudit_svr | 10 | 13685 | | | |
17318 | ora19c | 10 | 17317 | | | {system=U/system} | {dbserver=//192.168.57
.30:1521/ORC19C}
17327 | ora19c_1 | 10 | 17326 | | | {system=U/system} | {dbserver=//192.168.57
.30:1521/ORC19C}
17340 | dblink_server_dblink_test_2200 | 10 | 17339 | | | | {dbname=test,host=192.
168.57.30,port=54321}
(4 rows)
test=# select * from tb@dblink_test;
id | name
----+------
1 | xca
2 | cas
3 | cab
4 | can
5 | cam
6 | kmh
(6 rows)
test=#
[kingbase@postgres ~]$ env|grep LANG
LANG=en_US.UTF-8
[kingbase@postgres ~]$ ksql -Usystem -dtest
ksql (V8.0)
Type "help" for help.
test=# create public database link dblink_oracle connect to 'C##FDW_TEST' identified by 'fdw_test' using ( DriverName = 'Oracle ODBC Driver' , Host = '192.168.57.30' , Port = 1521 , Dbname = 'ORC19C' , Dbtype = 'Oracle');
CREATE DATABASE LINK
test=# select * from tb@dblink_oracle;
id | name
----+-----------------
1 | sda
2 | dcs
2 | 甯堝ぇ鍙戞斁
2 | 鐩涘ぇ鐨勫コ鐢�
3 | 鏃朵唬鍓х湅
4 | 骞翠唬澶嶅彜鐨�
(6 rows)
--设置客户端工具字符集为GBK
--这里使用ssh工具,设置ssh工具字符集为GBK后乱码显示正常
test=# select * from tb@dblink_oracle;
id | name
----+-----------------
1 | sda
2 | dcs
2 | 师大发放
2 | 盛大的
3 | 时代剧看
4 | 年代复古的
(6 rows)
--再设置ssh工具字符集为UTF8,又会出现乱码
test=# select * from tb@dblink_oracle;
id | name
----+-----------------
1 | sda
2 | dcs
2 | 甯堝ぇ鍙戞斁
2 | 鐩涘ぇ鐨勫コ鐢�
3 | 鏃朵唬鍓х湅
4 | 骞翠唬澶嶅彜鐨�
(6 rows)
--设置client_encoding =GBK;显示结果正常
test=# set client_encoding =GBK;
SET
test=# select * from tb@dblink_oracle;
id | name
----+------------
1 | sda
2 | dcs
2 | 师大发放
2 | 盛大的
3 | 时代剧看
4 | 年代复古的
(6 rows)
test=# select * from sys_database_link ;
oid | lnkname | lnknamespace | lnkuser | lnkowner | lnkserver | dbtype | lnkoptions
| lnkcreated
-------+---------------+--------------+---------+----------+-----------+----------+-------------------------------------------------
-------------------------------------+-------------------------------
17342 | dblink_test | 2200 | 17341 | 10 | 17340 | kingbase | {host=192.168.57.30,port=54321,dbname=test,"Driv
erName=KingbaseES V8R6 ODBC Driver"} | 2022-12-17 19:27:59.255403+08
17345 | dblink_oracle | 2200 | 17344 | 10 | 17343 | oracle | {host=192.168.57.30,port=1521,dbname=ORC19C,"Dri
verName=Oracle ODBC Driver"} | 2022-12-17 19:39:50.839583+08
(2 rows)
KingbaseES kdb_database_link客户端字符集导致的乱码问题的更多相关文章
- [转]Oracle因安装时未设定字符集导致中文乱码的解决方案
在CentOS 6.4上安装Oracle 11g没有设定字符集,采用的是操作系统默认字符集:WE8MSWIN1252,将字符集修改为:AL32UTF8. SQL> select userenv( ...
- [转]sqlldr 导入乱码,Oracle客户端字符集问题
1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...
- oracle服务端与客户端字符集不同导致中文乱码解决方案
1.问题描述 用pl/sql登录时,会提示“数据库字符集(ZHS16GBK)和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果”,具体问题是中文乱码,如下图 2.问题分析 不管错误信息 ...
- String.getBytes()未设置字符集导致打印的pdf乱码
如果不设置字符集会选择系统字符集,系统也没设置,会选iso-8859-1 导致汉字乱码,成为?
- 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...
- oracle的字符集设置与乱码
oracle的字符集设置与乱码 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整个运行环节中,字符集在3个环节中发挥作用: 1.软件在操作系统上运作时的对用户的显示,此时采用操作系统 ...
- plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 (2014-07-25 18:40:34)转载▼ 标签: it 分类: Database Databa ...
- oracle服务器和客户端字符集的查看和修改
一.什么是oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...
- 特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;
字符集.字符序的概念与联系 在数据的存储上,MySQL提供了不同的字符集支持.而在数据的对比操作上,则提供了不同的字符序支持. MySQL提供了不同级别的设置,包括server级.database级. ...
- php中隐形字符65279(utf-8的BOM头)问题和fwrite写入文件bom头导致的乱码问题解决
php中隐形字符65279(utf-8的BOM头)问题 今天在CSDN看到一个php输出空白隐形字符65279的问题,在网上找了下,发下这个65279字符是php用来标记文件是utf-8编码的,输出 ...
随机推荐
- 【OpenGL ES】绘制魔方
1 前言 在立方体贴图(6张图)中,绘制了一个立方体,贴了 6 张图,本文的魔方案例,将实现绘制 27个立方体,贴 162 张图.贴图图片如下: 说明:inside.png 为魔方内部色块,用 ...
- 手动实现apply、call、bind
手动实现apply.call.bind 每个Function对象都存在apply().call().bind()方法,其作用都是可以在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函 ...
- 使用SYS_CONTEXT
使用SYS_CONTEXT 1.什么是SYS_CONTEXT? SYS_CONTEXT 函数是Oracle提供的一个获取环境上下文信息的预定义函数. 该函数用来返回一个指定namespace下的par ...
- New Questions
1. C++/Qt 实现一个信号槽 #include <functional> #include <iostream> #include <vector> clas ...
- 【Android 逆向】r0zapataNative.apk 破解
1. apk 安装到手机,需要输入内容,随便输入,提示fail... 2. apk 导入到jadx中查看一下 MainActivity.java String textData = "b2F ...
- 硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建USB封装,创建DIP焊盘 ...
- 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)
好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记 1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...
- 【Azure Function】Azure Function中使用 Java 8 的安全性问题
问题描述 使用Azure Function, 环境是Linux的Java8.目前 Oracle Java JDK8,11,17 和 OpenJDK 8/11/17 都在存在漏洞受影响版本的范围内. O ...
- 【Azure Redis】PHPRedis遇见SSL Connection Timeout问题
问题描述 PHP Redis客户端遇见使用SSL Connection timeout,遇见问题后,切换回去Non-SSL没有出现问题.但是切换回SSL后,还是偶尔遇见Connection timeo ...
- 【Azure API 管理】通过Java APIM SDK创建一个新的API,如何为Reqeust的Representation设置一个内容示例(Sample)?
问题描述 在使用API Management服务时,以Echo API(默认创建)举例,它会在Request的body部分默认设置一个SAMPLE指,这样在测试接口时候,就会有默认的Body内容,我们 ...