使用JDBC向Kudu表插入中文数据乱码(转载)
参考:https://cloud.tencent.com/developer/article/1077763
问题描述
使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文字符串被截断。
此文档描述使用jdbc的PreparedStatement方式插入中文字符串乱码问题。
1、使用ImpalaJDBC代码进行测试,测试代码
- staticString JDBC_DRIVER ="com.cloudera.impala.jdbc41.Driver";
- static String CONNECTION_URL ="jdbc:impala://ip-172-31-10-118:21050/default";
- public static void main(String[] args) {
- Connection con = null;
- ResultSetrs = null;
- PreparedStatementps = null;
- try {
- Class.forName(JDBC_DRIVER);
- con =DriverManager.getConnection(CONNECTION_URL);
- Stringsql2 = "insert into my_first_table values(?, ?)";
- ps =con.prepareStatement(sql2);
- ps.setInt(1,81);
- ps.setString(2,"测试中文字符");
- ps.execute();
- ps.close();
- ps =con.prepareStatement("select * from my_first_table order byid asc");
- rs = ps.executeQuery();
- while (rs.next()){
- System.out.println(rs.getLong(1)+ "\t" +rs.getString(2));
- }
- } catch (Exceptione) {
- e.printStackTrace();
- } finally{
- try {// 关闭rs、ps和con
- rs.close();
- ps.close();
- con.close();
- } catch(SQLException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- }
- }
2、向Kudu表中分别插入测试数据,如“测试”,“测试中文”,“测试中文字符”
- String sql2 = "insert into my_first_table values(?, ?)";
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 73);
- ps.setString(2, "测试");
- ps.execute();
- ps.close();
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 74);
- ps.setString(2, "测试中文");
- ps.execute();
- ps.close();
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 75);
- ps.setString(2, "测试中文字符");
- ps.execute();
- ps.close();
通过查询kudu数据库如下:
中文字符全部乱码,部分乱码,字符串被截断问题重现。
3、解决方法
修改程序中插入语句,将插入字符串列使用cast函数转成String类型
- String sql2 = "insert into my_first_table values(?, cast(? as string))";
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 60);
- ps.setString(2, "测试中文字符");
- ps.execute();
- ps.close();
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 61);
- ps.setString(2, "测试中文");
- ps.execute();
- ps.close();
- ps = con.prepareStatement(sql2);
- ps.setInt(1, 62);
- ps.setString(2, "测试");
- ps.execute();
- 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插入中文字符串正常
- [172.31.10.118:21000] > insert into my_first_table values(66,'插入中文字符');
- Modified 1 row(s), 0 row error(s) in 0.11s
- [172.31.10.118:21000] > select * from my_first_table where id=66;
- +----+--------------+
- | id | name |
- +----+--------------+
- | 66 | 插入中文字符 |
- +----+--------------+
- Fetched 1 row(s) in 0.21s
- [172.31.10.118:21000] >
- [172.31.10.118:21000] > insert into my_first_table values(77, "测试中文字符");
- Modified 1 row(s), 0 row error(s) in 0.11s
- [172.31.10.118:21000] > select * from my_first_table where id=77;
- +----+--------------+
- | id | name |
- +----+--------------+
- | 77 | 测试中文字符 |
- +----+--------------+
- Fetched 1 row(s) in 0.18s
- [172.31.10.118:21000] >
使用JDBC向Kudu表插入中文数据乱码(转载)的更多相关文章
- mariadb插入中文数据乱码解决过程
基本情况: 系统:centos 7 mariadb安装方式:yum 乱码解决过程: 查看当前数据库编码(登录数据库后) # show variables like 'character%'; (上图为 ...
- MySQL 插入 中文数据乱码解决
问题描述: 1.在命令行中进行插入,没有问题.但是显示存在部分乱码 2.在JDBC中插入成功.中文是直接以“??”形式显示. 通过Navicat客户端查看 与在网页中看到的一一致,说明读取没有问题,问 ...
- java web 向数据库插入中文数据乱码问题
一.先检查下是 页面返回数据时已经乱码了,还是在插入数据库的时候乱的码. 二.页面返回乱码: 1. Web.XML 文件配置 <!-- 配置编码过滤器 --> <filter&g ...
- Hibernate向MySQL插入中文数据--乱码解决
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/exam?useUnicod ...
- Oracle插入中文数据乱码 设置服务器编码和客户端编码一致
- mysql不能插入中文数据
上次遇到的是向mysql插入中文数据,中文数据乱码了.这次直接就不能插入中文数据了!!!! 参考博文:http://blog.csdn.net/generalyy0/article/details/7 ...
- MySQL插入中文数据出现?号
原文转载自:https://blog.csdn.net/LynneZoe/article/details/79174119 运行环境:win10 mysql版本:Mysql5.6 做一个项目的时候,向 ...
- 解决Python向MySQL数据库插入中文数据时出现乱码
解决Python向MySQL数据库插入中文数据时出现乱码 先在MySQL命令行中输入如下语句查看结果: 只要character_set_client character_set_database ch ...
- mysql插入中文数据变成问号怎么处理
插入中文数据变成问号,一般都是因为字符集没有设置成utf8的原因 1.修改字符集: ALTER TABLE 表名 MODIFY 列名 类型(50) CHARACTER SET "utf8&q ...
随机推荐
- Linux与Windows远程互访(使用Rdesktop与SSH)
工作的时候经常使用Redhat系列系统,而平常娱乐文档都是在windows平台上进行.因此实现linux与windows远程互访也是很有必要的事情. 本文将介绍如何实现Linux与Windows的远程 ...
- 关于dubbo服务的xml配置文件报错的问题
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...
- 新浪微博基于MySQL的分布式数据库实践
提起微博,相信大家都是很了解的.但是有谁知道微博的数据库架构是怎样的呢?在今天举行的2011数据库技术大会上,新浪首席DBA杨海潮为我们详细解读了新浪微博的数据库架构——基于MySQL的分布式数据库实 ...
- 读写文件:每次读入大文件里的一行、读写.CSV文件
读文件: 传统的读法.所有读出,按行处理: fp=open("./ps.txt", "r"); alllines=fp.readlines(); fp.clos ...
- ORA-00600: [kck_rls_check must use (11,0,0,0,0) or lower] 故障解决
一朋友在QQ上问我,说他数据库的pfile 和spfile 都不见了.我问他数据库是10g还是11g的,他说11g,所以我就让他用这个语法来创建spfile了: SQL> create spfi ...
- hdu1716排列2(stl:next_permutation+优先队列)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 分享一段ios数据库代码,包括对表的创建、升级、增删查改
分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...
- adb install -r 中出现INSTALL_FAILED_UNKNOWN_SOURCES,怎样解决?
adb install -r 中出现INSTALL_FAILED_UNKNOWN_SOURCES,怎样解决? D:\android_code\0708\tools>adb install -r ...
- cocos2d-x 输出debug信息
cocos2d-x 输出debug信息 在Classes目录下添加文件AppDef.h #ifndef _APP_DEF_H_#define _APP_DEF_H_ #include <an ...
- Java 如何实现在线预览文档及修改(文本文件)
暂时未解决的问题:多用户并发修改一个文件 测试地址: http://sms.reyo.cn 用户名:aa 密码:123456