解决MySQL数据库数据导出乱码问题_huanggang028的博客-程序员ITS203

技术标签: mysql  

       最近在做MySQL数据导出到HBase中的任务,刚开始以为很简单,但后来发现坑比较多。主要是由于历史原因存在着不同的字符集格式。为了能为后面数据分析提供基础,需要对导出的数据统一编码成UTF-8

      采用jdbc方式读取数据,连接字符串设置编码格式utf-8,查询数据前首先需要执行下executeQuery("set names utf8"); 对于一次查询请求,信息输入路径:client→connection→server;信息输出路径:server→connection→results。换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入 results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的, 破坏性的。

      我所接触到的遗留库主要是latin1和utf-8两种字符集的, 需要根据情况进行转码。既可以根据表的TABLE_COLLATION来断定(如select TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION, ENGINE from tables where TABLE_SCHEMA = "haitao" and table_name = "haitao_user_biz_deal_withdrawals), 如果是utf8_general_ci 的无需处理,如果是latin1_swedish_ci,则按照如下方式来处理:

sql 的latin1 不等于标准的latin1(iso-8859-1) 和cp1252,比iso-8859-1多了0x80-0x9f字符,比cp1252多了0x81,0x8d,0x8f,0x90,0x9d 一共5个字符。
这样在Java中,如果使用标准的iso-8859-1或者cp1252解码可能出现乱码。
s.getBytes("iso-8859-1") 或者 s.getBytes("cp1252");


写了一段代码来解决这个问题
private String convertCharset(String s){
        if(s!=null){
            try {
                int length = s.length();
                byte[] buffer = new byte[length];
                //0x81 to Unicode 0x0081, 0x8d to 0x008d, 0x8f to 0x008f, 0x90 to 0x0090, and 0x9d to 0x009d.
                for(int i=0;i<length;++i){
                    char c = s.charAt(i);
                    if(c==0x0081){
                        buffer[i]=(byte)0x81;
                    }
                    else if(c==0x008d){
                        buffer[i]=(byte)0x8d;
                    }
                    else if(c==0x008f){
                        buffer[i]=(byte)0x8f;
                    }
                    else if(c==0x0090){
                        buffer[i]=(byte)0x90;
                    }
                    else if(c==0x009d){
                        buffer[i]=(byte)0x9d;
                    }
                    else{
                        buffer[i] = Character.toString(c).getBytes("cp1252")[0];
                    }
                }
                String result = new String(buffer,"utf-8");
                return result;
            } catch (UnsupportedEncodingException e) {
                logger.error("charset convert error", e);
            }
        }
        return null;
    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huanggang028/article/details/39055377

智能推荐

Mysql的分区partition关于reorganize演示_zwmonk的博客-程序员ITS203_reorganize partition

我们一般业务用于展示层喜欢用mysql存储,这不可避免我们需要建立mysql分区表。建表:DROP TABLE IF EXISTS people;CREATE TABLE IF NOT EXISTS people (name varchar(20) DEFAULT NULL,address varchar(30) DEFAULT NULL,id int(11) NOT NULL...

布局优化工具Hierarchy Viewer_啊sir_的博客-程序员ITS203_hierarchy viewer

版权声明:本文为博主原创或汇集文章,欢迎注明来源转载。http://blog.csdn.net/u012792686 https://blog.csdn.net/u012792686/article/details/72921379 ...

Visual Studio Code 配置runcode_zheng2263的博客-程序员ITS203_viso studio run code

简介:Vscode runcode插件支持运行C, C++, Java, JS, PHP, Python, Perl, Ruby, Go, Lua, Groovy, PowerShell, CMD, BASH, F#, C#, VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml, R, AppleScrip...

jquery mouseleave和mouseout的区别_fancybit的博客-程序员ITS203

今天做一个下拉菜单的效果,发现用mouseout事件判断鼠标是否移出菜单让菜单消失的判断有很大问题。第一是鼠标移动到了元素的margin border padding区域的时候会触发mouseout。第二是子元素上鼠标移开也会让父元素触发mouseout。这就导致鼠标在进入下拉菜单和在菜单元素之间移动的时候触发大量的mouseout,菜单总是消失。改为使用mouseleave事件以后问题消失,说明mouseleave既会把margin border padding视为组件内部,也不会反复的在

Node.js是什么?有什么优缺点呢?_WJH95-的博客-程序员ITS203

众所周知,Node.js虽然已经出来很多年了,但是在现在依然还是很火的,那究竟是什么原因呢?今天小编查阅了一些资料,整理出了一些Node.js的相关信息,分享给大家。Node.js是什么先来看看百度的解释,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。也就是说javaScript可以脱离浏览器在Node.js的环境下运行。 Node.js 使用了一个...

随便推点

nginx 重启_蚂蚁小草的博客-程序员ITS203

Centos nginx重启service nginx restart/etc/init.d/nginx stop/etc/init.d/nginx startUbuntu nginx重启$sudo service nginx start$sudo service nginx stop

Express项目案列(零):HelloWord项目_chuangqudiao9845的博客-程序员ITS203

安装Expressnpm install -g express-generator新版需要安装generator命令行工具旧版的安装命令是npm install -g express创建项目express helloword cd hellowordnpm instal...

Thinkpad常见问题大全(转载联想工程师博客)_xfxf996的博客-程序员ITS203

想要收藏本篇文章请下载Word版 Q:我想升级成VISTA,想问一下,升级之后一键恢复是恢复到XP还是VISTA?A:如果从隐含分区恢复出厂设置,那当然是恢复到出厂时预装的系统;如果是用R&amp;amp

IOS底层原理之动态转发流程_MissHector的博客-程序员ITS203

前言在上一篇文章中,我们讲述了快速查找流程,接着向下探究一、instrumentObjcMessageSends辅助分析方法的介绍作用: 可以打印出指定区域内调用的所有的方法@interface MHPerson : NSObject{ NSString * newName; NSObject * objc;}@property(nonatomic,strong)NSString * hobby;@property(nonatomic, copy)NSString * n

AVL树的实现_walsfy168的博客-程序员ITS203

#ifndef AVL_Tree_H#define AVL_Tree_Htypedef int ElemenType;struct AvlNode;typedef struct AvlNode *Position;typedef Position AvlTree;class AvlTree_{public: AvlTree_(); ~AvlTree_(); //Posit

Extjs 模块化动态加载js实践_davidxj的博客-程序员ITS203

<br />当点击菜单树的节点时调用:<br /> Js代码 function openGetBugsPanel(name) {       var moduleId = 'BugList_tab';       //一个静态方法,表示从一个js载入了一个新的模块       Ext.ux.yiminghe.framework.core.newModule(       {           //模块的id                moduleId: moduleId,           //在哪

推荐文章

热门文章

相关标签