问题描述:
spark-submit dataframe写入mysql报错 Exception in task 3.0 in stage 7.0 (TID 609) Incorrect string value: ‘\xF0\x9F
原因是mysql解码设置问题:
报错信息:
ERROR Executor: Exception in task 0.0 in stage 7.0 (TID 606)
java.sql.BatchUpdateException: Incorrect string value: ‘\xF0\x9F\x98\x8E\xF0\x9F…’ for column ‘user_location’ at row 1
解决方法:
alter table < tablename > character set utf8mb4;
总结:
utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。
UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符。
因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。
从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。从 8.0 之后,将会在某个版本开始用 utf8mb4 作为默认字符编码。
设置服务器默认字符集为 utf8mb4
创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。
如果数据库默认字符集不是 utf8mb4,那么可以在创建数据库时指定字符集:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;