SQL Server проверяет чувствительность к регистру? - PullRequest
46 голосов
/ 11 сентября 2009

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

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

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

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

Ответы [ 7 ]

70 голосов
/ 11 сентября 2009

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

  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
33 голосов
/ 11 сентября 2009

Если вы установили 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' 
7 голосов
/ 21 апреля 2015

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

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

  1. Сервер уровня
  2. База данных уровня
  3. Колонка уровня
  4. Выражение уровня

Вот ссылка на MSDN.

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

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

SELECT SERVERPROPERTY('COLLATION')

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

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

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

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

Проверка выражения выражения

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

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

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

Описание сортировки

Для получения описания каждого значения COLLATION попробуйте это.

SELECT * FROM fn_helpcollations()

И вы должны увидеть что-то подобное.

enter image description here

Вы всегда можете поместить предложение WHERE для фильтрации и увидеть описание только для вашего COLLATION.

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

4 голосов
/ 11 сентября 2009

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

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

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

2 голосов
/ 18 июля 2014

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

Тип: sp_help <tablename>

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

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

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

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

1 голос
/ 21 декабря 2016

Как проверить, чувствительна ли к регистру база данных в 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 ;).

0 голосов
/ 11 сентября 2009

SQL Server не чувствителен к регистру. SELECT * FROM SomeTable совпадает с SeLeCT * frOM soMetaBLe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...