문제

"어디에"조항이 대소 문자를 사용하지 않는 SQL 쿼리 (MS SQL Server)를 어떻게 구성합니까?

SELECT * FROM myTable WHERE myField = 'sOmeVal'

결과가 사건을 무시하고 다시 오기를 원합니다.

도움이 되었습니까?

해결책

SQL Server 데이터베이스의 기본 구성에서 문자열 비교 ~이다 사례에 민감합니다. 데이터베이스 가이 설정을 대체 컴퓨팅을 사용 하여이 설정을 무시한 경우 쿼리에서 사용할 수있는 종류의 Collation을 지정해야합니다.

SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS

내가 제공 한 Collation은 예제 일뿐입니다. SQL Server Collations의보다 철저한 개요를 찾을 수 있습니다. 여기.

다른 팁

일반적으로 문자열 비교는 사례에 민감합니다. 데이터베이스가 CASE 민감한 Collation으로 구성된 경우 Case Insensitive Sensitive를 강제로 사용해야합니다.

SELECT balance FROM people WHERE email = 'billg@microsoft.com'
  COLLATE SQL_Latin1_General_CP1_CI_AS 

다른 곳에서 다른 해결책을 찾았습니다. 즉, 사용합니다

upper(@yourString)

그러나 여기의 모든 사람들은 SQL Server에서 어쨌든 사건을 무시하고 있기 때문에 중요하지 않다고 말하고 있습니까? 데이터베이스가 대소 문자를 사용한다고 확신합니다.

아니요, 만 사용합니다 LIKE 작동 안 할 것이다. LIKE 주어진 패턴과 정확히 일치하는 값을 검색합니다. 이 경우 LIKE 'someval'이 아닌 텍스트 'someval'만 찾을 수 있습니다.

실용 가능한 솔루션이 사용 중입니다 LCASE() 기능. LCASE('sOmeVal') 텍스트의 소문자 문자열 'someval'을 가져옵니다. 비교의 양쪽 에이 기능을 사용하는 경우 다음과 같이 작동합니다.

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

이 진술은 두 개의 소문자 문자열을 비교하여 'someval'이 'someval'(예 : 'someval', 'someval'등의 모든 표기법과 일치하도록합니다.

상위 2 개의 답변 ( 아담 로빈슨 그리고 Andrejs Cainikovs)는 기술적으로 작동한다는 점에서 다소 정확하지만 설명은 잘못되었으므로 많은 경우 오해의 소지가있을 수 있습니다. 예를 들어, SQL_Latin1_General_CP1_CI_AS Collation은 많은 경우에 작동 할 것이며 적절한 사례에 민감하지 않은 것으로 가정해서는 안됩니다. 실제로, OP가 케이스에 민감한 (또는 이진) 콜레이션으로 데이터베이스에서 작동한다는 점을 감안할 때 OP는 많은 설치 (특히 OS에 설치된 모든 설치에 대한 기본체 인 Collation을 사용하지 않는다는 것을 알고 있습니다. 미국 영어를 언어로 사용) : SQL_Latin1_General_CP1_CI_AS. 물론, OP ~할 수 있었다 사용하고 있습니다 SQL_Latin1_General_CP1_CS_AS, 그러나 함께 일할 때 VARCHAR 데이터, 데이터 손실로 이어질 수 있으므로 코드 페이지를 변경하지 않는 것이 중요하며, 이는 Collation의 로케일 / 문화 (예 : Latin1_general vs French vs Hebrew 등)에 의해 제어됩니다. 아래 9 번 지점을 참조하십시오.

다른 네 가지 답변은 다양한 정도에 잘못입니다.

독자들이 희망적으로 가장 적절하고 효율적인 선택을 할 수 있도록 여기서 모든 오해를 명확히 할 것입니다.

  1. 사용하지 마세요 UPPER(). 그것은 완전히 불필요한 추가 작업입니다. a COLLATE 절. 문자열 비교는 두 경우 모두에서 수행해야하지만 UPPER() 또한 문자별로 문자를 확인하고 상위 사례 맵핑이 있는지 확인한 다음 변경해야합니다. 그리고 당신은 양쪽에서 이것을해야합니다. 첨가 COLLATE 기본적으로 진행되는 것과 다른 규칙 세트를 사용하여 정렬 키를 생성하도록 처리를 지시합니다. 사용 COLLATE 사용하는 것보다 확실히 더 효율적입니다 (또는 그 단어를 좋아하는 경우 :) UPPER(), 이것에서 입증 된 바와 같이 테스트 스크립트 (페이스트 빈에서).

    문제도 있습니다 @ceisc에 의해 @Danny의 답변에 대해 언급 :

    일부 언어에서는 케이스 변환이 왕복되지 않습니다. 즉, 하부 (x)! = 하부 (상단 (x)).

    터키 어퍼 케이스 "İ"가 일반적인 예입니다.

  2. 아니요, Collation은 적어도 이러한 맥락에서는 데이터베이스 전체 설정이 아닙니다. 데이터베이스 레벨 기본 콜레이션이 있으며, 지정하지 않는 변경 및 새로 생성 된 열의 기본값으로 사용됩니다. COLLATE 절 (이 일반적인 오해가 나오는 곳)이지만 문자열 리터럴과 변수를 다른 문자열 리터럴 및 변수와 비교하거나 데이터베이스 레벨 메타 데이터를 참조하지 않는 한 쿼리에 직접 영향을 미치지 않습니다.

  3. 아니요, Collation은 쿼리 당이 아닙니다.

  4. 콜라이트입니다 술어 당 (즉, 쿼리 당 아닌 표현 또는 표현. 그리고 이것은 단지 전체 쿼리에 해당됩니다. WHERE 절. 여기에는 결합, 그룹 by, 주문, 파티션 등을 포함합니다.

  5. 아니요, 변환하지 마십시오 VARBINARY (예 :convert(varbinary, myField) = convert(varbinary, 'sOmeVal')) 다음과 같은 이유로 :

    1. 그것은 바이너리 비교입니다. 이는 대소 문자를 사용하지 않습니다 (이 질문이 요구하는 것입니다).
    2. 이진 비교를 원한다면 바이너리 콜레이션을 사용하십시오. 끝나는 것을 사용하십시오 _BIN2 SQL Server 2008 또는 새로 사용하는 경우에는 선택의 여지가 없습니다. _BIN. 데이터가있는 경우 NVARCHAR 그렇다면이 경우에 모두 동일하기 때문에 어떤 로케일을 사용하는지는 중요하지 않으므로 Latin1_General_100_BIN2 항상 작동합니다. 데이터가있는 경우 VARCHAR, 데이터가 현재있는 것과 동일한 로케일을 사용해야합니다 (예 : Latin1_General, French, Japanese_XJIS, 로케일이 사용되는 코드 페이지를 결정하고 코드 페이지를 변경하면 데이터가 변경 될 수 있습니다 (즉, 데이터 손실).
    3. 크기를 지정하지 않고 가변 길이 데이터 유형을 사용하면 기본 크기에 의존하며 데이터 유형이 사용되는 컨텍스트에 따라 두 가지 다른 기본값이 있습니다. 문자열 유형의 경우 1 또는 30입니다. 함께 사용될 때 CONVERT() 30 기본값을 사용합니다. 위험은 문자열이 30 바이트 이상일 수 있다면 조용히 자르고이 술어에서 잘못된 결과를 얻을 수 있다는 것입니다.
    4. 사례에 민감한 비교를 원하더라도 바이너리 콜라이트입니다 ~ 아니다 사례에 민감합니다 (또 다른 매우 일반적인 오해).
  6. 아니, LIKE 항상 대소 문자에 민감한 것은 아닙니다. 변수가 문자열 리터럴과 비교되거나 옵션을 통해 지정된 Collation이 비교되는 경우 참조되는 열의 Collation 또는 데이터베이스의 충돌을 사용합니다. COLLATE 절.

  7. LCASE SQL 서버 기능이 아닙니다. Oracle 또는 MySQL 인 것 같습니다. 아니면 시각적 기본?

  8. 질문의 컨텍스트는 열을 문자열 문자와 비교하기 때문에 인스턴스의 충전물 (종종 "서버"라고 함)이나 데이터베이스의 충돌에는 어떤 것도 없습니다. 직접 여기에 충격. 콜라이트는 각 열마다 저장되며 각 열에는 다른 콜라이트가있을 수 있으며 해당 콜라이트는 데이터베이스의 기본 충돌 또는 인스턴스의 콜레이션과 동일 할 필요가 없습니다. 물론 인스턴스 콜레이션은 새로 생성 된 데이터베이스가 기본 콜레이션으로 사용할 수있는 기본값입니다. COLLATE 데이터베이스를 작성할 때 절은 지정되지 않았습니다. 마찬가지로, 데이터베이스의 기본 콜레이션은 다음과 같은 경우 변경된 또는 새로 생성 된 열이 사용할 수있는 것입니다. COLLATE 절은 지정되지 않았습니다.

  9. 열의 협업과 동일한 경우에 민감한 Collation을 사용해야합니다. 다음 쿼리를 사용하여 열의 Collation을 찾으십시오 (테이블의 이름 및 스키마 이름 변경) :

    SELECT col.*
    FROM   sys.columns col
    WHERE  col.[object_id] = OBJECT_ID(N'dbo.TableName')
    AND    col.[collation_name] IS NOT NULL;
    

    그런 다음 변경하십시오 _CS 되려고 _CI. 그래서, Latin1_General_100_CS_AS 될 것입니다 Latin1_General_100_CI_AS.

    열이 바이너리 콜레이션을 사용하는 경우 (종료 _BIN 또는 _BIN2), 다음 쿼리를 사용하여 유사한 Collation을 찾으십시오.

    SELECT *
    FROM   sys.fn_helpcollations() col
    WHERE  col.[name] LIKE N'{CurrentCollationMinus"_BIN"}[_]CI[_]%';
    

    예를 들어, 열이 사용 중이라고 가정합니다 Japanese_XJIS_100_BIN2, 이 작업을 수행:

    SELECT *
    FROM   sys.fn_helpcollations() col
    WHERE  col.[name] LIKE N'Japanese_XJIS_100[_]CI[_]%';
    

Collations, Encoding 등에 대한 자세한 내용은 다음을 방문하십시오. Collations 정보

케이스에 민감한 강제로 varbinary에 캐스팅 할 수 있습니다.

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')

당신은 어떤 데이터베이스에 있습니까? MS SQL Server를 사용하면 데이터베이스 전체 설정이거나 Collate Keyword를 사용하여 IT 당 과대 평가할 수 있습니다.

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