前言

关于我们经常见到的字符集乱码问题,很可能因为数据库服务器端的操作系统字符集和客户端字符集不一致导致的。

当我们通过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客户端字符集导致的乱码问题的更多相关文章

  1. [转]Oracle因安装时未设定字符集导致中文乱码的解决方案

    在CentOS 6.4上安装Oracle 11g没有设定字符集,采用的是操作系统默认字符集:WE8MSWIN1252,将字符集修改为:AL32UTF8. SQL> select userenv( ...

  2. [转]sqlldr 导入乱码,Oracle客户端字符集问题

    1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...

  3. oracle服务端与客户端字符集不同导致中文乱码解决方案

    1.问题描述 用pl/sql登录时,会提示“数据库字符集(ZHS16GBK)和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果”,具体问题是中文乱码,如下图 2.问题分析 不管错误信息 ...

  4. String.getBytes()未设置字符集导致打印的pdf乱码

    如果不设置字符集会选择系统字符集,系统也没设置,会选iso-8859-1 导致汉字乱码,成为?

  5. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  6. oracle的字符集设置与乱码

    oracle的字符集设置与乱码 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整个运行环节中,字符集在3个环节中发挥作用: 1.软件在操作系统上运作时的对用户的显示,此时采用操作系统 ...

  7. plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致

    plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 (2014-07-25 18:40:34)转载▼ 标签: it 分类: Database Databa ...

  8. oracle服务器和客户端字符集的查看和修改

    一.什么是oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

  9. 特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;

    字符集.字符序的概念与联系 在数据的存储上,MySQL提供了不同的字符集支持.而在数据的对比操作上,则提供了不同的字符序支持. MySQL提供了不同级别的设置,包括server级.database级. ...

  10. php中隐形字符65279(utf-8的BOM头)问题和fwrite写入文件bom头导致的乱码问题解决

     php中隐形字符65279(utf-8的BOM头)问题 今天在CSDN看到一个php输出空白隐形字符65279的问题,在网上找了下,发下这个65279字符是php用来标记文件是utf-8编码的,输出 ...

随机推荐

  1. 栈溢出-ret2libc地址泄露笔记

    作为一名初学者,在碰到很多攻击思路的时候会感觉很妙,比如gadget的构造,这题的sh参数截断. 1.首先分析程序架构和保护措施. 2.使用IDA开始判断程序是否具备最简单的栈溢出执行条件: ret2 ...

  2. Java开发技巧杂记

    杂记一 创建项目的spring initializr,要求是创建spring boot3.0,且不在支持java8语言,且要求语言大于17,所以创建项目时,无法创建srping2.0项目了:如果要创建 ...

  3. 编译静态库遇到的 LNK2019 报错

    前文提到了 CMake 学习 文末基本涵盖了我遇到的编译问题,但是在得到一个编译好的 .lib 文件后,还需要放到项目中引用成功后才算真正的完成静态库的编译 嗯,我之所以说这些是因为我在项目中链接静态 ...

  4. Go语言并发编程(1):对多进程、多线程、协程和并发、并行的理解

    一.进程和线程 对操作系统进程和线程以及协程的了解,可以看看我前面的文章: 对进程.线程和协程的理解以及它们的区别:https://www.cnblogs.com/jiujuan/p/16193142 ...

  5. vscode添加gitbash终端方法

    1.打开vscode 2.点击文件,ctrl+, 3.搜索shell windows { ... // 添加如下代码 "terminal.integrated.profiles.window ...

  6. 用Docker发布网站时,自动下载Directory.Build.props及其Import的文件

    为Blazor网站项目,"添加Docker支持" 这时,网站项目根目录下会新增Dockerfile. 里面文字内容如下 #See https://aka.ms/customizec ...

  7. [java] Tomcat 启动失败 Error: error while reading constant pool for .class: unexpected tag at #

    表现 公司服务器今天启动tomcat失败, 看catalina.out文件里面报错 java.lang.ClassFormatError: Unknown constant tag 101 in cl ...

  8. C++ 模板的笔记1

    C++模板的笔记1 C++ 函数模板 函数模板的定义 函数模板是一种可以生成不同类型函数的函数声明.函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来. 语法: template <t ...

  9. elementPlus使用el-icon

    按着文档来撒 yarn add @element-plus/icons-vue main.ts import * as ElementIcons from '@element-plus/icons-v ...

  10. 我的Java面试资料推荐

    看法 每年去大厂试试水,借此来评估自己的能力.价值和不足,或许还能拿到一个好offer,是个合格程序员的职业表现 大厂面试,基本都是:先过算法,检验面试人的智商和逻辑能力:之后才考察语言.设计.中间件 ...