在从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();
答案 0 :(得分:2)
显然,这与该MariaDB服务器问题有关:
https://jira.mariadb.org/browse/MDEV-18281
重新初始化COM_RESET_CONNECTION连接字符集后, 到初始握手包中指示的那个,但是到另一个 值,character_set_server。
一种解决方法是将character_set_server
更改为utf8。
答案 1 :(得分:0)
所以它有3种方式。