Проблемы с кодировкой при получении неанглийских символов из базы данных в node.js

0

В узле 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                                         |
+--------------------------+-----------------------------------------------------------+
Теги:
character-encoding
encoding

2 ответа

0
Лучший ответ

Я добавил SET NAMES utf8; перед созданием таблицы, чтобы она выглядела так:

SET NAMES utf8;

CREATE TABLE main_categories (
  id   INT          NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

И это!

1

Ðізочки является Mojibake для Візочки. Это происходит, когда у вас нет utf8/utf8mb4 везде. В частности, node.js нуждается в чем-то вроде

var connection = mysql.createConnection({ ... , charset : 'utf8mb4'});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню