在我的 NodeJS 脚本中,我使用 Prisma 库写入数据库。
我要添加的字段是
NVARCHAR(1000)
字段。所以应该接受这个角色吧?
字符串输入来自
fs.readFileSync(customJobPath, 'utf8')
,我正在读取带有数据的txt文件
我有以下这个词
Gardé
Gard�
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation;
检查了两个数据库的排序规则,并且在这两种情况下它都设置为 SQL_Latin1_General_CP1_CI_AS
é
字符并保存(在Tableplus中)时,它会正确保存在数据库中。有人知道我是否缺少什么吗?
问题中没有足够的信息来确定,但我怀疑您遇到以下三个问题之一:
您正在使用字符串连接将此数据包含在查询中。这已经是错误的(您应该使用查询参数),但专门针对此问题,您也未能包含文字的
N
前缀。因此,SQL 字符串中包含 'Gardé'
,而不是 N'Gardé'
。前者首先被解释为基本 varchar
值,因此非 ASCII 字符会丢失。后者被正确解释为 nvarchar
。
您正在使用参数化查询(正如您应该的那样),但将参数类型设置为
varchar
而不是 nvarchar
(可能是隐式的,但无法显式键入参数)。同样,在这种情况下,该值首先被处理为 varchar
,其中非 ASCII 符号会丢失,然后再保存到 nvarchar
字段。
Javascript 对 Unicode 的处理很弱,并且您将字符串从文件加载到 NodeJS 字符串的方式无法保留原始字符,然后再将其传递给 SQL。 (提示:仅仅因为我们告诉
readFileSync()
方法我们需要 utf8,并不意味着我们分配结果的字符串变量能够正确接收此结果。