Подтвердить что ты не робот

SQL Server проверяет чувствительность к регистру?

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

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

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

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

4b9b3361

Ответ 1

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

  • Сервер
  • База данных
  • Столбец

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

Проверить сортировку сервера

SELECT SERVERPROPERTY('COLLATION')

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

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

Проверить столбцы Column

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

Ответ 2

Если вы установили 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

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

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' 

Ответ 3

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

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

  • Сервер уровня
  • База данных уровня
  • на уровне столбцов
  • Выражение уровня

Вот ссылка MSDN.

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

Проверить сортировку сервера

SELECT SERVERPROPERTY('COLLATION')

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

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

Проверить столбцы Column

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

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

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

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

Ответ 5

Лучший способ работы с уже созданными таблицами состоит в том, Перейдите в редактор запросов 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 > , поэтому лучше узнать точную схему, которая была использована против этого столбца.

Ответ 6

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

Ответ 7

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