0020-使用JDBC向Kudu表插入中文字符-双引号的秘密

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

1.问题描述

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

2.问题复现

测试环境:

  • CDH5.12.0
  • Kudu1.4.0
  • ImpalaJDBC41_2.5.35

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

static String 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;
 ResultSet rs = null;
 PreparedStatement ps = null;

    try {
        Class.forName(JDBC_DRIVER);
 con = DriverManager.getConnection(CONNECTION_URL);
 String insertsql = "insertinto my_first_table values(46, ‘测试中文字符‘)";

 ps = con.prepareStatement(insertsql);
 ps.execute();
 ps.close();

 ps = con.prepareStatement("select* from my_first_table order by id asc");
 rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getLong(1) + "\t" +rs.getString(2));
 }

    } catch (Exception e) {
        e.printStackTrace();
 } finally {
 try { // 关闭rs、ps和con
 rs.close();
 ps.close();
 con.close();
 } catch (SQLException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

    }
}

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

String insertsql = "insert into my_first_table values(44, ‘测试‘)";
String insertsql = "insert into my_first_table values(45, ‘测试中文‘)";
String insertsql = "insert into my_first_table values(46, ‘测试中文字符‘)";

如下是按测试顺序插入的数据

通过以上操作重现问题。

3.解决方法

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

String insertsql = "insert into my_first_table values(51, \"测试中文字符\")";
String insertsql = "insert into my_first_table values(52, \"测试中文\")";
String insertsql = "insert into my_first_table values(53, \"测试\")";

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

使用Hue查询显示如下:

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

4.备注

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] > 

醉酒鞭名马,少年多浮夸! 岭南浣溪沙,呕吐酒肆下!挚友不肯放,数据玩的花!

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

欢迎关注Hadoop实操,第一时间,分享更多Hadoop干货,喜欢请关注分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

原文地址:http://blog.51cto.com/14049791/2319086

时间: 2024-10-10 02:06:12

0020-使用JDBC向Kudu表插入中文字符-双引号的秘密的相关文章

java中向Mysql插入中文字符出现乱码

昨天新建了个Mysql数据库表,在JAVA中插入中文字符时,发现数据库中的插入结果是乱码.实际是字符集不符合问题. 针对这个问题的解决方法有很多,例如这个文章java与mysql乱码的问题不过我建议将表删掉重新建表,建表时默认字符集设置为UTF-8,这样可以避免以后出现各种问题. 可以通过语句show create table table_name来查看该表的编码格式.例如我的是: CREATE TABLE `blog` ( `title` varchar(30) NOT NULL DEFAUL

解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: ‘\xE5\xB0\x8F\xE6\x98\x8E‘ for column ‘name‘ at row 1

原文:解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1 报错内容: mysql> insert into person values (1,22,'小明');ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for colum

myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)

出现这个问题有以下三步解决思路: 1. 检查myeclipse的编码格式 windows---->Preferences---->general---->Workspace,右侧窗口Text file encoding,选择Other,改变为UTF-8. 此时刷新项目,看能否正常写入中文字符. 2. 检查数据库的编码格式 我用sqlyog连接的数据库,先在询问窗口查询一下编码格式: SHOW VARIABLES LIKE 'character_set_%';结果如下: 检查图中的几项是否

postgreSQL 创建user表时引发的表名大写与双引号问题

在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号""来括住大写的表名而已,没错! 当我用""括住大写的表名的时候,问题解决了! 如图: 但是,事情还没完! 如果我不是创建user表,而是其他的,如Useless表呢? 如图: 会看到Useless表是可以创建的,只不过这里表名被自动转换为了小写. 这里应该是遵循了标准SQL的规定. 如果我

mysql无法插入中文字符解决

1. 基于可维护的角度,虽然latin1没什么问题,但是还是尽量换成utf8或者gb系列 2. 出现乱码时: SHOW VARIABLES LIKE 'character%'SHOW VARIABLES LIKE 'collation_%'; set character_set_XXX  = utf8 //修改编码 a.要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致:b.要保证通讯的字符集与数据库的字符集一致,即character_set_c

Navicat 数据库 表插入数据含有中文无法保存怎么办?看完这篇可以少郁闷几分钟!

下午在数据库新建表,插入了几条记录,发现插入中文保存不了,后来发现是数据库编码有问题. 保存时出现这种情况. 后来查询原因是编码有问题,改了表的数据库编码为utf-8保存,插入中文字符依旧保存不了. 后来发现是表字段没有设置成utf-8,没有跟表字符集保持一致造成的. 改完记得保存.然后就可以快乐地插入中文字符了. 原文地址:https://www.cnblogs.com/jamal/p/12369504.html

jdbc连接mysql 时的中文乱码问题解决

在用 jdbc 向 mysql 数据库插入中文时出现了乱码,严格来说是通过 Hibernate.记录下搜索和查文档以后找到的解决办法. 首先要告诉数据库要插入的字符串使用的字符集,mysql 默认使用的字符集是 latin1.我要保存的字符串是 UTF-8 编码的(字符集是 Unicode),所以包含这个字段的表应该使用 UTF-8 编码.这里有几种解决办法. 在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码.如 create database f

mysql 插入中文时出现ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern ame' at row 1

1 环境: MySQL Server 6.0  命令行工具 2 问题 :  插入中文字符数据出现如下错误: ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern ame' at row 1 3 当时环境: mysql> insert into user(id , username , birthday, sex, address) values('2' , ' 李四' , '1980 12

Fastdb 之中文字符截取错误的问题

Fastdb C#版本中,如果定义字段类型为  CLI.FieldType.cli_asciiz,使用的过程中插入中文字符集会出现乱码的情况, 追查code发现是在对字符串缓冲区CopyBufferData的过程中直接fastdb直接使用了s.length获取了字符个数,而不是获取字节数,由于中文占位两个字节,所以导致数据copy不全,从而出现乱码. 不多说,修正代码如下: protected int bytelengh(string str) { //使用Unicode编码的方式将字符串转换为