SQL Server 확인 케이스 감수성?
-
05-07-2019 - |
문제
SQL Server의 데이터베이스가 케이스에 민감한 지 확인하려면 어떻게해야합니까? 이전에 쿼리를 실행했습니다.
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
그러나 나는 이것이 과거에 실제로 나에게 문제를 주었기 때문에 다른 방법을 찾고 있습니다.
편집 - 조금 더 많은 정보 : 기존 제품에는 사전 작성된 저장 절차가 많이 있습니다. 저장된 절차에서 @test != @TEST
서버 자체의 감도에 따라 제가 찾고있는 것은 서버가 민감도를 확인하는 가장 좋은 방법입니다.
해결책
Collation은 다양한 수준으로 설정할 수 있습니다.
- 섬기는 사람
- 데이터 베이스
- 열
따라서 Case Insensitive 데이터베이스에서 Case Consenitive 열을 가질 수 있습니다. 나는 아직 단일 열의 데이터 열의 사례 민감도를 위해 비즈니스 사례를 만들 수있는 상황을 아직 접하지 않았지만 그럴 수 있다고 생각합니다.
서버 Collation을 확인하십시오
SELECT SERVERPROPERTY('COLLATION')
데이터베이스 Collation을 확인하십시오
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
열 이하를 확인하십시오
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
다른 팁
기본 Collation 옵션이있는 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'
열 수준에서 Collation을 강제하여 쿼리를 변경할 수 있습니다.
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 문을 발행하여 다시 변경할 수 있습니다 (이전에 찾은 식별자를 이전에 찾은 식별자로 바꾸십시오).
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 Server는 케이스 감도를 결정합니다 COLLATION
.
COLLATION
다양한 레벨로 설정할 수 있습니다.
- 서버 레벨
- 데이터베이스 수준
- 열 수준
- 표현 수준
하나는 확인할 수 있습니다 COLLATION
언급 된 바와 같이 각 레벨에서 Raj More의 대답.
서버 Collation을 확인하십시오
SELECT SERVERPROPERTY('COLLATION')
데이터베이스 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 설명
각각에 대한 설명을 얻으려면 COLLATION
가치를 시도하십시오.
SELECT * FROM fn_helpcollations()
그리고 당신은 이와 같은 것을보아야합니다.
항상 a WHERE
필터링하고 설명 만 참조하십시오 COLLATION
.
콜라이트 목록을 찾을 수 있습니다 여기.
Collation에 관심이 있습니다. 이 스 니펫을 기반으로 무언가를 만들 수 있습니다.
SELECT DATABASEPROPERTYEX('master', 'Collation');
업데이트
편집에 따라 - if @test
그리고 @TEST
두 가지 변수를 참조 할 수 있으며 SQL Server가 아닙니다. 당신이 어디에 있는지 문제가 보이면 같은 변수는 그 자체와 같지 않습니다. 해당 변수가 있는지 확인하십시오. NULL
, 왜냐하면 NULL = NULL
`false를 반환합니다.
이미 생성 된 테이블과 함께 작업하는 가장 좋은 방법은 SQL Server Query 편집기로 이동하는 것입니다.
유형: 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는 CASE에 민감하지 않습니다. SELECT * FROM SomeTable
와 같다 SeLeCT * frOM soMetaBLe
.