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