Unicode编码 - 错误1366:字符串值不正确:列的'\ xF0'

时间:2018-02-20 17:25:59

标签: mysql string go character-encoding

我遇到了MySQL编码解析数据然后存储来自Twitter API的数据的问题。

难以存储到数据库中的推文是:

   INSERT INTO `statuses` (`status_id`,`text`) VALUES('93332222111111','The beers are on me in this case!�')

字符为this one。 而以下成功存储:

INSERT INTO `statuses` (`status_id`,`text`) VALUES('485072105225921','RT @someone:  Don\'t forget to index timestamp columns like \"created_at\" if you query against them.\n\ne.g.: ORDER BY created_at\ne.g.: WH')

让我们看一下字符集:

SHOW VARIABLES LIKE 'character_set%'

带回来

character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    utf8
character_set_system    utf8
character_sets_dir  /usr/local/Cellar/mysql/5.7.18_1/share/mysql/charsets/

我遗失了哪些明显的东西?

更新 还有以下if块:

if utf8.ValidString(strings.Join(values, ",")) == false {
            fmt.Println(strings.Join(values, ","))
        }

返回:

'The beers are on me in this case!�','943304851980963841' 

2 个答案:

答案 0 :(得分:0)

可以提出两个解决问题的建议:

  • 使用UTF16字符集;
  • 使用utf8mb4作为字符集,utf8mb4_unicode_ci作为整理。

您可以使用以下代码作为示例extracted from an online tutorial

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

由于您的问题不在于数据库,您必须使用代表图像的正确代码。我建议你使用"emoji-java":一个轻量级的java库,它可以帮助你在java应用程序中使用Emojis。

一个例子:

String str = "An :grinning:awesome :smiley:string 😄with a few :wink:emojis!";
String result = EmojiParser.parseToUnicode(str);
System.out.println(result);
// Prints:
// "An awesome string with a few emojis!"

另一个编辑: 你现在告诉你正在使用的语言:去吧。在这种情况下,您可以查看Go-emoji here。甚至是another emoji project

答案 1 :(得分:0)

不要将utf16用于任何事情。

使用MySQL' CHARACTER SET utf8mb4;它等同于外部世界的UTF-8,并包含以十六进制F0开头的字符。 (MySQL' utf8不包括它们。)

,十六进制F09F94A5需要utf8mb4。同上,十六进制F09F8DBB

表示已经搞砸了。也就是说,INSERT被赋予了不良角色。

请提供SELECT HEX(text) ...以查看您是否获得其中一个十六进制值。

另见"黑钻"在Trouble with UTF-8 characters; what I see is not what I stored