programing

SQL Server 대/소문자 구분 검사?

lastmoon 2023. 6. 21. 22:53
반응형

SQL Server 대/소문자 구분 검사?

SQL Server의 데이터베이스가 대소문자를 구분하는지 확인하려면 어떻게 해야 합니까?이전에 쿼리를 실행했습니다.

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

하지만 이것이 실제로 과거에 저에게 문제를 주었기 때문에 저는 다른 방법을 찾고 있습니다.

- 정보 된 저장입니다.기존 제품에는 많은 사전 작성된 저장 프로시저가 있습니다. 프로시저에서는@test != @TEST서버 자체의 민감도에 따라 달라집니다.그래서 제가 찾고 있는 것은 서버의 민감도를 확인하는 가장 좋은 방법입니다.

데이터 정렬은 다양한 수준에서 설정할 수 있습니다.

  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

기본 정렬 옵션을 사용하여 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' 

두 번째 레코드 세트에는 기본 시나리오에서 다음 정보가 포함되어야 합니다.

열_이름 조합


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' 

는 대/ Server에서 결정합니다.COLLATION.

COLLATION다양한 수준에서 설정할 수 있습니다.

  1. 서버 수준
  2. 데이터베이스 수준
  3. 열 수준
  4. 식 수준

여기 MSDN 참조가 있습니다.

확인할 수 있습니다.COLLATIONRaj More의 답변에 언급된 것처럼 각 수준에서.

서버 데이터 정렬 확인

SELECT SERVERPROPERTY('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가치 이것을 시도해 보세요.

SELECT * FROM fn_helpcollations()

그리고 여러분은 이것과 같은 것을 봐야 합니다.

enter image description here

언제든지 입력할 수 있습니다.WHERE필터링하고 사용자에 대한 설명만 볼 절COLLATION.

여기에서 데이터 정렬 목록을 찾을 수 있습니다.

수집에 관심이 있으시군요.다음 스니펫을 기반으로 무언가를 만들 수 있습니다.

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

갱신하다
편집 내용을 기준으로 - 다음과 같은 경우@test그리고.@TESTSQL Server가 아닌 두 개의 다른 변수를 참조할 수 있습니다.동일한 변수가 자신과 동일하지 않은 문제가 발견되면 해당 변수가NULL,왜냐면NULL = NULLfalse를 반환합니다.

이미 만든 테이블로 작업하는 가장 좋은 방법은 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의 데이터베이스가 대소문자를 구분하는지 확인하려면 어떻게 해야 합니까?

아래 쿼리를 사용하여 정보가 제공된 데이터베이스가 대소문자를 구분하는지 여부 또는 이진 정렬(null 결과 포함)인지 여부를 반환할 수 있습니다.

;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.

언급URL : https://stackoverflow.com/questions/1411161/sql-server-check-case-sensitivity

반응형