找不到罗马尼亚语(标准)键盘

时间:2015-05-12 09:47:42

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

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

罗马尼亚语有两种不同的键盘设置 - 标准版和旧版。从'Rom(标准)键盘插入的字母'Ş'具有ASCII代码63,来自Legacy,它是170。

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

如果我可以用char(170)替换char(63),那将很简单,但我无法检测到具有字符63的行。下一个select不返回行:

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)的行。

请帮我找到错误的'Ş'

这些行

2 个答案:

答案 0 :(得分:3)

首先从我的评论中,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

答案 1 :(得分:1)

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
?
Ș