生产中的字符问题,而不是本地数据库中的字符问题(� 字符)

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

在我的 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 sql-server collation
1个回答
0
投票

问题中没有足够的信息来确定,但我怀疑您遇到以下三个问题之一:

  1. 您正在使用字符串连接将此数据包含在查询中。这已经是错误的(您应该使用查询参数),但专门针对此问题,您也未能包含文字的

    N
    前缀。因此,SQL 字符串中包含
    'Gardé'
    ,而不是
    N'Gardé'
    。前者首先被解释为基本
    varchar
    值,因此非 ASCII 字符会丢失。后者被正确解释为
    nvarchar

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

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

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

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

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