问题描述
我现在使用带有 MysqL 驱动程序的 Node.js 连接到旧的 MysqL 数据库(版本:4.0.18-nt)。数据库默认排序规则为 latin1。
MysqL 字符设置:
character set latin1 latin1
character sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5 latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5
当我在数据库中插入汉字时,它会变成乱码。
var MysqL = require('MysqL');
var connection = MysqL.createConnection({
host: 'localhost',user: 'user',password: 'pwd',database: 'user',charset: 'BIG5' // I have tried 'utf8'/'latin1'/'BIG5'
});
connection.query(`update user set chi_surname = '陳',chi_other_name = '陳大文' where user_id = '1'`,async function (error,results,fields) {
if (error) throw error;
console.log('The solution is: ',results);
console.log(fields)
});
结果在MysqL
chi_surname chi_other_name
�䒰 �䒰憭扳��
I tried to convert above text (�䒰�䒰憭扳��) to utf-8,then it show 陳大文.
如果我直接更新phyMyAdmin中的字段,它可以正常更新。
chi_surname chi_other_name
陳 大文
似乎无论我在连接配置中放入什么字符集,MysqL驱动程序都会以utf-8格式向MysqL发送查询。
我知道将db的默认排序规则更改为utf-8可以解决问题,但是由于调用数据库的旧程序也很多,因此无法更改db排序规则。
我也尝试使用第三方库(iconv-lite、encoding)在插入前将单词改为BIG5/latin1,但还是失败。
Node version:node v15.6.0
node-MysqL version: 2.18.1
(来自评论)
CREATE TABLE department (
'dept_id' varchar(10) NOT NULL default '','dept_code' varchar(10) default NULL,'chi_name' varchar(50) default NULL,'eng_name' varchar(50) NOT NULL default ''
) TYPE=MyISAM
解决方法
A4FBA6C0C657
是 牛池灣
的 Big5 编码。所以你需要CHARACTER SET big5
。
连接、列定义等
请提供 SHOW VARIABLES LIKE 'char%';
和 SHOW CREATE TABLE
。
你似乎已经有了这个:
var connection = mysql.createConnection({ ...,charset : 'big5'});
所以可能在别处。
列在与连接不同的字符集中是可以的;应该正确处理转换。
请检查 MySQL 版本
SELECT @@version;