Mysql 尝试存储表情符号时出错
我使用sequelize作为node.js的ORM与mysql数据库交互 我的数据库字符集是Mysql 尝试存储表情符号时出错,mysql,node.js,sequelize.js,collation,utf8mb4,Mysql,Node.js,Sequelize.js,Collation,Utf8mb4,我使用sequelize作为node.js的ORM与mysql数据库交互 我的数据库字符集是utf8mb4,utf8mb4\u general\u ci 我的表格字符集是utf8mb4,utf8mb4\u general\u ci 我的列类型是文本,字符集是utf8mb4,utf8mb4\u general\u ci 在执行任何查询之前,我将执行以下代码: Sequelize.query("SET NAMES utf8mb4"); Sequelize.query("SET CHARACTER S
utf8mb4,utf8mb4\u general\u ci
我的表格字符集是utf8mb4,utf8mb4\u general\u ci
我的列类型是文本,字符集是utf8mb4,utf8mb4\u general\u ci
在执行任何查询之前,我将执行以下代码:
Sequelize.query("SET NAMES utf8mb4");
Sequelize.query("SET CHARACTER SET utf8mb4");
执行Sequelize.query(“显示变量,如'character\u set\u%'”)后,我得到:
[ [ 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
我也遇到了这个问题,很容易就解决了,您只需将数据库设置为utf8\u general\u ci即可。在node.js进行连接时,需要添加“charset”参数:
var pool = mysql.createPool({
host: "host",
user: "username",
password: "password",
database: "database",
connectionLimit: xxxx,
charset : 'utf8mb4'
});
这对我起了作用 我在使用Express和Sequelize将表情符号插入MySQL时遇到了同样的问题。您可以像这样确认当前角色集
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;
然后,显示变量,其中…
从上方再次更新为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);
});
utf8\u general\u ci
是字符集utf8的排序规则,它不处理表情符号。请提供SHOW CREATE TABLE