一、背景
使用 Sequelize(6.3.4) 进行 MySQL5.1 数据操作,在本地运行没问题,但是推上服务器之后,读写数据都出现了中文乱码的问题。
二、解决过程
第一反应是连接数据库时没设置 UTF8 字符集导致的,于是先设置了字符集。
const sqlIns = new Sequelize(mysqlConf.$mysql_database, mysqlConf.$mysql_username, mysqlConf.$mysql_password, { host: mysqlConf.$mysql_server_name, dialect: 'mysql', timezone: '+08:00', define: { charset: 'utf8', dialectOptions: { collate: 'utf8_general_ci' } } });
重启 Node 服务 pm2 restart all
,无果。
继续查询了数据库的字符编码:
# sql show variables like '%char%'; # result 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/share/mysql/charsets/
修改 Linux MySQL 配置文件 /etc/my.cnf
:
# shell vim /etc/my.cnf # /etc/my.cnf [mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8
重启 MySQL 服务 service mysqld restart
,无果。
经过一系列搜索后,尝试了一个 ISSUE: Need "SET NAMES utf8" #395 中的解决办法,修改下 Sequelize 配置字符集的层级。
const sqlIns = new Sequelize(mysqlConf.$mysql_database, mysqlConf.$mysql_username, mysqlConf.$mysql_password, { host: mysqlConf.$mysql_server_name, dialect: 'mysql', timezone: '+08:00', dialectOptions: { charset: 'utf8' } });
重启 Node 服务 pm2 restart all
,成功读写中文字符!