在我的 Windows Server 2019 上,在我的 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,并不意味着我们分配结果的字符串变量能够正确接收此结果。
原始文件实际上并不是以 UTF-8 存储,而是以 UTF-16、完整 Unicode 或其他支持宽字符的格式存储。