`
vase
  • 浏览: 422224 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

emoji字符无法写入Mysql数据库问题

 
阅读更多

最近发现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;"/>

  • 大小: 63 KB
分享到:
评论
3 楼 向往雨后彩虹 2014-09-11  
2 楼 向往雨后彩虹 2014-09-11  
1 楼 slowoo 2014-06-30  
     

相关推荐

    mysql数据库支持emoji表情实例

    总结来说,MySQL 5.7.6及更高版本的数据库通过`utf8mb4`字符集支持了emoji,使得开发者可以在数据库中存储和处理丰富的文本信息,增强了用户界面的互动性。这个实例提供了从数据库设置到实际操作的完整流程,对于...

    java解析emoji表情存入oracle,并正常使用

    Oracle数据库系统在设计之初并未考虑对Unicode扩展区域的全面支持,因此默认情况下无法直接存储和检索emoji表情。Java作为一种广泛使用的编程语言,可以作为解决这一问题的桥梁。本文将深入探讨如何通过Java解析...

    MySQL数据库字符集的问题研究.pdf

    ### MySQL数据库字符集的问题研究 #### 一、MySQL字符集概述 MySQL数据库是瑞典MySQL AB公司开发的一款小型关系型数据库管理系统,因其速度快、易用性好、支持SQL、网络支持性好、可移植性好及费用低廉等特点,在...

    通用正则表达支持检测限制emoji字符

    通用的正则检测工具类,包含用户名 手机号 等 支持检测限制emoji字符表情

    MySQL保存emoji表情

    因此,在设计与无线互联网相关的MySQL数据库时,推荐采用UTF-8mb4字符集来确保能够妥善处理emoji表情符号,避免出现数据存储或显示上的问题。 #### 限制 使用UTF-8mb4字符集的前提条件包括: - MySQL服务器版本需...

    部分emoji表情的unicode编码数据库

    部分emoji表情的unicode编码数据库

    emoji表情的unicode数据库

    一个用于管理Android使用的unicode的emoji表情的SQLite数据库

    emoji入库mysql注意事项除了更改utf8mb4最大的坑在这里

    然而,在将含有emoji的数据存储到MySQL数据库中时,开发者可能会遇到字符编码的问题,导致数据无法正确存储或显示。这些问题主要源于MySQL默认的字符集设置以及不同编程语言处理字符集的方式。 #### 二、MySQL默认...

    超全的emoji字符表情图片开发资源包

    本文将详细介绍“超全的emoji字符表情图片开发资源包”,包括其包含的各种图片集以及如何在Android平台上使用这些资源。 首先,这个资源包提供了五种主要的emoji样式,分别是: 1. **Softbank**:源自日本软银公司...

    Mysql支持emoji 表情符号 升级编码为UTF8MB4

    为了解决这个问题,需要将Mysql的编码升级到UTF8MB4,这样可以正确地存储和显示emoji表情符号。 升级编码的步骤 1. 在Connector/J的连接参数中,不要加characterEncoding参数。这是因为characterEncoding参数可能...

    emoji表情符号mysql插入与读取

    MySQL默认使用的`utf8`字符集只支持最多3个字节的Unicode字符,而大多数emoji表情符号属于4字节的Unicode范围(UTF-8编码下的U+10000到U+10FFFF)。因此,如果直接使用`utf8`存储,会遇到无法正确保存和读取emoji的...

    php 处理APP emoji表情包 IOS表情包 Mysql保存手机表情

    - 数据库字符集设置:确保MySQL数据库、表以及字段的字符集设定为`utf8mb4`,因为`utf8`只支持部分Unicode,而`utf8mb4`则支持所有Unicode字符,包括emoji。 - PHP连接设置:在连接MySQL时,使用`mysqli_set_...

    swift-Croc解析emoji字符串的Swift库

    1. **识别与分离emoji**:`Croc`能够识别Unicode标准定义的各种emoji,将它们从普通的文本字符串中分离出来,这对于处理含有emoji的字符串非常有用,比如在存储、显示或搜索时。 2. **替换与过滤**:开发者可以使用...

    mysql设计文档

    MySQL设计文档旨在提供一套规范,以确保在使用MySQL数据库时能充分发挥其优势,避免潜在问题。以下是基于给定内容的详细知识点: 一、数据库命令规范: 1. 数据库对象名称应使用小写字母和下划线,以符合lower_case...

    Emoji转换工具,便于各种类型的客户端生成的Emoji字符串转换成另外一种格式

    在IT行业中,尤其是在开发跨平台或跨设备的应用时,Emoji的兼容性和一致性是一个常见的问题。不同的操作系统、浏览器或客户端可能对同一Emoji表情符号有不同的编码方式,导致在不同环境下的显示不一致。为了解决这个...

    MySQL无法存储emoji表情解决方案分析

    MySQL无法存储Emoji表情问题 ②. mysql存emoji表情报错处理 1. 在navicat中 如果在新建表之前就改变数据库的编码,建表的时候好像可以自己转变过来吧 查看字符集编码: show variables like '%char%'; 更改数据库...

    Java emoji持久化mysql过程详解

    Java emoji持久化mysql过程详解 ...通过使用utf8mb4字符集、URLEncoder.encode()和URLDecoder.decode()方法、emoji-java工具和EmojiUtil工具类,可以轻松地解决mysql数据库不能保存emoji表情符号的问题。

    更改MySQL数据库的编码为utf8mb4_wo.pdf

    在 MySQL 数据库中,默认的编码方式为 utf8,但是 utf8 编码只支持最多 3 字节的数据,而 emoji 表情字符是 4 字节的字符。如果直接往采用 utf-8 编码的数据库中插入表情数据,Java 程序中将报 SQL 异常。为了解决这...

    判断字符串中是否包含emoji表情

    判断字符串是否包含emoji表情

    MySQL数据库设计规范

    2. **表字符集选择utf8mb4**:utf8mb4字符集支持四字节的Unicode字符,如Emoji表情,可以避免乱码问题并提高兼容性。 3. **添加注释**:为表和字段添加注释便于理解和维护,从一开始就进行数据字典的管理。 4. **...

Global site tag (gtag.js) - Google Analytics