如何在Unicodestring的SQL语句之前添加N后缀?

我是Sequelize.js和Node.js的新手,我们的后端数据库是SQL Server 2014,所以我们使用Sequelize.js作为ORM层,我们需要处理数据中的非英文字符。

当我尝试使用sequelize创build方法来插入非英文字符,我只得到??? 在DB中,debugging后我发现原因如下,但是我不知道有没有什么好的解决方法来修复它。

下面是我在应用程序中创build的一个testing模型,我将使用sequelize.import方法生成表模式,然后调用fillTestData方法将testing数据插入数据库,然后调用数据库服务器的同步,但是我只获得很多'????' 在数据库表中。

 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把上面的create请求翻译成下面的SQL语句:

 INSERT INTO [Test] ([Name]) OUTPUT INSERTED.* VALUES ('我們'); 

我检查了数据库中的Column定义,Name列是nvarchar,我可以用下面的SQL语句向DB插入正确的非英文数据:

  insert into [Test] values (N'我們') 

然后我意识到,sequelize不要在SQL语句中的非英文string之前添加“N”。

然后我试着在“sequelize \ lib \ sql-string.js”文件中debuggingfind根本原因,在生成SQL语句之前,sequelize会调用它的escapeId方法来escapse的值,在这个方法中,不会检查它需要在用于mssql方言的Unicodestring之前添加“N”。 所以我在最后对这个方法稍作改动,如下所示:

  if(dialect === 'mssql') { return "N'" + val + "'"; } else { return "'" + val + "'"; } 

然后我重新运行我的应用程序,一切都可以按照我的期望工作,所有的Unicodestring现在可以正确地存储到数据库。

但是这不是一个好的解决办法,我期望续集应该考虑这种要求并提供一些像charset这样的定义选项,所以我不需要自己来照顾这个。

有谁碰巧知道如何优雅地解决这个问题?

根据Microsoft( https://msdn.microsoft.com/en-us/library/ms186939.aspx ),nchar和nvarchar都使用UNICODE UCS-2字符集。 尝试在testing模型代码中将字符集从utf8更改为UCS-2。