从javascript到mssql的瑞典语字符-在数据库表中显示为问号吗?

问题描述

所以我现在对Node js遇到这个奇怪的问题,找不到任何解决方案...

我正在尝试将值插入到我的mssql表中,其中一些值包括瑞典字符“åäö”。无论如何,当我这样做时,它们显示为“ ??????”。每个特殊字符都显示为两个问号(“ö”->“ ??”)。

一些细节:

*我正在使用的软件包在js中:msnodesqlv8

var sql = require('msnodesqlv8');
const connectionString = "server=host;Database=MyDb;Trusted_Connection=Yes;Driver={sql Server Native Client 11.0}"
q = "Insert into [MyDb].[dbo].[MyTable] (testCol) values ('ö')"

sql.query(connectionString,q,(err,data) => {
      if (err) {
           console.log(err);
      }
      else {
           console.log('Imported row to table.');
      }
})

* db表中将检索包含“åäö”的值的列定义为数据类型nvarchar(50)

  • 我也尝试使用变量q中的N'ö'和这些字符(在双引号中)出现在数据库表“ ᅢ ᄊ”中

* console.log('ö')在控制台中按预期方式打印ö

*我已经尝试了所有可以在js中考虑的转换(例如utf-8,latin1等)

*数据库中的排序规则为 Finnish_Swedish_CI_AS

*我尝试从另一张表中读取瑞典chrs,并且通过包msnodesqlv8可以正常工作

对我来说,问题似乎出在通过js通过包msnodesqlv8通过js发送查询时(一切看起来都很好),并且当mssql应该解释值时。我很高兴有人可以帮助我。

解决方法

您是否由于某种原因没有使用准备好的陈述?它会为您处理编码,例如:

const sql = require('msnodesqlv8')
const connectionString = "server=YourServerIp,YourServerPort;Database=StackOverflow;Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0};"
console.log('Connecting...')
sql.open(connectionString,(err,conn) => {
    console.log('Dropping...')
    conn.query('drop table if exists [dbo].[Swedish]',) => {
        console.log('Creating...')
        conn.query('create table [dbo].[Swedish] (testCol nvarchar(50))',(err) => {
            console.log('Inserting...')
            conn.prepare('insert [dbo].[Swedish] (testCol) values (?)',ps) => {
                ps.preparedQuery(['ö'],(err) => {
                    ps.free();
                    console.log('Selecting...')
                    conn.query('select * from [dbo].[Swedish]',rows) => {
                        console.log(`${JSON.stringify(rows)}`)
                    })
                })
            })
        })
    })
})

哪个产量...

> node .\swedish.js        
Connecting...
Dropping...
Creating...
Inserting...
Selecting...
[{"testCol":"ö"}]

通过SSMS查询时出现相同的字符。