문제

SQL Server의 데이터베이스가 케이스에 민감한 지 확인하려면 어떻게해야합니까? 이전에 쿼리를 실행했습니다.

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

그러나 나는 이것이 과거에 실제로 나에게 문제를 주었기 때문에 다른 방법을 찾고 있습니다.

편집 - 조금 더 많은 정보 : 기존 제품에는 사전 작성된 저장 절차가 많이 있습니다. 저장된 절차에서 @test != @TEST 서버 자체의 감도에 따라 제가 찾고있는 것은 서버가 민감도를 확인하는 가장 좋은 방법입니다.

도움이 되었습니까?

해결책

Collation은 다양한 수준으로 설정할 수 있습니다.

  1. 섬기는 사람
  2. 데이터 베이스

따라서 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 다양한 레벨로 설정할 수 있습니다.

  1. 서버 레벨
  2. 데이터베이스 수준
  3. 열 수준
  4. 표현 수준

다음은 MSDN 참조입니다.

하나는 확인할 수 있습니다 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()

그리고 당신은 이와 같은 것을보아야합니다.

enter image description here

항상 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top