mysql - Node.js 将 ISO8859-1 编码为 UTF-8

标签 mysql node.js unicode utf-8 iso-8859-1

我有一个应用程序允许用户将字符串保存到数据库中,这些字符串可能包含表情符号。我遇到的问题是诸如 😊 之类的表情符号将作为 ðŸ∼Š

存储在 MySQL 中

当我使用 PHP MySQL 客户端检索此字符串并在 Web 浏览器中呈现它时,它呈现良好可能是因为 Content-Type 设置为 UTF-8。当我尝试读取 node.js 中的字符串时,我得到了我认为是 ISO8859-1 编码的文字 ðŸ∼Š。表上的字符集设置为 latin1,这就是我从中获取 ISO8859-1 的地方。

在 node.js 中对字符串进行编码的正确方法是什么,以便在我 console.log 字符串时可以看到表情符号而不是 MySQL 设置的编码?

最佳答案

ðŸ∼ŠMojibake对于😊。将前者解释为 latin1,您将得到十六进制 F09F988A,这是该表情符号的 UTF-8 十六进制。

(注意:MySQL 外的 UTF-8 等同于 MySQL 内的 utf8mb4。)

在 MySQL 中,您必须使用 CHARACTER SET utf8mb4 声明列/表。您还必须声明正在存储/获取的数据编码为 utf8mb4。注意:utf8 是不够的。

做一个 SELECT HEX(col) FROM ... 看看你是否得到那个表情符号的十六进制。如果是这种情况并且列当前是latin1,那么部分修复是小心地将列转换为utf8mb4。也就是说,您有 CHARACTER SET latin1,但其中有 UTF-8 字节;这将在修复字符集时单独保留字节。假设该列已经是 VARCHAR(111) CHARACTER SET latin1 NOT NULL,然后执行以下两步 ALTER:

ALTER TABLE tbl MODIFY COLUMN col VARBINARY(111) NOT NULL;
ALTER TABLE tbl MODIFY COLUMN col VARCHAR(111) CHARACTER SET utf8mb4 NOT NULL;

几乎任何其他转换机制都会造成更糟的情况。

至于正确建立连接,对于 node.js 来说是这样的:

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

关于mysql - Node.js 将 ISO8859-1 编码为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107108/

相关文章:

mysql - 错误 002061 - 身份验证插件 'caching_sha2_password' 报告错误 : Authentication requires secure connection

node.js - EC2 Ubuntu NGINX 配置 HTTPS 重定向给我错误 : ERR_TOO_MANY_REDIRECTS

javascript - Expressjs 无法检测响应

java - 在 Java 中使用 UNICODE 符号时出现问题

delphi - 将函数转换为delphi 2009/2010(unicode)

mysql - 如何在mysql数据库中生成序列号?

mysql - 外键的语法差异 MySQL/PostgresQL

mysql - 更改sql文件中的字符

mysql - 数据库;错误代码 : 1111 | needing to encapsulate AVG

javascript - nodejs 从 mongodb 返回对象数组