В узле js у меня есть очень простой код для запросов к базе данных:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: "databasename"
});
connection.connect();
connection.query('SELECT * FROM main_categories', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
connection.end();
Я создаю базу данных и таблицу с этим sql-скриптом:
CREATE DATABASE databasename
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
CREATE TABLE main_categories (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
Когда я пытаюсь выбрать код только в консоли mysql, все выглядит хорошо, но когда я пытаюсь получить результаты в node.js, в консольных журналах я вижу это примерно так:
[ RowDataPacket { id: 1, name: 'Ðізочки' },
RowDataPacket { id: 2, name: 'Ð"итÑчий транÑпорт' },
RowDataPacket { id: 3, name: 'ÐвтокріÑла' },
RowDataPacket { id: 4, name: 'Іграшки' },
RowDataPacket { id: 5, name: 'Ð"итÑча кімната' },
RowDataPacket { id: 6, name: 'ÐÑе Ð´Ð»Ñ Ð³Ð¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ' },
RowDataPacket { id: 7, name: 'ÐкÑеÑуари Ð´Ð»Ñ Ð¼Ð°Ð¼' },
RowDataPacket { id: 8, name: 'Ð"ігіÑ"на та доглÑд' } ]
Я попытался добавить charset
в объект конфигурации при использовании mysql.createConnection
и любых других решений, но никаких результатов, к сожалению.
UPD: Возможно, было бы полезно увидеть переменные базы данных:
mysql> SHOW variables WHERE variable_name LIKE '%coll%' OR variable_name LIKE '%char%';
+--------------------------+-----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.7.19-macos10.12-x86_64/share/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+-----------------------------------------------------------+
Я добавил SET NAMES utf8;
перед созданием таблицы, чтобы она выглядела так:
SET NAMES utf8;
CREATE TABLE main_categories (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
И это!
Ðізочки
является Mojibake для Візочки
. Это происходит, когда у вас нет utf8/utf8mb4 везде. В частности, node.js нуждается в чем-то вроде
var connection = mysql.createConnection({ ... , charset : 'utf8mb4'});