首页 > 解决方案 > 如何使用 javascript/nodejs 从 latin1 (iso-8859-1) 数据库中获取数据?

问题描述

我在 latin1 中有一个旧的 mysql 数据库(mysql 5.0.2),我想从中获取数据。对于非 ascii 字符,我总是得到相同的输出(例如,Â、À 和 Á 以十六进制表示为 'ef bf bd' 之类的东西),也就是说不同的字符以相同的方式呈现。

我只需要以不同的方式获取这些字符,以便我可以将每个字符映射到正确的对应 utf-8 字符。

我一直在尝试更改字符集,但它对我不起作用!

有人可以帮我获取一些有意义的数据吗?

var mysql = require('mysql')

var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    //charset: "utf8mb4",
    //charset: "utf8",
    charset: "latin1",
    database : 'my_db'
})

con.connect()

var query = con.query("SELECT data from my_table where id='07'", function 
(error, results, fields) {
    var b = Buffer.from (results[0].data)
    console.log ('Retrieved data in hex -> ', b)
})

con.end()

当我去数据库并将数据更新为一些仅 ascii 的字符串时,我可以毫无问题地在 js 中获取数据,但是当我将该数据替换为“á”或“à”之类的东西时,我总是得到 'ef bf bd' 十六进制(-17 -65 -67 十进制)。

标签: javascriptmysqlutf-8iso-8859-1

解决方案


Latin1 十六进制EF BF BD转换为�. 也许您指的是一个 BOM(字节顺序标记),即 EF BB BF,看起来像. 请参阅http://mysql.rjweb.org/doc.php/charcoll#bom_byte_order_mark

Â、À 和 Á 经常在不正确地混合latin1和时出现utf8

如需进一步讨论,请提供十六进制和字符的文本片段。和/或查看UTF-8 字符的问题;我看到的不是我为解决常见问题而存储的。

哦!MySQL 4.0 没有字符集的概念。您可以存储和获取字符串,而无需进行任何测试或发生任何事情。但是,LENGTH()提供的字节数之类的东西,而不是字符数。并且不等式字符串比较 ( col_a < col_b) 不会为非 ascii 字符提供合理的结果。

在PHP 中对你的字符不做任何事情可能是安全的。只需将它们输入和输出/ (或)列。VARCHARTEXTBLOB


推荐阅读