从Node查询MariaDB时结果中的字符编码不一致

时间:2019-01-29 19:16:58

标签: node.js encoding mariadb

在从Node应用程序查询MariaDB时,答复中的字符编码不一致时出现问题。有时我的结果按预期被编码为utf8。有时候...嗯,我不知道。

我做错了吗?这是一个已知的问题?有解决方法吗?

这是一个可重复的案例:

CID=$(sudo docker run -d --rm -e MYSQL_ROOT_PASSWORD=p mariadb:10.4)
sudo docker exec -i "$CID" mysql -t -u root -pp << EOF
charset utf8
CREATE DATABASE d;
CREATE TABLE d.t (SELECT "cacahouète" AS word FROM DUAL);
EOF

从Node查询该数据库时,我得到以下结果:

root@11d7d3a108b4:/usr/src/app# node test.js 
0 { word: 'cacahouète' }
1 { word: 'cacahou�te' }
2 { word: 'cacahouète' }
3 { word: 'cacahou�te' }
4 { word: 'cacahou�te' }
5 { word: 'cacahou�te' }
6 { word: 'cacahouète' }
^C
root@11d7d3a108b4:/usr/src/app# node test.js 
0 { word: 'cacahouète' }
1 { word: 'cacahou�te' }
2 { word: 'cacahou�te' }
3 { word: 'cacahouète' }
4 { word: 'cacahou�te' }
5 { word: 'cacahouète' }
6 { word: 'cacahou�te' }

root@11d7d3a108b4:/usr/src/app# node test.js | od -A x -t x1z -v
000000 30 20 7b 20 77 6f 72 64 3a 20 27 63 61 63 61 68  >0 { word: 'cacah<
000010 6f 75 c3 a8 74 65 27 20 7d 0a 31 20 7b 20 77 6f  >ou..te' }.1 { wo<
000020 72 64 3a 20 27 63 61 63 61 68 6f 75 ef bf bd 74  >rd: 'cacahou...t<
000030 65 27 20 7d 0a 32 20 7b 20 77 6f 72 64 3a 20 27  >e' }.2 { word: '<
000040 63 61 63 61 68 6f 75 c3 a8 74 65 27 20 7d 0a 33  >cacahou..te' }.3<
000050 20 7b 20 77 6f 72 64 3a 20 27 63 61 63 61 68 6f  > { word: 'cacaho<
000060 75 ef bf bd 74 65 27 20 7d 0a 34 20 7b 20 77 6f  >u...te' }.4 { wo<
000070 72 64 3a 20 27 63 61 63 61 68 6f 75 ef bf bd 74  >rd: 'cacahou...t<
000080 65 27 20 7d 0a 35 20 7b 20 77 6f 72 64 3a 20 27  >e' }.5 { word: '<
000090 63 61 63 61 68 6f 75 ef bf bd 74 65 27 20 7d 0a  >cacahou...te' }.<
0000a0 36 20 7b 20 77 6f 72 64 3a 20 27 63 61 63 61 68  >6 { word: 'cacah<

这是test.js的代码(使用节点v8.15。0和mariadb连接器“ 2.0.2-rc”):

const MARIADB_HOST=process.env.MARIADB_HOST || "172.17.0.7";
const MARIADB_USER=process.env.MARIADB_USER || "root";
const MARIADB_PASSWORD=process.env.MARIADB_PASSWORD || "p";

const mariadb = require('mariadb');
const pool = mariadb.createPool({
     host: MARIADB_HOST, 
     user: MARIADB_USER, 
     password: MARIADB_PASSWORD,
     database: "d",
     connectionLimit: 5,
     charset: 'UTF8_GENERAL_CI',
});

async function get() {
  // search for word in the db
  let conn;

  try {
    conn = await pool.getConnection();
    const rows = await conn.query("SELECT * FROM t");
    return rows[0];
  }
  finally {
    if (conn) conn.end();
  }
}


async function run() {
  for(i=0; i < 7; ++i) {
    console.log(i, await get());
  }
}

run();

2 个答案:

答案 0 :(得分:2)

显然,这与该MariaDB服务器问题有关:

https://jira.mariadb.org/browse/MDEV-18281

  

重新初始化COM_RESET_CONNECTION连接字符集后,   到初始握手包中指示的那个,但是到另一个   值,character_set_server。

一种解决方法是将character_set_server更改为utf8。

答案 1 :(得分:0)

所以它有3种方式。

  1. 向您发送请求的客户端未使用UTF-8发送该请求
  2. 有人用另一种方式推动它。
  3. 您的控制台编码错误。