Вопрос

Как я могу проверить, чувствительна ли база данных в SQL Server к регистру?Ранее я запускал запрос:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

Но я ищу другие способы, поскольку в прошлом это действительно вызывало у меня проблемы.

Редактировать - Немного больше информации:Существующий продукт имеет множество предварительно написанных хранимых процедур.В хранимой процедуре @test != @TEST в зависимости от чувствительности самого сервера.Итак, то, что я ищу, - это лучший способ проверить сервер на его чувствительность.

Это было полезно?

Решение

Параметры сортировки могут быть установлены на различных уровнях:

  1. Сервер
  2. База данных
  3. Колонна

Таким образом, у вас мог бы быть столбец с учетом регистра в базе данных без учета регистра.Я еще не сталкивался с ситуацией, когда можно было бы привести экономическое обоснование чувствительности к регистру в одном столбце данных, но я полагаю, что это возможно.

Проверьте параметры сортировки сервера

SELECT SERVERPROPERTY('COLLATION')

Проверьте параметры сортировки базы данных

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

Проверка сортировки столбцов

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

Другие советы

Если вы установили SQL Server с параметрами сортировки по умолчанию, вы можете обнаружить, что следующие запросы возвращают одинаковые результаты:

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

Вы можете изменить свой запрос, применив сопоставление на уровне столбца:

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

Поскольку изменение этого параметра может повлиять на приложения и запросы SQL, я бы сначала изолировал этот тест. Начиная с SQL Server 2000, вы можете легко выполнить инструкцию ALTER TABLE, чтобы изменить порядок сортировки определенного столбца, заставив его учитывать регистр символов. Сначала выполните следующий запрос, чтобы определить, на что вам нужно изменить его обратно:

EXEC sp_help 'mytable' 

Второй набор записей должен содержать следующую информацию в сценарии по умолчанию:

Column_Name Collation

<Ч>

mycolumn SQL_Latin1_General_CP1_CI_AS

Независимо от того, что возвращает столбец «Сопоставление», теперь вы знаете, на что нужно его изменить, после внесения следующего изменения, которое приведет к чувствительности к регистру:

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

Если это все испортило, вы можете изменить его обратно, просто выполнив новую инструкцию ALTER TABLE (обязательно замените мой идентификатор COLLATE на тот, который вы нашли ранее):

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

Если вы застряли на SQL Server 7.0, вы можете попробовать этот обходной путь, который может быть немного большим ударом по производительности (вы должны получить результат только для первого совпадения):

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SQL-сервер определяет чувствительность к регистру с помощью COLLATION.

WHERE можно установить на разных уровнях.

<Ол>
  • Сервер уровня
  • База данных уровня
  • <Литий> на уровне столбцов
  • Выражение уровня
  • Вот ссылка на MSDN.

    Можно проверить <=> на каждом уровне, как указано в ответе Радж Мора .

    Проверка параметров сортировки сервера

    SELECT SERVERPROPERTY('COLLATION')
    

    Проверить сопоставление базы данных

    SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
    

    Проверить сопоставление столбцов

    select table_name, column_name, collation_name
    from INFORMATION_SCHEMA.COLUMNS
    where table_name = @table_name
    

    Проверить сопоставление выражений

    Для уровня выражения <=> вам нужно взглянуть на выражение. :)

    Обычно это будет в конце выражения, как в примере ниже.

    SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
    

    Описание сопоставления

    Чтобы получить описание каждого значения <=>, попробуйте это.

    SELECT * FROM fn_helpcollations()
    

    И вы должны увидеть что-то вроде этого.

    введите описание изображения здесь

    Вы всегда можете поместить предложение <=> в фильтр и просмотреть описание только для своего <=>.

    Вы можете найти список параметров сортировки здесь. .

    Вас интересует сопоставление.Вы могли бы создать что-то на основе этого фрагмента:

    SELECT DATABASEPROPERTYEX('master', 'Collation');
    

    Обновить
    На основании вашей правки — Если @test и @TEST может ли когда-либо ссылаться на две разные переменные, это не SQL Server.Если вы видите проблемы, связанные с то же самое переменная не равна самой себе, проверьте, равна ли эта переменная NULL, потому что NULL = NULL возвращает значение false.

    Лучший способ работы с уже созданными таблицами состоит в том, что Перейти в редактор запросов к SQL Server

    Тип: sp_help <tablename>

    Это покажет структуру таблицы, см. подробности для нужного поля в столбце COLLATE.

    затем введите запрос как:

    SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
    

    Это может быть другая символьная схема < SQL_Latin1_General_CP1_CI_AS > ;, поэтому лучше узнать точную схему, которая использовалась для этого столбца.

      

    Как проверить, чувствительна ли к регистру база данных в SQL Server?

    Вы можете использовать приведенный ниже запрос, который возвращает вашу информированную базу данных с учетом регистра или нет или находится в двоичной сортировке (с нулевым результатом):

    ;WITH collations AS (
        SELECT 
            name,
            CASE 
                WHEN description like '%case-insensitive%' THEN 0 
                WHEN description like '%case-sensitive%' THEN 1 
            END isCaseSensitive
        FROM 
            sys.fn_helpcollations()
    )
    SELECT *
    FROM collations
    WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));
    

    Подробнее читайте в этой информации MSDN ;).

    SQL Server не чувствителен к регистру. SELECT * FROM SomeTable - это то же самое, что и SeLeCT * frOM soMetaBLe.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top