使用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 ...
随机推荐
- Java之多线程 Atomic(原子的)
一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic是指不能分割成若干部分的意思.如果一段代码被认为是Atomic,则表示这段代码在执行过程中 ...
- Docker系列之(五):使用Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- DELPHI - How to use opendialog1 for choosing a folder? TOpenDialog, TFileOpenDialog
DELPHI - How to use opendialog1 for choosing a folder? On Vista and up you can show a more modern lo ...
- C#Winform将WebBowser控件替换为Chrome内核
摘要 由于最近要做一个浏览器式的软件,其中有不少地方需要使用到jQuery和BootStrap,但是在C#中,默认的WebBrowser控件默认使用的是IE的core,而低版本的IE在JS加载上总是容 ...
- asp.net MVC 中 Session统一验证的方法
验证登录状态的方法有:1 进程外Session 2 方法过滤器(建一个类继承ActionFilterAttribute)然后给需要验证的方法或控制器加特性标签 3 :新建一个BaseContro ...
- Cygwin、MinGw、mingw-w64,MSys msys2区别与联系
https://www.biaodianfu.com/cygwin-ming-msys.html http://www.mingw-w64.org/doku.php http://blog.csdn. ...
- error: internal error: unable to execute QEMU command 'migrate': this feature or command is not cur
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限.错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- MongoDB 安装 Windows XP
〇. 一个提供MonogoDB丰富资料的中文网站 http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html 一. http://www ...
- 使用 MVVMLight 命令绑定(转)
继上一篇文章的项目,我们实现了数据绑定到界面中.这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用. 首先我们要实现的目标是,在界 ...
- 架构:The Clean Architecture(整洁的架构)(转载)
地址:http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html. Over the last several ...