【问题标题】:SQL Server 2017 Collation for special character (Hawaiian 'Okina) leads to "?" string behaviorSQL Server 2017 特殊字符(夏威夷'Okina)排序规则导致“?”字符串行为
【发布时间】:2021-09-08 09:51:42
【问题描述】:

我需要插入一些夏威夷语 'Okina 字符串名称为 'Kapiʻolani';但是在 SQL Server 2017 数据库中,它显示为带有问号的Kapi?olani

我做了一些研究并尝试过这样article's solution

CREATE TABLE Organization3 (Name NVARCHAR(250) COLLATE Japanese_XJIS_140_BIN2); 

插入值后:

INSERT INTO Organization3 
      ([Name])
      values
      ('Kapi''olani')
update unicas_config.dbo.Organization3  set Name = 'Kapiʻolani'

它仍然显示如下:Kapi?olani(带问号)。

有什么解决方案可以让它正确显示吗?非常感谢

【问题讨论】:

  • 您需要使用set Name = N'Kapiʻolani',即告诉它您插入的是 nvarchar 而不是 varchar。
  • @DaleK 它有效!非常感谢
  • @DaleK 请问我是否需要“ ʻ”,我需要将 Collat​​ion 设置为其中任何一个可以支持 Unicode 的吗?
  • 对不起,我不太明白你在问什么。但是试试看!
  • @DaleK,我做到了,它有效!再次感谢您

标签: sql sql-server tsql sql-server-collation


【解决方案1】:

您应该使用 N 前缀(即N'Kapiʻolani')来指定它是一个 Unicode 字符串(正如 cmets 中已经指出的那样)。

排序规则仅对排序和比较(以及执行比较以执行其任务的字符串相关函数)很重要。

例如,以下 SELECT-s 返回不同的结果:

CREATE TABLE #t (x NVARCHAR(100))
INSERT INTO #t VALUES (N'Kapiʻolani'),(N'KAPIʻOLANI'),(N'Kapi''olani'),(N'Kapiolani'),(N'Kapi olani')

SELECT DENSE_RANK() OVER (ORDER BY x COLLATE Latin1_General_100_CI_AI), * FROM #t ORDER BY 1
SELECT DENSE_RANK() OVER (ORDER BY x COLLATE Latin1_General_100_CI_AS), * FROM #t ORDER BY 1
SELECT DENSE_RANK() OVER (ORDER BY x COLLATE Latin1_General_100_CS_AI), * FROM #t ORDER BY 1
SELECT DENSE_RANK() OVER (ORDER BY x COLLATE Latin1_General_100_CS_AS), * FROM #t ORDER BY 1
SELECT DENSE_RANK() OVER (ORDER BY x COLLATE Latin1_General_100_BIN), * FROM #t ORDER BY 1

DROP TABLE #t

使用返回您期望的数据的排序规则。

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 2019-03-22
    • 2015-12-31
    • 2018-03-18
    • 2015-08-26
    • 2014-05-20
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多