2017-01-25 2 views
1

Ich benutze Sequelize als ORM für node.js mit mysql-Datenbank zu interagieren.Fehler beim Versuch, Emoji zu speichern

Meine Datenbank charset ist utf8mb4, utf8mb4_general_ci

Mein Tisch charset ist utf8mb4, utf8mb4_general_ci

Meine Spalte TYPE TEXT und charset ist utf8mb4, utf8mb4_general_ci

Vor der Abfrage ausgeführt wird, ich bin folgenden Code ausführen:

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

Nach dem Ausführen von Sequelize.query ("SHOW VARIABLES LIKE 'character_set_%'"), i Hab bekam:

[ [ 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\\' } ] ] 

Aber wenn ich versuche, Zeichenfolge zu speichern, dass emoji enthält, ich lief in einen Fehler:

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

Bitte geben Sie SHOW TABLE' CREATE –

Antwort

-1

ich in dieser Ausgabe lief auch und löste es leicht, Sie müssen Sie Ihre Datenbank auf utf8_general_ci einstellen. Und wenn die Verbindung zu tun node.js müssen Sie den „charset“ -Parameter hinzuzufügen:

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

Dies hat den Trick für mich.

+0

'utf8_general_ci' ist ein _collation_ für die _charater set_ utf8, das Emoji nicht behandelt. –

0

Ich hatte das gleiche Problem versucht, Emoji in MySQL mit Express und Sequelize einzufügen. Sie können Ihren aktuellen Zeichensatz wie

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

Der Standardanschluss Ausgang aus den oben sieht wie folgt aus

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 

Wenn Ihre MySQL-Konfigurationsdatei /etc/my.cnf sieht aus wie

[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 
bestätigen

Aber wenn Sie

SET NAMES utf8mb4; 
laufen

Dann wird die SHOW VARIABLES WHERE... von oben wieder auf utf8mb4 auf der ganzen Linie aktualisiert.

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 

So ist die Lösung, die ich fand das folgende in der ersten Zeile meines User-Modell zu setzen ist:

// 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); 
}); 
Verwandte Themen