最近发现Kettle的ETL中一直在报错,查看日志发现有些字无法入库,类似以前遇到的数据源与目的数据库字段字符集不同导致的一样;但这个是从游戏接口日志文件读取的,字符集统一都是utf8,不应该是上述情况导致。错误日志如下
INFO 24-12 18:39:44,257 - Column types: string,smallint,string,string,string,string,int,string,string,string,string,string,string,string,string,int ERROR 24-12 18:39:45,281 - Table output - Because of an error, this step can't continue: ERROR 24-12 18:39:45,281 - Table output - org.pentaho.di.core.exception.KettleException: Error batch inserting rows into table [t_oper_mone_first_buy_fact]. Errors encountered (first 10): Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1 Error updating batch Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1 at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:393) at org.pentaho.di.trans.steps.tableoutput.TableOutput.processRow(TableOutput.java:117) at org.pentaho.di.trans.step.RunThread.run(RunThread.java:40) at java.lang.Thread.run(Thread.java:662) Caused by: org.pentaho.di.core.exception.KettleDatabaseBatchException: Error updating batch Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1 at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:309) ... 3 more Caused by: java.sql.BatchUpdateException: Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1 at com.mysql.jdbc.ServerPreparedStatement.executeBatchSerially(ServerPreparedStatement.java:796) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1449) at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:304) ... 3 more
经过在网上查询,\xF0\x9F开头的确实是UTF8字符集范围;UTF8长度是2-4个字节,我们在Mysql常用的是2-3个字节长,但这个抛出来的错误显示是4个字节,所以就错在这了(用java写代码也会报同样错误,原因是jdbc在做数据插入前会严格检查字段的类型、长度,一但不符就会抛出异常;php在这方面稍微自作聪明点,会把多出来的字节截掉,但对数据本身就是丢掉了信息,不适合做数据ETL方面的工作)。
又经过网上查询,有说这种字符属于emoji表情符,关于emoji是什么,点这里有科普 http://baike.baidu.com/view/2631589.htm
找到问题就好办了,将f_char_name字段的字符集改为utf8mb4,在Kettle的数据库连接高级设置中,设置当前会话字符集为utf8mb4,问题解决。
经过这次问题,以后有些字段有必要考虑设置成utf8mb4字符集来支持更广阔的字符内容,缺点显而易见,就是多占地儿了。
是否采用,视具体情况而定吧。
补充:
在web应用中,可在数据源配置中增加配置项来实现
<property name="connectionInitSqls" value="set names utf8mb4;"/>
相关推荐
总结来说,MySQL 5.7.6及更高版本的数据库通过`utf8mb4`字符集支持了emoji,使得开发者可以在数据库中存储和处理丰富的文本信息,增强了用户界面的互动性。这个实例提供了从数据库设置到实际操作的完整流程,对于...
Oracle数据库系统在设计之初并未考虑对Unicode扩展区域的全面支持,因此默认情况下无法直接存储和检索emoji表情。Java作为一种广泛使用的编程语言,可以作为解决这一问题的桥梁。本文将深入探讨如何通过Java解析...
### MySQL数据库字符集的问题研究 #### 一、MySQL字符集概述 MySQL数据库是瑞典MySQL AB公司开发的一款小型关系型数据库管理系统,因其速度快、易用性好、支持SQL、网络支持性好、可移植性好及费用低廉等特点,在...
通用的正则检测工具类,包含用户名 手机号 等 支持检测限制emoji字符表情
因此,在设计与无线互联网相关的MySQL数据库时,推荐采用UTF-8mb4字符集来确保能够妥善处理emoji表情符号,避免出现数据存储或显示上的问题。 #### 限制 使用UTF-8mb4字符集的前提条件包括: - MySQL服务器版本需...
部分emoji表情的unicode编码数据库
一个用于管理Android使用的unicode的emoji表情的SQLite数据库
然而,在将含有emoji的数据存储到MySQL数据库中时,开发者可能会遇到字符编码的问题,导致数据无法正确存储或显示。这些问题主要源于MySQL默认的字符集设置以及不同编程语言处理字符集的方式。 #### 二、MySQL默认...
本文将详细介绍“超全的emoji字符表情图片开发资源包”,包括其包含的各种图片集以及如何在Android平台上使用这些资源。 首先,这个资源包提供了五种主要的emoji样式,分别是: 1. **Softbank**:源自日本软银公司...
为了解决这个问题,需要将Mysql的编码升级到UTF8MB4,这样可以正确地存储和显示emoji表情符号。 升级编码的步骤 1. 在Connector/J的连接参数中,不要加characterEncoding参数。这是因为characterEncoding参数可能...
MySQL默认使用的`utf8`字符集只支持最多3个字节的Unicode字符,而大多数emoji表情符号属于4字节的Unicode范围(UTF-8编码下的U+10000到U+10FFFF)。因此,如果直接使用`utf8`存储,会遇到无法正确保存和读取emoji的...
- 数据库字符集设置:确保MySQL数据库、表以及字段的字符集设定为`utf8mb4`,因为`utf8`只支持部分Unicode,而`utf8mb4`则支持所有Unicode字符,包括emoji。 - PHP连接设置:在连接MySQL时,使用`mysqli_set_...
1. **识别与分离emoji**:`Croc`能够识别Unicode标准定义的各种emoji,将它们从普通的文本字符串中分离出来,这对于处理含有emoji的字符串非常有用,比如在存储、显示或搜索时。 2. **替换与过滤**:开发者可以使用...
MySQL设计文档旨在提供一套规范,以确保在使用MySQL数据库时能充分发挥其优势,避免潜在问题。以下是基于给定内容的详细知识点: 一、数据库命令规范: 1. 数据库对象名称应使用小写字母和下划线,以符合lower_case...
在IT行业中,尤其是在开发跨平台或跨设备的应用时,Emoji的兼容性和一致性是一个常见的问题。不同的操作系统、浏览器或客户端可能对同一Emoji表情符号有不同的编码方式,导致在不同环境下的显示不一致。为了解决这个...
MySQL无法存储Emoji表情问题 ②. mysql存emoji表情报错处理 1. 在navicat中 如果在新建表之前就改变数据库的编码,建表的时候好像可以自己转变过来吧 查看字符集编码: show variables like '%char%'; 更改数据库...
Java emoji持久化mysql过程详解 ...通过使用utf8mb4字符集、URLEncoder.encode()和URLDecoder.decode()方法、emoji-java工具和EmojiUtil工具类,可以轻松地解决mysql数据库不能保存emoji表情符号的问题。
在 MySQL 数据库中,默认的编码方式为 utf8,但是 utf8 编码只支持最多 3 字节的数据,而 emoji 表情字符是 4 字节的字符。如果直接往采用 utf-8 编码的数据库中插入表情数据,Java 程序中将报 SQL 异常。为了解决这...
判断字符串是否包含emoji表情
2. **表字符集选择utf8mb4**:utf8mb4字符集支持四字节的Unicode字符,如Emoji表情,可以避免乱码问题并提高兼容性。 3. **添加注释**:为表和字段添加注释便于理解和维护,从一开始就进行数据字典的管理。 4. **...