我在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)的行。
请帮我找到错误的'Ş'
这些行答案 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,如本帖所示:
答案 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
?
Ș