参考:https://cloud.tencent.com/developer/article/1077763

  问题描述

    使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文字符串被截断。

    此文档描述使用jdbc的PreparedStatement方式插入中文字符串乱码问题。

    1、使用ImpalaJDBC代码进行测试,测试代码

  1. staticString JDBC_DRIVER ="com.cloudera.impala.jdbc41.Driver";
  2. static String CONNECTION_URL ="jdbc:impala://ip-172-31-10-118:21050/default";
  3.  
  4. public static void main(String[] args) {
  5. Connection con = null;
  6. ResultSetrs = null;
  7. PreparedStatementps = null;
  8.  
  9. try {
  10. Class.forName(JDBC_DRIVER);
  11. con =DriverManager.getConnection(CONNECTION_URL);
  12.  
  13. Stringsql2 = "insert into my_first_table values(?, ?)";
  14. ps =con.prepareStatement(sql2);
  15. ps.setInt(1,81);
  16. ps.setString(2,"测试中文字符");
  17. ps.execute();
  18. ps.close();
  19.  
  20. ps =con.prepareStatement("select * from my_first_table order byid asc");
  21. rs = ps.executeQuery();
  22. while (rs.next()){
  23. System.out.println(rs.getLong(1)+ "\t" +rs.getString(2));
  24. }
  25.  
  26. } catch (Exceptione) {
  27. e.printStackTrace();
  28. } finally{
  29. try {// 关闭rs、ps和con
  30. rs.close();
  31. ps.close();
  32. con.close();
  33. } catch(SQLException e) {
  34. // TODOAuto-generated catch block
  35. e.printStackTrace();
  36. }
  37.  
  38. }
  39. }

    2、向Kudu表中分别插入测试数据,如“测试”,“测试中文”,“测试中文字符”

  1. String sql2 = "insert into my_first_table values(?, ?)";
  2. ps = con.prepareStatement(sql2);
  3. ps.setInt(1, 73);
  4. ps.setString(2, "测试");
  5. ps.execute();
  6. ps.close();
  7.  
  8. ps = con.prepareStatement(sql2);
  9. ps.setInt(1, 74);
  10. ps.setString(2, "测试中文");
  11. ps.execute();
  12. ps.close();
  13.  
  14. ps = con.prepareStatement(sql2);
  15. ps.setInt(1, 75);
  16. ps.setString(2, "测试中文字符");
  17. ps.execute();
  18. ps.close();

  通过查询kudu数据库如下:

  

  中文字符全部乱码,部分乱码,字符串被截断问题重现。

  3、解决方法

    修改程序中插入语句,将插入字符串列使用cast函数转成String类型

  1. String sql2 = "insert into my_first_table values(?, cast(? as string))";
  2. ps = con.prepareStatement(sql2);
  3. ps.setInt(1, 60);
  4. ps.setString(2, "测试中文字符");
  5. ps.execute();
  6. ps.close();
  7.  
  8. ps = con.prepareStatement(sql2);
  9. ps.setInt(1, 61);
  10. ps.setString(2, "测试中文");
  11. ps.execute();
  12. ps.close();
  13.  
  14. ps = con.prepareStatement(sql2);
  15. ps.setInt(1, 62);
  16. ps.setString(2, "测试");
  17. ps.execute();
  18. ps.close();

  

  修改后重新向Kudu中插入测试数据:“测试中文字符”,“测试中文”,“测试”

  使用Hue查询显示如下:

  

  中文字符串插入Kudu显示正常。

   另一种情况

    1、向Kudu表中分别插入测试数据,如“测试”,“测试中文”,“测试中文字符”

    

    

  2、解决办法

    修改程序中插入语句,将插入字符串的单引号修改为双引号

    

    

    修改后重新向Kudu中插入测试数据:“测试中文字符”,“测试中文”,“测试”

    使用Hue查询显示如下:

    

  

    备注

    1.使用Cloudera官网最新的JDBC驱动,插入中文字符时也有上述问题

    下载地址:https://downloads.cloudera.com/connectors/impala_jdbc_2.5.38.1058.zip

    2.通过Impala-shell插入中文字符串正常

  1.     [172.31.10.118:21000] > insert into my_first_table values(66,'插入中文字符');
  2.     Modified 1 row(s), 0 row error(s) in 0.11s
  3.     [172.31.10.118:21000] > select * from my_first_table where id=66;
  4.     +----+--------------+
  5.     | id | name |
  6.     +----+--------------+
  7.     | 66 | 插入中文字符 |
  8.     +----+--------------+
  9.     Fetched 1 row(s) in 0.21s
  10.     [172.31.10.118:21000] >
  11.  
  12.     [172.31.10.118:21000] > insert into my_first_table values(77, "测试中文字符");
  13.     Modified 1 row(s), 0 row error(s) in 0.11s
  14.     [172.31.10.118:21000] > select * from my_first_table where id=77;
  15.     +----+--------------+
  16.     | id | name |
  17.     +----+--------------+
  18.     | 77 | 测试中文字符 |
  19.     +----+--------------+
  20.     Fetched 1 row(s) in 0.18s
  21.     [172.31.10.118:21000] >

使用JDBC向Kudu表插入中文数据乱码(转载)的更多相关文章

  1. mariadb插入中文数据乱码解决过程

    基本情况: 系统:centos 7 mariadb安装方式:yum 乱码解决过程: 查看当前数据库编码(登录数据库后) # show variables like 'character%'; (上图为 ...

  2. MySQL 插入 中文数据乱码解决

    问题描述: 1.在命令行中进行插入,没有问题.但是显示存在部分乱码 2.在JDBC中插入成功.中文是直接以“??”形式显示. 通过Navicat客户端查看 与在网页中看到的一一致,说明读取没有问题,问 ...

  3. java web 向数据库插入中文数据乱码问题

    一.先检查下是 页面返回数据时已经乱码了,还是在插入数据库的时候乱的码. 二.页面返回乱码: 1.  Web.XML  文件配置 <!-- 配置编码过滤器 --> <filter&g ...

  4. Hibernate向MySQL插入中文数据--乱码解决

    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/exam?useUnicod ...

  5. Oracle插入中文数据乱码 设置服务器编码和客户端编码一致

  6. mysql不能插入中文数据

    上次遇到的是向mysql插入中文数据,中文数据乱码了.这次直接就不能插入中文数据了!!!! 参考博文:http://blog.csdn.net/generalyy0/article/details/7 ...

  7. MySQL插入中文数据出现?号

    原文转载自:https://blog.csdn.net/LynneZoe/article/details/79174119 运行环境:win10 mysql版本:Mysql5.6 做一个项目的时候,向 ...

  8. 解决Python向MySQL数据库插入中文数据时出现乱码

    解决Python向MySQL数据库插入中文数据时出现乱码 先在MySQL命令行中输入如下语句查看结果: 只要character_set_client character_set_database ch ...

  9. mysql插入中文数据变成问号怎么处理

    插入中文数据变成问号,一般都是因为字符集没有设置成utf8的原因 1.修改字符集: ALTER TABLE 表名 MODIFY 列名 类型(50) CHARACTER SET "utf8&q ...

随机推荐

  1. Linux与Windows远程互访(使用Rdesktop与SSH)

    工作的时候经常使用Redhat系列系统,而平常娱乐文档都是在windows平台上进行.因此实现linux与windows远程互访也是很有必要的事情. 本文将介绍如何实现Linux与Windows的远程 ...

  2. 关于dubbo服务的xml配置文件报错的问题

    在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...

  3. 新浪微博基于MySQL的分布式数据库实践

    提起微博,相信大家都是很了解的.但是有谁知道微博的数据库架构是怎样的呢?在今天举行的2011数据库技术大会上,新浪首席DBA杨海潮为我们详细解读了新浪微博的数据库架构——基于MySQL的分布式数据库实 ...

  4. 读写文件:每次读入大文件里的一行、读写.CSV文件

    读文件: 传统的读法.所有读出,按行处理: fp=open("./ps.txt", "r"); alllines=fp.readlines(); fp.clos ...

  5. ORA-00600: [kck_rls_check must use (11,0,0,0,0) or lower] 故障解决

    一朋友在QQ上问我,说他数据库的pfile 和spfile 都不见了.我问他数据库是10g还是11g的,他说11g,所以我就让他用这个语法来创建spfile了: SQL> create spfi ...

  6. hdu1716排列2(stl:next_permutation+优先队列)

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. 分享一段ios数据库代码,包括对表的创建、升级、增删查改

    分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...

  8. adb install -r 中出现INSTALL_FAILED_UNKNOWN_SOURCES,怎样解决?

    adb install -r 中出现INSTALL_FAILED_UNKNOWN_SOURCES,怎样解决? D:\android_code\0708\tools>adb install -r ...

  9. cocos2d-x 输出debug信息

    cocos2d-x 输出debug信息   在Classes目录下添加文件AppDef.h #ifndef _APP_DEF_H_#define _APP_DEF_H_ #include <an ...

  10. Java 如何实现在线预览文档及修改(文本文件)

    暂时未解决的问题:多用户并发修改一个文件 测试地址: http://sms.reyo.cn 用户名:aa 密码:123456