【问题标题】:DB collation VS Column collation when INSERTing插入时的 DB 排序规则 VS 列排序规则
【发布时间】:2021-09-10 18:07:48
【问题描述】:

我已经创建了 2 个演示数据库。

服务器排序规则 - 希伯来语_CI_AS

DB1 排序规则 - 希伯来语_CI_AS

DB2 排序规则 - Latin1_General_CS_AS。

在 DB2 中,我有一列带有希伯来语_CI_AS 排序规则。我正在尝试将希伯来语文本插入该列。数据类型为nvarchar(250)

这是示例脚本:

INSERT INTO [Table] (HebCol)
VALUES('1בדיקה')

当我在 DB1 上运行它时,一切正常。

在 DB2 上,虽然该列有希伯来语排序规则,但我得到的是问号而不是希伯来语文本。

如果排序规则相同,为什么结果会不同?

P.S:我不能在正文前添加N。在现实世界中,应用正在执行插入操作。

【问题讨论】:

  • “PS:我不能在文本前添加 N。在现实世界中,应用程序正在执行插入操作。” 然后习惯于在您的数据中使用 ?。 ..或更改数据库的排序规则。文字字符串将在您当前连接到的数据库的排序规则中解释,而不是目标列的。
  • 感谢您的回复。那么列排序有什么影响呢?
  • 如果不明确更改其中一个排序规则@Itai,则无法比较不同排序规则的字符串。这意味着您将能够比较 2 个数据库中的值,而无需显式更改其中一个的排序规则,因此查询将是 SARGable。虽然我个人发现通常人们会设计带有 2 列的数据库;一个在数据库的排序规则中,然后在另一个作为(持久)计算列中。然后在与使用不同排序规则的数据库进行比较时使用后者,而前者在同一个数据库中。

标签: sql-server collation


【解决方案1】:

当使用文字字符串时,使用的排序规则是数据库的排序规则,不是目标列。由于您要插入的数据库的排序规则是Latin1_General_CS_AS,因此对于文字字符串'1בדיקה',大多数字符都在排序规则的代码页之外;因此你会得到? 那些未知的字符。

因此,只有 2 个解决方案可以阻止 ? 出现在列中:

  1. 修复您的应用程序并将您的文字字符串定义为nvarchar 不是 varchar;毕竟你存储了一个nvarchar,所以传递一个文字nvarchar是有意义的。
  2. 将数据库的排序规则更改为与其他数据库相同,Hebrew_CI_AS

从技术上讲,如果您在 SQL Server 2019 上,则使用 UTF-8 排序规则,但这种排序规则带有我认为不在此问题范围内的警告。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2018-12-19
    相关资源
    最近更新 更多