2015-05-18 4 views
5

Jestem nowy w Sequelize.js i Node.js, nasza baza danych backendu to SQL Server 2014, więc używamy Sequelize.js jako warstwy ORM, Musimy obsługiwać znaki inne niż angielskie w naszych danych.Jak zrobić sequelize dodać N przed ciągiem Unicode w jego instrukcji SQL?

gdy próbuję użyć sequelize stworzyć metodę wstawiania niż angielska char, tylko mam ??? w dB, po debugowania okazało się, że powodem tak jak poniżej, ale nie wiem, czy jest jakiś istniały dobre rozwiązanie naprawić to.

Poniżej znajduje się jeden model testowy, który utworzyłem w mojej aplikacji, użyję metody sequelize.import do wygenerowania schematu tabeli, następnie wywołaję metodę fillTestData, aby wstawić dane testowe do DB po wywołaniu synchronizacji z serwerem DB, ale ja tylko uzyskać dużo '????' w tabeli DB.

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; 
}; 

sprawdzić rejestr wyjściowy node.js, okazało się, że sequelize tłumaczyć powyżej utworzyć prośbę do poniżej SQL:

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

I sprawdził definicji kolumny w bazie danych, to kolumna Nazwa nvarchar, mogę wstawić odpowiednie nieangielskich danych DB z poniżej SQL:

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

Wtedy zdaję sobie sprawę, że sequelize nie dodawaj „n” przed nieanglojęzycznych ciąg w objaśniające SQL ent.

Następnie próbuję usunąć przyczynę i zlokalizować przyczynę w pliku "sequelize \ lib \ sql-string.js", sequelize wywoła jego metodę escapeId, aby uzyskać wartość przed wygenerowaniem instrukcji SQL, w tej metodzie wygrywa " t sprawdź, czy trzeba dodać "N" przed ciągiem znaków Unicode dla dialektu mssql. Więc robię małą zmianę do tej metody na końcu jak poniżej:

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

Potem ponownie uruchomić mój wniosek, wszystko może pracować jako moje oczekiwania, cały ciąg Unicode mogą być przechowywane w bazie danych poprawnie teraz.

Ale to nie jest dobra poprawka, spodziewałem się, że sequelize powinien wziąć pod uwagę tego rodzaju wymagania i podać pewne definicje, takie jak zestaw znaków, więc nie muszę o to dbać sam.

Czy ktoś może wiedzieć, jak z wdziękiem rozwiązać ten problem?

Odpowiedz

Powiązane problemy