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

Для этого я изучил под управлением ЛАТЕКСНЫЕ приложения для генерации PDF. Хотя эта опция, вероятно, будет намного более сложной и мощной, чем те перечисленные здесь.

48
задан shA.t 25 May 2015 в 05:18
поделиться

4 ответа

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

  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
71
ответ дан 7 November 2019 в 12:17
поделиться

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

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

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' 
33
ответ дан 7 November 2019 в 12:17
поделиться

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

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

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

4
ответ дан 7 November 2019 в 12:17
поделиться

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

-2
ответ дан 7 November 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: