2017-01-25 3 views
1

Я использую sequelize как ORM для node.js для взаимодействия с базой данных mysql.Ошибка при попытке сохранить emoji

Моей кодировок базы данных utf8mb4, utf8mb4_general_ci

Моя таблица Кодировка utf8mb4, utf8mb4_general_ci

Мой столбец ТИП ТЕКСТ и кодировка utf8mb4, utf8mb4_general_ci

Перед выполнением какого-либо запрос, я хочу выполнение следующего кода:

Sequelize.query("SET NAMES utf8mb4"); 
Sequelize.query("SET CHARACTER SET utf8mb4"); 

После выполнения Sequelize.query ("SHOW VARIABLES LIKE" character_set_% '"), i «Ве получил:

[ [ RowDataPacket { Variable_name: 'character_set_client', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_connection', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_database', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_filesystem', Value: 'binary' }, 
    RowDataPacket { Variable_name: 'character_set_results', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_server', Value: 'utf8' }, 
    RowDataPacket { Variable_name: 'character_set_system', Value: 'utf8' }, 
    RowDataPacket { 
     Variable_name: 'character_sets_dir', 
     Value: 'c:\\openserver\\modules\\database\\MySQL-5.7-x64\\share\\charsets\\' } ], 
    [ RowDataPacket { Variable_name: 'character_set_client', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_connection', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_database', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_filesystem', Value: 'binary' }, 
    RowDataPacket { Variable_name: 'character_set_results', Value: 'utf8mb4' }, 
    RowDataPacket { Variable_name: 'character_set_server', Value: 'utf8' }, 
    RowDataPacket { Variable_name: 'character_set_system', Value: 'utf8' }, 
    RowDataPacket { 
     Variable_name: 'character_sets_dir', 
     Value: 'c:\\openserver\\modules\\database\\MySQL-5.7-x64\\share\\charsets\\' } ] ] 

Но когда я пытаюсь сохранить строку, содержащую смайлик, я столкнулся с ошибкой:

Unhandled rejection SequelizeDatabaseError: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'content' at row 1 
+0

Просьба 'SHOW CREATE TABLE' –

ответ

-1

я столкнулся с этой проблемой также и решить ее легко, вы только необходимо установить вашу базу данных в utf8_general_ci. И при выполнении соединения на Node.js вам нужно добавить параметр «кодировок»:

var pool = mysql.createPool({ 
    host: "host", 
    user: "username", 
    password: "password", 
    database: "database", 
    connectionLimit: xxxx, 
    charset : 'utf8mb4' 
}); 

Это сделал трюк для меня.

+0

' utf8_general_ci' является _collation_ для _charater set_ utf8, который выполняет _not_ обработку Emoji. –

0

У меня была такая же проблема, как вставить emoji в MySQL с помощью Express и Sequelize. Вы можете подтвердить текущий набор символов, как

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 

выход соединения по умолчанию из указанных выше выглядит следующим образом

character_set_client  utf8 
character_set_connection utf8 
character_set_database utf8mb4 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  utf8mb4 
character_set_system  utf8 
collation_connection  utf8_general_ci 
collation_database  utf8mb4_unicode_ci 
collation_server   utf8mb4_unicode_ci 

Если ваш MySQL конфигурационный файл /etc/my.cnf выглядит

[client] 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

Но если вы запустите

SET NAMES utf8mb4; 

Затем SHOW VARIABLES WHERE... сверху он обновится до utf8mb4 по всей доске.

character_set_client  utf8mb4 
character_set_connection utf8mb4 
character_set_database utf8mb4 
character_set_filesystem binary 
character_set_results  utf8mb4 
character_set_server  utf8mb4 
character_set_system  utf8 
collation_connection  utf8mb4_general_ci 
collation_database  utf8mb4_unicode_ci 
collation_server   utf8mb4_unicode_ci 

Таким образом, решение, которое я нашел, чтобы положить следующее на первой линии моей модели пользователя:

// make sure db/client/connection can support emoji 
sequelize.query("SET NAMES utf8mb4;"); 
// confirm settings 
sequelize.query("SHOW VARIABLES LIKE 'character_set_%'").then(function(data) { 
    console.log(data); 
}); 
Смежные вопросы