前言

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

当我们通过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. 【Unity3D】UGUI之Slider

    1 Slider属性面板 ​ 在 Hierarchy 窗口右键,选择 UI 列表里的 Slider 控件,即可创建 Slider 控件,选中创建的 Slider 控件,按键盘[T]键,可以调整 Sli ...

  2. SpringCloud 注册中心Consul实战

    介绍 Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色.轻量级的特点.Consul是分布式的.高可用的. 可 ...

  3. ORACLE ROLLUP和CUBE介绍

    http://blog.csdn.net/wanghai__/article/details/4817920 ------------------ ROLLUP,是GROUP BY子句的一种扩展,可以 ...

  4. 【libGDX】使用Mesh绘制三角形

    1 Mesh 和 ShaderProgram 简介 1.1 创建 Mesh ​ 1)Mesh 的构造方法 public Mesh(boolean isStatic, int maxVertices, ...

  5. 系统环境变量中 HTTPS_PROXY 的误区

    前段时间在测试一个连麦 demo,demo 简要说可以在内网环境中运行时,输入频道号就可以模拟连麦 但是在加入连麦时,一直返回错误 -2 EOF,询问得知,该错误的解释信息是"Service ...

  6. 【Android 逆向】apk反编译后重打包

    1. 执行 apktool b smali_dir smali_dir 为反编译出来的数据目录 执行后可能会报错 I: Building resources... W: /root/Desktop/t ...

  7. Vulnhub内网渗透DC-7靶场通关

    个人博客: xzajyjs.cn DC系列共9个靶场,本次来试玩一下一个 DC-7,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推 ...

  8. Android加载PDF方案(pdf.js,支持缩放)

    都知道,Android本身的webview是不支持pdf加载的(比不上iOS的webview,谁让人家NB呢),因此通过连接Google的一个服务器转换成功后返回给WebView显示.但是,但是,但是 ...

  9. 树莓派开发笔记(十六):树莓派4B+安装mariadb数据库(mysql开源分支)并测试基本操作

    前言   树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mariadb数据库服务(mysql的开源分支), ...

  10. heapq模块通过nlargest()和nsmallest()找到最大或最小的N个元素

    问题 我们想在某个集合中找出最大或最小的N个元素 解决方案 heapq模块中有两个函数nlargest()和nsmallest() import heapq nums = [1,8,2,23,7,-4 ...