Windows Server 上的字符问题,而非 Unix 上的字符问题(� 字符)

问题描述 投票:0回答:1

在我的 Windows Server 2019 上,在我的 NodeJS 脚本中,我使用 Prisma 库写入数据库。

我要添加的字段是

NVARCHAR(1000)
字段。所以应该接受这个角色吧?

字符串输入来自

fs.readFileSync(customJobPath, 'utf8')
,我正在读取带有数据的txt文件

我有以下这个词

Gardé

  • 现在在我的本地数据库中,它已正确保存
  • 在我的生产 MSSQL 数据库中,它输入为
    Gard�

我尝试过的事情

  • 我已经使用
    SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation;
    检查了两个数据库的排序规则,并且在这两种情况下它都设置为
    SQL_Latin1_General_CP1_CI_AS
  • 手动插入
    é
    字符并保存(在Tableplus中)时,它会正确保存在数据库中。

有人知道我是否缺少什么吗?

sql node.js sql-server prisma collation
1个回答
1
投票

问题中没有足够的信息来确定,但我怀疑您有四个问题中的一个(或多个):

  1. 您正在使用字符串连接将此数据包含在查询中。这已经是错误的(您应该使用查询参数),但特别是对于这个问题,如果您不包含文字的

    N
    前缀,您可能还会失败...如果您在 SQL 字符串中有
    'Gardé'
    N'Gardé'
    。前者首先被解释为基本
    varchar
    值,因此非 ASCII 字符会丢失。后者被正确解释为
    nvarchar

  2. 您正在使用参数化查询(正如您应该的那样),但将参数类型设置为

    varchar
    而不是
    nvarchar
    (可能是隐式的,但无法显式键入参数)。同样,在这种情况下,该值首先会被处理为
    varchar
    ,其中非 ASCII 符号会丢失,然后再保存到
    nvarchar
    字段。

  3. Javascript 对 Unicode 的处理很弱,并且您将字符串从文件加载到 NodeJS 字符串的方式无法保留原始字符,然后再将其传递给 SQL。 (提示:仅仅因为我们告诉

    readFileSync()
    方法我们需要 utf8,并不意味着我们分配结果的字符串变量能够正确接收此结果。

  4. 原始文件实际上并不是以 UTF-8 存储,而是以 UTF-16、完整 Unicode 或其他支持宽字符的格式存储。

© www.soinside.com 2019 - 2024. All rights reserved.