提问人:Miguel Stevens 提问时间:9/20/2023 最后编辑:Miguel Stevens 更新时间:9/21/2023 访问量:67
Windows Server 上的字符问题,而不是 Unix 上的字符问题(字符)
Character issue on Windows Server, not on Unix (� characters)
问:
在我的 Windows Server 2019 上:在我的 NodeJS 脚本中,我使用 Prisma 库写入数据库。
我要添加此字段的字段是一个字段。所以应该接受这个角色,对吧?NVARCHAR(1000)
字符串输入来自 ,我正在读取一个包含数据的 txt 文件fs.readFileSync(customJobPath, 'utf8')
我有以下一句话Gardé
- 现在在我的本地数据库中,它已正确保存
- 在我的生产MSSQL数据库中,它被输入为
Gard�
我试过什么
- 我已经使用 检查了两个数据库的排序规则,在这两种情况下,它都设置为
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation;
SQL_Latin1_General_CP1_CI_AS
- 手动插入字符并保存(在 Tableplus 中)时,该字符会正确保存在数据库中。
é
有谁知道我是否遗漏了什么?
答:
问题中没有足够的信息来确定,但我怀疑您有四个问题中的一个(或多个):
您正在使用字符串连接或插值将此数据包含在查询中。这已经是错误的(您应该使用查询参数),但特别是对于此问题,如果您不包含文本的前缀,您可能会失败...如果您在 SQL 字符串中而不是 .前者首先被解释为基本值,因此非 ASCII 字符会丢失。后者被正确地解释为 .
N
'Gardé'
N'Gardé'
varchar
nvarchar
您正在使用参数化查询(您应该这样做),但将参数类型设置为 instead(可能是隐式的,因为未能显式键入参数)。同样,在这种情况下,在保存到字段之前,首先将值处理为非 ASCII 符号丢失的位置。
varchar
nvarchar
varchar
nvarchar
Javascript 对 Unicode 的处理很弱,并且您以无法保留原始字符的方式将字符串从文件加载到 nodejs 字符串,然后再将其传递给 SQL。(提示:仅仅因为我们告诉方法我们需要 utf8,并不意味着我们为其分配结果的字符串变量能够正确接收此结果。
readFileSync()
原始文件实际上不是以 UTF-8 存储的,而是以 UTF-16、完整的 Unicode 或其他支持宽字符的格式存储的,因此将其解释为 UTF-8 会破坏字符。
评论
�
'; DROP TABLE USERS;--