Windows Server 上的字符问题,而不是 Unix 上的字符问题(字符)

Character issue on Windows Server, not on Unix (� characters)

提问人:Miguel Stevens 提问时间:9/20/2023 最后编辑:Miguel Stevens 更新时间:9/21/2023 访问量:67

问:

在我的 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 中)时,该字符会正确保存在数据库中。é

有谁知道我是否遗漏了什么?

节点.js SQL-Server Prisma 排序规则

评论

2赞 Panagiotis Kanavos 9/20/2023
应用程序 bug 尝试使用错误的代码页插入非 Unicode 数据。该数据将丢失。 是 Unicode 替换字符,正好用于这种情况 - 当一个代码页中的字符转换为另一个没有匹配字符的代码页时。
2赞 Panagiotis Kanavos 9/20/2023
@MiguelStevens发布应用程序代码。这就是错误所在。正确的解决方案是使用带参数的查询,而不是字符串连接或插值。除了此类错误之外,这还会使您面临 SQL 注入攻击。想象一下,如果有人进入会发生什么'; DROP TABLE USERS;--
1赞 Thom A 9/20/2023
请避免使用“txt spk”,@ViralJain。对于以英语为母语的人来说,它有时会让人感到困惑,而对于非母语的人来说,老实说,它会使句子看起来像是胡说八道;我们不是在每条消息限制为 160 个字符的世界。
1赞 Igor 9/20/2023
该值在文本文件中显示是否正确?文本文件的编码是 utf8 吗?如果是这样,那么下一步就是在您的问题中分享相关代码。更好的是,创建一个最小的可重现示例
1赞 GSerg 9/20/2023
因为本地文件是 utf8?

答:

0赞 Joel Coehoorn 9/21/2023 #1

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

  1. 您正在使用字符串连接或插值将此数据包含在查询中。这已经是错误的(您应该使用查询参数),但特别是对于此问题,如果您不包含文本的前缀,您可能会失败...如果您在 SQL 字符串中而不是 .前者首先被解释为基本值,因此非 ASCII 字符会丢失。后者被正确地解释为 .N'Gardé'N'Gardé'varcharnvarchar

  2. 您正在使用参数化查询(您应该这样做),但将参数类型设置为 instead(可能是隐式的,因为未能显式键入参数)。同样,在这种情况下,在保存到字段之前,首先将值处理为非 ASCII 符号丢失的位置。varcharnvarcharvarcharnvarchar

  3. Javascript 对 Unicode 的处理很弱,并且您以无法保留原始字符的方式将字符串从文件加载到 nodejs 字符串,然后再将其传递给 SQL。(提示:仅仅因为我们告诉方法我们需要 utf8,并不意味着我们为其分配结果的字符串变量能够正确接收此结果。readFileSync()

  4. 原始文件实际上不是以 UTF-8 存储的,而是以 UTF-16、完整的 Unicode 或其他支持宽字符的格式存储的,因此将其解释为 UTF-8 会破坏字符。