SQL Server - 特殊字符ª和º的问题

时间:2014-12-12 13:26:37

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

我遇到特殊字符ª和º

的问题

我想做这样的事情:

SELECT * FROM tabla WHERE name like '%'ª'%'

- 或相同 -

SELECT * FROM tabla WHERE name like '%'+char(170)+'%'

SELECT * FROM tabla WHERE name like '%'º'%'

- 或相同 -

SELECT * FROM tabla WHERE name like '%'+char(176)+'%'

但结果,在第一种情况下是带有“a”的名称,在第二种情况下是带有“o”的名称

任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:1)

以下排序规则将CHAR(170)读为" a":

  • SQL_Croatian_CP1250_CI_AS
  • SQL_Croatian_CP1250_CS_AS
  • SQL_Czech_CP1250_CI_AS
  • SQL_Czech_CP1250_CS_AS
  • SQL_Hungarian_CP1250_CI_AS
  • SQL_Hungarian_CP1250_CS_AS
  • SQL_Latin1_General_CP1250_CI_AS
  • SQL_Latin1_General_CP1250_CS_AS
  • SQL_Polish_CP1250_CI_AS
  • SQL_Polish_CP1250_CS_AS
  • SQL_Romanian_CP1250_CI_AS
  • SQL_Romanian_CP1250_CS_AS
  • SQL_Slovak_CP1250_CI_AS
  • SQL_Slovak_CP1250_CS_AS
  • SQL_Slovenian_CP1250_CI_AS
  • SQL_Slovenian_CP1250_CS_AS

使用可以使用此代码根据支持的排序规则测试字符:

DECLARE @query VARCHAR(MAX) = '';
DECLARE @charNumber VARCHAR(3) = 170; 
DECLARE @testText VARCHAR(255) = 'asd';

SELECT  @query = @query 
+ CASE WHEN @query > '' THEN 'UNION ALL ' ELSE '' END
+ 'SELECT Name = ''' + name + ''', ConvertsChar = CASE WHEN ''' + @testText + ''' COLLATE ' + name + ' LIKE ''%''+char(' + @charNumber + ')+''%'' COLLATE ' + name + ' THEN 1 ELSE 0 END ' 
FROM sys.fn_helpcollations() 
WHERE name LIKE 'SQL%';

EXEC('SELECT * FROM (' + @query + ') a ORDER BY ConvertsChar DESC, Name;');

正如@Lamak在评论中所建议的那样,您可以将您的名称列整理为Latin1_General_CI_AS或其他排序规则,以避免这种情况。