sql-server - 如何让sequelize在其SQL语句中的Unicode字符串前加N?

标签 sql-server database node.js unicode sequelize.js

我是 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/

相关文章:

sql-server - delphi dbgrid bool 值,接受 f fa fal fals false ,如何接受更多值?

SQL : Adding foreign key on existing composite key

sql-server - 在sails js中检索多个结果集

SQL 引用的表中没有主键或候选键

mysql - 分片只是跨多个数据库的水平分区吗?

mysql - 如何从架构中的每一列获取示例值

mysql - 在我的sql中设置表的条件?

mysql - 将 MySQL 客户端配置传递给 "rails db"

javascript - AWS 物联网 : Read Thing Shadow

node.js - 使用 Sequelize 查询