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

完美解决Kettle导数据库产生的中文乱码

 
阅读更多

    如果公司内一开始没有好好规划数据库建设,那么后期可能存在多种字符集的数据库实例。在做数据仓库或者来回导数据的时候,因字符集导致中文乱码问题困扰着不少人。网上有很多前辈们总结的解决中文乱码的方案,关于使用kettle如何解决也有一两篇谈到在建数据库连接时加characterEncoding来解决。我昨晚找到另外一种方式来跟大家分享:

 

经过对源码搜索”encoding“,找一句注释,发现其实解决方法很简单,

	/**
	 * Build the row using ResultSetMetaData rsmd
     * @param rm The resultset metadata to inquire
     * @param ignoreLength true if you want to ignore the length (workaround for MySQL bug/problem)
     * @param lazyConversion true if lazy conversion needs to be enabled where possible
	 */
	private RowMetaInterface getRowInfo(ResultSetMetaData rm, boolean ignoreLength, boolean lazyConversion) throws KettleDatabaseException
	{
        if (rm==null) return null;
		
		rowMeta = new RowMeta();
		
		try
		{
			// TODO If we do lazy conversion, we need to find out about the encoding
			//
            int fieldNr = 1;
			int nrcols=rm.getColumnCount();	
			for (int i=1;i<=nrcols;i++)
			{
				String name=new String(rm.getColumnName(i));
                
                // Check the name, sometimes it's empty.
                //
                if (Const.isEmpty(name) || Const.onlySpaces(name))
                {
                    name = "Field"+fieldNr;
                    fieldNr++;
                }
                
				ValueMetaInterface v = getValueFromSQLType(name, rm, i, ignoreLength, lazyConversion);
				rowMeta.addValueMeta(v);			
			}
			return rowMeta;
		}
		catch(SQLException ex)
		{
			throw new KettleDatabaseException("Error getting row information from database: ", ex);
		}
	}

 就是这样”If we do lazy conversion, we need to find out about the encoding“,直接勾选”允许延迟转换“即可:

这样在从数据库读取的数据就能保持原有字符集,不因默认强制使用utf8导致乱码,在输出时指定文件字符集,就会解决导出到文件中的乱码问题。

如果导入到目标表的字符集与源表不同,需要在入库前用select values做字符转换(纯属废话,相同就不会有乱码了):

 

整个流程如下

这样,无论到文件还是目标表,都不会再有乱码了。

 

 

如果以上还无法解决,可以在Table Input 和Table Output的数据库连接高级选项中设置当前session的字符集;以下除了可以设置session 的字符集,还可以设置日期格式等。

 

通过以上设置还无法解决,只能归结为RP不好了O(∩_∩)O~

  • 大小: 3.4 KB
  • 大小: 29.4 KB
  • 大小: 10.4 KB
  • 大小: 23.6 KB
分享到:
评论
5 楼 flyqantas 2014-12-09  
我们现在也遇到这个问题了、
4 楼 vase 2014-12-08  
olfisher 写道
您好,我现在就是朋友这个问题
A库是GBK,B库是西文的,从A库数据抽取到B库,乱码,数据库是oracle,查看客户端工具是PLSQL,若看到请指导下,谢谢。QQ:247287878

如果不是windows平台上产生乱码,在spoon.bat/sh 中增加 -Dfile.encoding=GBK,然后按上文所说那样,在入库时设置目标字符集,即可解决你的问题。建议先在windows系统上单独设置入库字符集试试
3 楼 olfisher 2014-12-05  
您好,我现在就是朋友这个问题
A库是GBK,B库是西文的,从A库数据抽取到B库,乱码,数据库是oracle,查看客户端工具是PLSQL,若看到请指导下,谢谢。QQ:247287878
2 楼 ainidehsj 2013-12-03  
不错,顶一个。
1 楼 vase 2012-12-21  
看有人有时会需要,我就再补一句吧
有时在Option里增加连接参数 characterEncoding=UTF-8 也是解决像Mysql这种数据库乱码的方法之一,另外还可以在spoon.bat/sh 的启动脚本中增加启动参数,指定JVM使用相应字符集,如增加 -Dfile.encoding=UTF-8
具体哪种合适,还得靠多试试。

相关推荐

    Kettle所有数据库数据库连接驱动Jar

    在IT领域,数据库连接是数据集成过程中的关键环节,特别是在使用工具如Kettle(也称为Pentaho Data Integration,简称PDI)时。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于从各种数据源抽取数据,...

    kettle 7.1数据库连接驱动包

    本文将围绕"Kettle 7.1数据库连接驱动包"这一主题,深入探讨其关键知识点,以解决实际操作中可能遇到的问题。 一、驱动包的重要性 1. 数据库连接的核心:数据库连接驱动包是Kettle与各种数据库进行通信的桥梁,它...

    神通数据库的Kettle数据库插件

    神通数据库的Kettle数据库插件是专为解决Kettle工具在处理神通数据库时的兼容性问题而设计的扩展。Kettle,又称Pentaho Data Integration(PDI),是一款强大的ETL(提取、转换、加载)工具,广泛应用于数据集成与...

    Kettle推送数据到Mysql数据库表时乱码.docx

    Kettle 推送数据到 Mysql 数据库表时乱码解决方案 Kettle 是一个功能强大且流行的数据集成工具,广泛应用于数据抽取、转换和加载(ETL)过程中。然而,在使用 Kettle 将数据推送到 Mysql 数据库表时,可能会出现...

    Kettle常用数据库连接驱动

    它提供了一个轻量级的解决方案,允许Kettle连接到SQL Server数据库,进行数据操作。 综上所述,这些驱动文件对于Kettle用户来说至关重要,因为它们确保了Kettle能够无缝地与Oracle、MySQL和SQL Server等主流数据库...

    kettle同步数据库所有的表数据到其他库.rar

    本示例中的"Kettle同步数据库所有的表数据到其他库.rar"是一个具体的应用场景,即利用Kettle将一个数据库的所有表数据同步到另一个具有相同表结构的数据库中。这里,我们不仅讨论如何实现这个功能,还将深入探讨...

    KETTLE常用数据库的JAR包

    在IT行业中,数据库是数据管理和存储的核心工具,而Kettle(又称Pentaho Data Integration,简称PDI)是一款强大的ETL(Extract, Transform, Load)工具,用于在不同数据源之间进行数据迁移、清洗和转换。Kettle支持...

    使用kettle同步数据库表至其他库

    使用kettle同步数据库表。网上找教程找了一天。终于弄好了。将两个数据库连接改成你自己的。sql也要改,然后把后面步骤的字段重新获取一下。然后就可以同步数据了。数据来源表增删改都可以同步。参考一下吧

    kettle8.3数据库资源库表数据字典.xlsx

    kettle8.3数据库资源库表数据字典.xlsx

    kettle连接数据库相关jar包

    "kettle连接数据库相关jar包"指的是为了使Kettle能与不同类型的数据库建立连接,需要引入特定的数据库驱动JAR文件。这些JAR文件包含了数据库供应商提供的API,使得Kettle可以理解和执行SQL语句,从而读取或写入数据...

    KETTLE 发送邮件乱码修正

    我当前调试的是kettle 5.4.0.1版本,修复job中发送邮件时候中文乱码问题: 替换 data-integration\lib\kettle-engine-5.4.0.1-130.jar 这个jar包下 data-integration\lib\kettle-engine-5.4.0.1-130.jar\org\...

    kettle连接需要的常用数据库jar包.zip

    2. Oracle:Oracle是企业级的数据库解决方案,支持大规模的数据处理。Oracle的JDBC驱动分为thin和thick两种模式,其中thin模式更常见,对应的JAR文件可能是`ojdbc6.jar`或`ojdbc8.jar`。配置Oracle连接时,需要填写...

    kettle 各种数据库之间数据导出导入

    kettle 各种数据库之间数据导出导入

    kettle数据库驱动包.zip

    这个“kettle数据库驱动包.zip”文件显然是为Kettle准备的,包含了对多种主流数据库系统的驱动支持,包括MySQL、Oracle和DB2。这些驱动程序是连接到特定数据库所必需的组件,因为它们使得Kettle能够理解和通信与这些...

    Kettle简单参数化配置连接数据库

    本教程将详细介绍如何在Kettle中进行简单的参数化配置来连接数据库,以及如何通过Shell脚本来传递参数并调度Kettle作业。 首先,我们来看“Kettle简单参数化配置连接数据库”。在Kettle中,数据库连接通常需要提供...

    KETTLE使用中用到的常见数据库驱动包

    在使用kettle时,如果没有放入驱动包,...这时我们只需要把所对应数据库的驱动放入到kettle目录下的lib目录中,重新打开就可以解决。 这个压缩包里包括Oracle、MySQL、SQLserver、达梦的驱动包,一般是足够用了。

    kettle批量数据库操作流程脚本

    在"Kettle批量数据库操作流程脚本"中,我们主要讨论的是如何利用Kettle进行多源数据抽取并整合到单一目标数据库的过程。这个过程通常涉及到以下几个关键步骤: 1. **数据源定义**:在Kettle中,数据源可以是各种...

    【Kettle】数据库数据转移工具

    【Kettle】数据库数据转移工具 Kettle,也被称为Pentaho Data Integration(PDI),是一种强大的ETL(Extract, Transform, Load)工具,用于在不同的数据源之间进行数据迁移、清洗和转换。它由社区驱动,是Pentaho ...

    kettle常用的数据库驱动脚本

    本资源包"Kettle常用的数据库驱动脚本"包含了Kettle连接到不同数据库所需的驱动,包括Oracle、MySQL、SQL Server和Access。理解这些驱动及其使用方法对于有效利用Kettle进行数据操作至关重要。 首先,让我们逐一...

    kettle 连接 clickhouse数据库

    总的来说,Kettle连接ClickHouse是一种强大的数据处理解决方案,它结合了Kettle的ETL功能和ClickHouse的高性能分析能力,为大数据处理提供了便利。在实践中,不断学习和优化这些工具的使用,能够极大地提升数据工作...

Global site tag (gtag.js) - Google Analytics