SQL Server проверяет чувствительность к регистру?
Как проверить, проверена ли база данных на SQL Server с учетом регистра? Я ранее выполнял запрос:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
Но я ищу другие способы, поскольку это действительно дало мне проблемы в прошлом.
Изменить - Немного больше информации:
В существующем продукте есть много предварительно записанных хранимых процедур. В хранимой процедуре @test != @TEST
в зависимости от чувствительности самого сервера. Так что я ищу, это лучший способ проверить сервер на его чувствительность.
Ответы
Ответ 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
.