У меня проблема с несовместимой кодировкой символов в ответах при запросе MariaDB из приложения Node.Иногда мои результаты кодируются как 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
При запросе этой базы данных из узла, я получаю следующий результат:
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();