`
z_kanhai
  • 浏览: 52301 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

两个数据库字符集不一样,如何快速增量同步数据.

db 
阅读更多
环境:

DB-A 字符集:US7ASCII
DB-B 字符集:ZHS16GBK

需求: 从DB-A中将一个表的中文数据通过JAVA定时任务同步到DB-B.

DB-A库中表的信息如下:
CREATE TABLE USER_INFO (USER_ID number, USER_NAME varchar2(50));

如果用一般的方式来SELECT,和INSERT,不管客户端用什么样的字符集,数据到DB-B上肯定会显示乱码.


解决方法1 (在数据库实现)

解决思路:通过视图将数据转换成二进制数据,绕过字符集的转换,然后让目标库来读取.
1. 在DB-A库上创建视图:
create or replace view view_user_info
as
select user_id, utl_raw.cast_to_raw(user_name) user_name from user_info ;

2. 在DB-B库上创建视图:
create or replace view view_user_info_db_a
as
select user_id, utl_raw.cast_to_varchar2 (user_name) user_name from view_user_info@db_a;

3. 在DB-B库上进行数据读取:
select user_id,user_name from view_user_info_db_a ;
这时显示出来的数据才是正确的!

其实就是:select utl_raw.cast_to_raw('中华人民'),utl_raw.cast_to_varchar2('D6D0BBAAC8CBC3F1') from dual;
优点: 对JAVA程序来说是透明的,无所改动代码。
数据提取时,与客户端字符集无关
缺点: 增加数据库CPU开销

--经过钟MM的提示学习到了以下方法:

解决方法2 (在JAVA实现)

使用JAVA的两个函数来实现:getBytes() , new String()
先来看一下这两个函数:

. getBytes(charset)

这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。
注意字符串在java内存中总是按unicode编码存储的。
比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",
如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。
如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。
如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。

. new String(charset)

这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。
参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。
因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。

对于以上两个函数,我们可以有两种用法来解决这个问题:
方法 2.1

a) 无需关心客户端NLS_LANG的设置
b) 从数据库取出字符的二进制编码:
select user_id, utl_raw.cast_to_raw(user_name) user_name from user_info ;
c) 在java用其所 new String(username, 'GBK' ) 转成中文
d) 插入到目标库

方法 2.2 (推荐)

a) 将JAVA 客户端NLS_LANG设置为US7ASCII
b) 从数据库直接取出字段值
select user_id, user_name from user_info ;
(这时因为客户端和服务器的字符集一致,所以会得到正确的中文显示)
c) 将中文进行转码为GBK:
new String( user_name.getBytes( "gbk" ), "gbk" )
d) 得到正确的GBK中文编码插入到目标库

优点:代码完全由JAVA控制,无需作数据库变更,数据库的压力转移到了JAVA客户端.
注意:必须把客户端的字符集和服务器端的字符集设置成一样

分享到:
评论

相关推荐

    oracle数据库字符集 无法修改数据库字符集 乱码

    在Oracle数据库管理中,字符集的设置至关重要,它直接影响到数据的存储、检索以及与之交互的准确性。本文将深入探讨Oracle数据库字符集的概念、重要性、修改过程及其潜在问题,特别是当尝试修改数据库字符集时遇到的...

    Oracle数据库字符集问题解析.pdf

    本文还介绍了 Oracle 数据库字符集问题的解决方法,包括使用 exp/imp 工具来转换数据库字符集,使用 Unicode 字符集来存储数据等。 Oracle 数据库字符集问题解析对 Oracle 数据库管理系统的应用和发展产生了深远的...

    数据库字符集修改方法

    2. **内部使用字符集**:数据库内部用来表示数据的字符集。 3. **客户端字符集**:客户端应用程序使用的字符集。 4. **NLS参数**:NLS(National Language Support)参数是Oracle提供的一组用于控制多语言支持行为的...

    Oracle数据库字符集问题分析及解决方法.pdf

    这四个环节的字符集不一致会触发字符集转换,可能导致不必要的数据损失。 2. NLS_LANG参数的影响 NLS_LANG是影响Oracle数据库字符集的最重要参数,它由三部分组成:LANGUAGE、TERRITORY和CHARACTERSET。其中,...

    Mysql两个数据库表之间双向数据同步方案.docx

    ### MySQL两个数据库表之间的双向数据同步方案 #### 概述 本文档主要介绍了一种针对MySQL环境下两个数据库表之间的双向数据同步方案。该方案适用于需要保持两个不同位置或不同环境中数据库表数据一致性的场景,...

    oracle数据库的字符集

    在Oracle数据库中,字符集是一个非常关键的概念,它直接关系到数据的正确存储和显示。字符集在创建数据库时被指定,并且在创建后通常不能更改。因此,选择一个正确的字符集至关重要。 #### 二、字符集的发展历史 ...

    oracle 10g xe 版本更改数据库字符集

    3. **创建新数据库**:考虑到Oracle官方文档不推荐直接修改现有数据库的字符集,建议创建一个新的数据库并使用期望的字符集。 #### 四、创建新数据库的具体步骤 1. **停止Oracle服务**: - 打开命令提示符,执行`...

    修改数据库字符集

    2. **数据迁移**:如果数据库中的数据已经使用了不同的字符集,那么在修改字符集之前可能需要对数据进行转换或迁移。 3. **备份**:任何涉及到数据库的重大更改前都应该先做好数据备份,以防万一出现问题时能够快速...

    浅析Oracle数据库字符集问题.pdf

    数据库中的字符集设置不等于操作系统的字符集,数据库可以独立于操作系统来支持特定语言,即在英文操作系统中存储中文数据,在中文操作系统中存储日文数据。 2. Oracle核心字符集设置 在Oracle数据库中,核心字符集...

    理解Oracle数据库字符集

    Oracle数据库字符集是其全球化支持(Globalization Support)的核心组成部分,也称为国家语言支持(NLS),目的是...在Oracle中,数据库字符集在创建后一般不建议更改,因此在数据库设计初期就应充分考虑字符集的选择。

    mysql数据库互相转换及同步工具-MySQL_MySQL字符集互转

    3. **MySQL数据库同步**:数据库同步是为了保持多个数据库实例间的数据一致性,这在分布式系统、灾备恢复、多数据中心部署等场景下尤为重要。MySQL提供了如Replication、Federated Engine等技术实现数据同步。 4. *...

    理解ORACLE数据库字符集

    - 数据库字符集是在创建数据库时指定的,一般不建议改动。它分为两部分:字符集和国家字符集。 - 字符集:用于存储CHAR、VARCHAR2、CLOB、LONG等类型的数据,以及表名、列名和PL/SQL变量等标识符。 - 国家字符集:专...

    Oracle字符集转换

    2. **使用CSSCANUtility和CSALTERScript进行字符集转换**:这种方式更为高效,可以在不破坏现有数据的情况下完成字符集的变更。接下来,我们将重点介绍第二种方法的具体实现步骤。 #### 三、字符集转换规则 在进行...

    ORACLE字符集浅析——异种字符集数据库间的数据存取方法探讨.pdf

    Oracle字符集是数据库管理系统Oracle中的一个关键概念,用于定义数据的编码方式,使得数据库能够存储和处理各种语言的字符。本文主要探讨了在不同字符集的Oracle数据库间如何有效地进行数据存取。Oracle的全球化支持...

    MySQL数据库字符集的问题研究.pdf

    ### MySQL数据库字符集的问题研究 #### 一、MySQL字符集概述 MySQL数据库是瑞典MySQL AB公司开发的一款小型关系型数据库管理系统,因其速度快、易用性好、支持SQL、网络支持性好、可移植性好及费用低廉等特点,在...

    oracle英文字符集插入到中文字符集

    在IT领域,数据库管理和数据传输过程中,字符集的匹配至关重要,尤其当涉及到...通过深入理解字符集的工作原理,结合适当的编程技巧和数据库特性,可以有效地解决因字符集不匹配引发的问题,确保数据的完整性和一致性。

    设置环境变量修改Oracle客户端字符集.pdf

    如果两个数据库的字符集不同,数据交换时可能会出现字符集转换问题。 三、解决方法 为了解决这个问题,可以通过设置环境变量来修改客户端字符集。具体来说,就是设置环境变量NLS_LANG来指定客户端字符集。例如,...

    Oracle数据库字符集问题总结

    在不同数据库做数据迁移、同其它系统交换数据等,常常因为字符集不同而导致迁移失败或数据库内数据变成乱码。现将oracle字符集相关的一些知识做了个简单总结

    jdbc连接oracle字符集不同出现乱码

    这种情况通常发生在远程 Oracle 数据库与本地 Oracle 数据库的字符集设置不一致的情况下。 在本案例中,远程 Oracle 数据库使用的字符集为 `AMERICAN_AMERICA.US7ASCII`,而本地 Oracle 数据库使用的字符集为 `...

Global site tag (gtag.js) - Google Analytics