为了执行情况敏感的搜索/代表在SQL服务器2000/2005数据库,必须使用正确的排序规则。

你怎么确定是否默认排序规则对于一个数据库情况下,敏感的,如果不是,则如何执行敏感的搜索/替换?

有帮助吗?

解决方案

SELECT testColumn FROM testTable  
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'example' 

SELECT testColumn FROM testTable
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE' 

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 

不要假设默认排序规则区分大小写,只需每次都指定区分大小写(当然使用正确的排序方式)

其他提示

确定默认排序规则是否区分大小写,如下所示:

select charindex('RESULT','如果结果为0,则表示区分大小写的排序模式')

结果为0表示您处于区分大小写的排序规则模式,8表示它不区分大小写。

如果排序规则不区分大小写,则需要在执行搜索/替换时显式声明要使用的排序规则模式。

以下是如何通过指定要使用的排序规则模式来构造UPDATE语句以执行区分大小写的搜索/替换:

update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0

这将匹配并替换'THECONTENT',而不是'TheContent''thecontent'

如果您在同一字段中有不同的案例,并且只想替换特定案例,那么您可以使用 REPLACE 函数中的排序规则:

UPDATE tableName
SET fieldName = 
    REPLACE(
        REPLACE(
            fieldName COLLATE Latin1_General_CS_AS,
            'camelCase' COLLATE Latin1_General_CS_AS,
            'changedWord'
        ),
        'CamelCase' COLLATE Latin1_General_CS_AS,
        'ChangedWord'
    )

这将导致:

This is camelCase 1 and this is CamelCase 2

成为:

This is changedWord 1 and this is ChangedWord 2

可以在多个语句中完成。 如果您的长字符串同时包含您要替换的大写单词,则将不会。 您可能还需要使用不同的排序规则,这是重音和区分大小写的。

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      ,REPLACE([String], 'Favourite','Favorite') ReplacedString
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%Favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      , REPLACE([String], 'favourite','favorite') ReplacedString 
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

首先检查一下: http://technet.microsoft.com/en-us /library/ms180175(SQL.90).aspx

您将看到CI指定不区分大小写,CS指定区分大小写。

此外,这可能是有用的。select*from fn_helpcollations()-该得到所有的排序规则你的服务器支持。select*from sys.数据库-这里有一列,用于指定什么排序规则拥有每个数据库服务器上。

您可以在每次查询表时指定排序规则,也可以通过更改表永久地将排序规则应用于列。

如果您确实选择执行查询方法,那么包含不区分大小写的搜索参数也是有益的。如果包含SQL,您将看到SQL将选择更高效的exec计划。例如:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top