2017-10-16 75 views
0

我有一个node.js脚本运行,将数据从公共“数据库”中取出(这是一个区块链'),然后对其执行一些操作,然后将其插入到MySQL数据库中。我有使用UTF8_general_ci编码的MySQL数据库。绝大多数的数据解析都很好,但每隔一段时间就会碰到一些无法插入的东西。我得到这个错误:node.js/MySQL:当我尝试插入数据库时​​,某些字符串编码(表情符号)出现错误

code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD', 
    errno: 1366, 
    sqlMessage: 'Incorrect string value: \'\\xF0\\x9F\\x8D\\x95 N...\' for column \'body\' at row 1', 
    sqlState: 'HY000', 
    index: 0, 

这表明,这似乎是导致错误串的位,它总是有这种独特的问号:

This looks like Paradise for me! ����\

我猜这是一个编码问题?有没有一种方法可以在它引发错误之前将其转换?我不确定这个区块链使用的是什么编码,我甚至不知道我会如何发现。

编辑:这里是(误差)另一个例子显示了Web界面上这个blockchain:

And your very welcome !

另一个编辑:我要指出的是,我使用mysql.format(sql, inserts)来处理与无意的SQL问题data - https://github.com/mysqljs/mysql#preparing-queries

+0

是否有关于MySQL的一侧或节点方的错误? –

+0

它显示在节点控制台中。我刚才会编辑一些错误信息。 – erv

+2

尝试utf8mb4(mysql的UTF8的实际实现) – Strawberry

回答

1

的可能的答案是,MySQL连接没有指定utf8mb4。 (具体来说,MySQL的utf8而不是足够表情符号。)你能提供连接代码吗?这里是一个回退:连接到MySQL后执行此:

SET NAMES utf8mb4 

另一种可能的答案是,Web服务器没有治疗的页面为UTF-8。解决的方法之一是与此在<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

和列必须CHARACTER SET utf8mb4,不ut8

node.js的连接池

var connection = mysql.createConnection({ ... , charset : 'utf8mb4'}); 

stackoverflow

+0

该连接基于mysql nodejs文档中的示例: var mysql = require('mysql'); VAR池= mysql.createPool({ connectionLimit:10, 主机: 'example.org', 用户: '鲍勃', 密码: '秘密', 数据库: 'MY_DB' }); 我没有显示字符,所以我不需要担心网络服务器端的事情。 – erv

+0

但是你必须担心“字符集” - 错误是抱怨你试图将一个4字节的表情符号填充到MySQL中的'CHARACTER SET utf8'洞中。这仅限于'UTF-8'的3字节子集。 –

+0

谢谢 - “node.js”是我需要的线索。看看我添加了什么。 –

0

我最终通过使用npm的iconv-lite来解决这个问题。

所以基本上:

const iconv = require("iconv-lite"); 
var buf = iconv.encode("weird characters", "utf8"); 
+0

这使事情变得更糟。为了演示,我们来看看'SELECT HEX(...)FROM ...'。如果你没有看到以'F0'开头的4字节块,这是一团糟。你首先提到的角色应该显示“F09F8D95”。如果你得到'C3B0C5B8C28DE280A2',你有“双重编码”。 ''是十六进制'F09F918D F09F9295' –

+0

它从字面上阻止了这个错误,所以我不认为它会让事情变得更糟。 – erv

+0

另一种可能性是它转换为“U + 1F32A”或“\ u1F32A”类型的“Unicode”编码。对于网页以外的任何内容,这都是“更糟糕的”。我们来看看十六进制,所以我没有猜测。 –

相关问题