복붙노트

[SQL] 에서 LIKE 연산자 대소 문자를 구분 MSSQL 서버와인가?

SQL

에서 LIKE 연산자 대소 문자를 구분 MSSQL 서버와인가?

에서 LIKE 연산자에 대한 문서에서 아무 것도 그것의 대소 문자 구분에 대해 이야기하지 않습니다. 그것은인가? 어떻게 활성화 / 비활성화하려면?

문제가있는 경우 나, 마이크로 소프트 SQL 서버 2005 설치에 VARCHAR (n)에 열을 쿼리하고있다.

해결법

  1. ==============================

    1.그것은 열 자체, 대소 문자를 구분 오퍼레이터 아니다.

    그것은 열 자체, 대소 문자를 구분 오퍼레이터 아니다.

    기본적으로 SQL Server 설치를 수행 할 때 기본 데이터 정렬은 인스턴스에 선택됩니다. 명시 적으로 (한 부씩 절 울부 짖는 확인) 달리 언급하지 않는 한 새 데이터베이스는 인스턴스에서 데이터 정렬을 상속하고 새로운 열이 생성 될 때 그것이 속한 데이터베이스에서 데이터 정렬을 상속를 만들 때.

    칼럼의 내용이 처리되는 방법을 SQL_Latin1_General_CP1_CI_AS 데이터의 지시 같은 정렬. CI는 케이스 둔감 약자 AS 민감한 악센트를 나타낸다.

    정렬의 전체 목록은 https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx에서 확인할 수있다

    (a)는 인스턴스 데이터 정렬을 확인하려면

    select serverproperty('collation')
    

    (b)는 데이터베이스 데이터 정렬을 확인하려면

    select databasepropertyex('databasename', 'collation') sqlcollation
    

    (c)는 다른 데이터 정렬을 사용하여 데이터베이스를 만들려면

    create database exampledatabase
    collate sql_latin1_general_cp1_cs_as 
    

    (d)의 다른 정렬을 사용하여 열을 생성하려면

    create table exampletable (
        examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
    )
    

    (e)는 열 정렬을 수정하려면

    alter table exampletable
    alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
    

    인스턴스와 데이터베이스 데이터 정렬을 변경하는 것이 가능하지만, 이전에 생성 된 객체에 영향을주지 않습니다.

    문자열 비교를위한 즉시 열 정렬을 변경하는 것이 가능하지만, 매우 비용이 많이 드는이기 때문에이 프로덕션 환경에서 매우 권장되지이다.

    select
      column1 collate sql_latin1_general_cp1_ci_as as column1
    from table1
    
  2. ==============================

    2.정렬에 대한이 모든 이야기는 조금 오버 복잡해 보인다. 왜 그냥 같은 것을 사용 :

    정렬에 대한이 모든 이야기는 조금 오버 복잡해 보인다. 왜 그냥 같은 것을 사용 :

    IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
    

    그런 다음 검사의 경우를 구분은 어떤 조합입니다

  3. ==============================

    3.당신은 당신의 테이블을 정의 할 때 정렬 순서를 정의 할 수있는 옵션이 있습니다. 당신은 대소 문자를 구분하는 순서를 정의 할 경우, LIKE 연산자는 대소 문자를 구분하는 방식으로 작동합니다; 당신은 대소 문자를 구분 정렬 순서를 정의 할 경우, LIKE 연산자는 대소 문자를뿐만 아니라 무시합니다 :

    당신은 당신의 테이블을 정의 할 때 정렬 순서를 정의 할 수있는 옵션이 있습니다. 당신은 대소 문자를 구분하는 순서를 정의 할 경우, LIKE 연산자는 대소 문자를 구분하는 방식으로 작동합니다; 당신은 대소 문자를 구분 정렬 순서를 정의 할 경우, LIKE 연산자는 대소 문자를뿐만 아니라 무시합니다 :

    CREATE TABLE Test (
        CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
    ,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
    );
    

    다음은 LIKE와 검색에 조합 순서의 결과를 보여주는 sqlfiddle에 빠른 데모입니다.

  4. ==============================

    4.당신이 열 / 데이터베이스 / 서버의 데이터 정렬을 변경하지 않고 대소 문자 구분 검색을 달성하고자하는 경우, 당신은 항상 COLLATE 절을 사용할 수 있습니다, 예를 들어,

    당신이 열 / 데이터베이스 / 서버의 데이터 정렬을 변경하지 않고 대소 문자 구분 검색을 달성하고자하는 경우, 당신은 항상 COLLATE 절을 사용할 수 있습니다, 예를 들어,

    USE tempdb;
    GO
    CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
    GO
    INSERT dbo.foo VALUES('John'),('john');
    GO
    SELECT bar FROM dbo.foo 
      WHERE bar LIKE 'j%';
    -- 1 row
    
    SELECT bar FROM dbo.foo 
      WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
    -- 2 rows
    
    GO    
    DROP TABLE dbo.foo;
    

    작동 다른 방법으로도 당신의 열 / 데이터베이스 / 서버는 대소 문자를 구분하고는 대소 문자를 구분 검색을 원하지 않는 경우, 예를 들어,

    USE tempdb;
    GO
    CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
    GO
    INSERT dbo.foo VALUES('John'),('john');
    GO
    SELECT bar FROM dbo.foo 
      WHERE bar LIKE 'j%';
    -- 2 rows
    
    SELECT bar FROM dbo.foo 
      WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
    -- 1 row
    
    GO
    DROP TABLE dbo.foo;
    
  5. ==============================

    5.등 오퍼레이터는 두 문자열 걸린다. 이러한 문자열은 여기에 설명 호환 정렬을 가지고해야합니다.

    등 오퍼레이터는 두 문자열 걸린다. 이러한 문자열은 여기에 설명 호환 정렬을 가지고해야합니다.

    제 생각에는, 물건은 다음 복잡해진다. 다음 쿼리는 데이터 정렬이 호환되지 없다는 오류를 반환합니다 :

    select *
    from INFORMATION_SCHEMA.TABLES
    where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
    

    여기에 임의의 시스템에서, 기본 데이터 정렬은 SQL_Latin1_General_CP1_CI_AS 데이터입니다. 다음 쿼리는 성공하지만, 어떤 행을 반환하지 않습니다 :

    select *
    from INFORMATION_SCHEMA.TABLES
    where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
    

    값 "ABC"와 "ABC"는 대소 문자를 구분 세계에서 일치하지 않습니다.

    즉, 데이터 정렬이없는 및 기본 데이터 정렬을 사용하는 사이에 차이가 있습니다. 한쪽에는 정렬을 사용하지 않을 때, 그것은 다른 측면에서 명시 적 데이터 정렬을 "할당"입니다.

    (명시 적 데이터 정렬이 왼쪽에있을 때 결과는 동일합니다.)

  6. ==============================

    6., 실행 해보십시오

    , 실행 해보십시오

    SELECT SERVERPROPERTY('COLLATION')
    

    당신의 정렬은 대소 문자를 구분인지 아닌지 그런 알아보십시오.

  7. ==============================

    7.당신은 모든 항목의 속성에서 변경할 수 있습니다.

    당신은 모든 항목의 속성에서 변경할 수 있습니다.

  8. ==============================

    8.당신은 쉽게 Microsoft SQL Server 관리 스튜디오에서 정렬을 변경할 수 있습니다.

    당신은 쉽게 Microsoft SQL Server 관리 스튜디오에서 정렬을 변경할 수 있습니다.

  9. from https://stackoverflow.com/questions/14962419/is-the-like-operator-case-sensitive-with-mssql-server by cc-by-sa and MIT license