前言

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

当我们通过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. oracle 游标变量ref cursor详解

    一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...

  2. 使用docker stack方式部署web集群

    如何部署swarm集群,请参考: https://blog.csdn.net/IndexMan/article/details/102713777 创建文件夹 mkdir -p /opt/docker ...

  3. D. Required Length

    D. Required Length 题意:给你一个长度n,一个数x,x每个后续状态可以由前一个状态乘以前一个状态的某一位上的数字得到,问最少多少步,能把x变成一个n位数.如果不能变成n位数,输出-1 ...

  4. python第五章pta习题总结

    四.编程部分 1.sorted函数: sorted(iterable, cmp=None, key=None, reverse=False) #iterable:可迭代的对象 #cmp:比较规则 #k ...

  5. 常用Linux命令备查

    查找在指定日期创建的文件 2种方式: find命令: # 这种方式查找到的文件会显示路径 find -name *.log -newermt '2022-06-21 08:00:00' ! -newe ...

  6. 常用SQL语句备查

    查询表中某一列是否有重复值 SELECT bizType, COUNT(bizType) FROM Res GROUP BY bizType HAVING COUNT(bizType) > 1 ...

  7. Android Compose开发

    目录 好处 入门 Composable 布局 其他组件 列表 verticalScroll 延迟列表 内容内边距 性能 修饰符 偏移量 requiredSize 滚动 添加间距Spacer Butto ...

  8. 02-Redis系列之-架构和高级API的使用

    通用部分 通用命令 # 1-keys # 打印出所有key keys * # 打印出所有以n开头的key keys n* # 打印出所有以nam开头,第四个字母是a到z的范围 keys nam[a-z ...

  9. 修改centos7虚拟机的用户密码

    在忘记原密码无法登录桌面的情况下,修改centos7的用户密码 非常规启动,进入编辑启动菜单 在启动GRUB菜单中选择编辑选项,按键e进入编辑; 找到linux16开头的一行,在该行中寻找ro的所在地 ...

  10. 【Azure 媒体服务】在Azure Media Service门户中使用HLS模式传输视频流,播放视频步骤

    问题描述 如何在Azure Media Service门户中使用HLS模式传输视频流,播放视频步骤 问题解决 第一步:在 Media Service 这边点击资产.上传本地视频资源作为Media Se ...