【问题标题】:Cannot find letter 'ș' or 'Ș' inserted from Romanian (Standard) keyboard找不到从罗马尼亚语(标准)键盘插入的字母 'ș' 或 'Ș'
【发布时间】:2015-05-12 09:47:42
【问题描述】:

我在 sql server 2012 中有一个表,其中一列是 nvarchar。它包含罗马尼亚语字符。我们注意到只有部分字母 'Ș' 根本不显示在报告中,所以我发现这取决于键盘设置。

罗马尼亚语有两种不同的键盘设置 - 标准和传统。字母 'Ș' - 从 Rom(标准)键盘插入的 ASCII 代码为 63,从 Legacy 为 170。

带有 CHAR(170) 的字母 'Ş' - 显示在报告中,但 CHAR(63) - 不显示 - 即使它是同一个字母(应该是)。

如果我可以将 char(63) 替换为 char(170) 会很简单,但是我无法检测到字符为 63 的行。下一个选择不会返回行:

select * from table1 where columnname like '%'+CHAR(63)+'%'

即使我执行select ASCII(SUBSTRING(columnname , 1, 1)),它也会返回“63”。

即使select charindex(char(63), columnname) - 返回我 0

我也尝试过整理:

select * from table1 where columnname COLLATE Latin1_general_CI_AI like N'%s%'

它没有帮助 - 它只返回带有 's' 和 char(170) 的行。

请帮我找出这些带有错误'Ş'的行

【问题讨论】:

  • 我认为 CHAR(63) 具有误导性,因为它代表 sql server 无法显示的字符:stackoverflow.com/questions/6441208/…
  • 是的,刚刚发现 char(ASCII(SUBSTRING(columnname, 1, 1))) 返回我 '?'谢谢你的链接

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

所以首先从我的 cmets 来看,CHAR(63) 具有误导性,因为它代表 sql server 无法显示的字符:

Unable to replace Char(63) by SQL query

问题可能在于您选择的排序规则,就像我运行此示例一样,我得到了包含特殊字符的 2 行:

CREATE TABLE #temp ( val NVARCHAR(50) )

INSERT  INTO #temp
        ( val )
VALUES  ( N'Șome val 1' ),
        ( N'some val 2' ),
        ( N'șome other val 3' )

SELECT  *
FROM    #temp
WHERE   val COLLATE Latin1_General_BIN LIKE N'%ș%'
        OR val COLLATE Latin1_General_BIN LIKE N'%Ș%'

DROP TABLE #temp

输出

val
=================
Șome val 1
șome other val 3

指定的排序规则是:Latin1_General_BIN,见这篇文章:

replace only matches the beginning of the string

【讨论】:

    【解决方案2】:
    WHERE columnname LIKE N'%'+NCHAR(536)+'%'
    

    这应该可以帮助您找到该字符,即使它是作为未知字符插入的,如下面的第一个插入。

    DECLARE @Table TABLE (text nvarchar(50))
    INSERT INTO @Table(text)
    SELECT 'Ș'
    UNION ALL
    SELECT N'Ș'
    
    SELECT UNICODE(text) UNICODE
    FROM @Table
    

    结果:

    UNICODE
    63
    536
    

    'Ș' 是 NCHAR(536),'ș' 是 NCHAR(537)。 如果你这样做:

    SELECT * FROM @Table WHERE text LIKE N'%'+NCHAR(536)+'%'
    

    结果:

    text
    ?
    Ș
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多