我是 Sequelize.js 和 Node.js 的新手,我们的后端数据库是 SQL Server 2014,所以我们使用 Sequelize.js 作为 ORM 层,我们需要处理数据中的非英文字符。
当我尝试使用sequelize create方法插入非英文字符时,DB中只得到???
,调试后发现原因如下, 但我不知道是否有任何好的解决方案来修复它。
下面是我在我的应用程序中创建的一个测试模型,我将使用 sequelize.import 方法生成表模式,然后调用 fillTestData 方法将测试数据插入数据库,然后我对数据库服务器调用同步,但我只得到数据库表中有很多 '????'
。
var Promise = require("sequelize").Promise;
module.exports = function(sequelize, DataTypes) {
var Test = sequelize.define("Test", {
ID: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true
},
Name: {
type: DataTypes.STRING(255),
allowNull: true
}
}, {
charset: "utf8",
classMethods: {
fillTestData: function(models) {
return Promise.join(
Test.create({Name: "hello"}),
Test.create({Name: "aello"}),
Test.create({Name: "Aello"}),
Test.create({Name: "bello"}),
Test.create({Name: "こんにちは"}),
Test.create({Name: "مرحبا"}),
Test.create({Name: "ជំរាបសួរ"}),
Test.create({Name: "მიესალმები"}),
Test.create({Name: "Hallå"}),
Test.create({Name: "你好"}),
Test.create({Name: "我們"}),
Test.create({Name: "여러분, 안녕하세요"}),
Test.create({Name: "Всем привет"}),
Test.create({Name: "ENLE o gbogbo eniyan"}),
Test.create({Name: "सभी को नमस्कार"}));
}
}
});
return Test;
};
我查看 Node.js 输出日志,发现 sequelize 将上面的创建请求翻译成下面的 SQL 语句:
INSERT INTO [Test] ([Name]) OUTPUT INSERTED.* VALUES ('我們');
我检查了数据库中的列定义,名称列是 nvarchar,我可以使用以下 SQL 语句将正确的非英语数据插入数据库:
insert into [Test] values (N'我們')
然后我意识到 sequelize DON'T 在 SQL 语句中的非英文字符串前添加 'N'。
然后我尝试调试并在“sequelize\lib\sql-string.js”文件中找到根本原因,sequelize会在生成SQL语句之前调用它的escapeId
方法来转义值,在这种方法,它不会检查是否需要在 mssql 方言的 Unicode 字符串之前添加“N”。所以我在最后对这个方法做了一点改动,如下所示:
if(dialect === 'mssql') {
return "N'" + val + "'";
}
else {
return "'" + val + "'";
}
然后我重新运行我的应用程序,一切都像我预期的那样工作,现在所有的 Unicode 字符串都可以正确地存储到数据库中。
但这不是一个很好的解决方案,我希望 sequelize 应该考虑这种需求并提供某种定义选项,如字符集,所以我不需要自己处理这个。
有没有人碰巧知道如何优雅地解决这个问题?
最佳答案
根据 Microsoft (https://msdn.microsoft.com/en-us/library/ms186939.aspx),nchar 和 nvarchar 都使用 UNICODE UCS-2 字符集。尝试在您的测试模型代码中将字符集从 utf8 更改为 UCS-2..
关于sql-server - 如何让sequelize在其SQL语句中的Unicode字符串前加N?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30303841/