에서 에서 LIKE 연산자에 대한 설명서 , 아무것도 그것의 대소 문자 구분에 대해 이야기하지 않습니다. 맞나요? 활성화 / 비활성화하는 방법은 무엇입니까?
varchar(n)
중요한 경우 Microsoft SQL Server 2005 설치에서 열을 쿼리하고 있습니다.
답변
대소 문자를 구분하는 연산자가 아니라 열 자체입니다.
SQL Server 설치가 수행되면 인스턴스에 대한 기본 데이터 정렬이 선택됩니다. 달리 명시 적으로 언급하지 않는 한 (아래 collate 절 확인) 새 데이터베이스가 생성되면 인스턴스에서 데이터 정렬을 상속하고 새 열이 생성 될 때 자신이 속한 데이터베이스에서 데이터 정렬을 상속합니다.
같은 데이터 정렬 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
답변
데이터 정렬에 대한이 모든 이야기는 다소 복잡해 보입니다. 다음과 같은 것을 사용하지 않는 이유는 무엇입니까?
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
그런 다음 검사는 데이터 정렬에 관계없이 대소 문자를 구분하지 않습니다.
답변
테이블을 정의 할 때 데이터 정렬 순서 를 정의 할 수있는 옵션이 있습니다. 대소 문자를 구분하는 순서를 정의하면 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
);
다음은 sqlfiddle에 대한 빠른 데모 입니다 LIKE
..
답변
열 / 데이터베이스 / 서버의 데이터 정렬을 변경하지 않고 대 / 소문자 구분 검색을 수행하려면 항상 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;
답변
like
오퍼레이터는 두 문자열 걸린다. 이러한 문자열에는 호환 가능한 데이터 정렬이 있어야하며 여기 에 설명되어 있습니다 .
제 생각에는 상황이 복잡해집니다. 다음 쿼리는 데이터 정렬이 호환되지 않는다는 오류를 반환합니다.
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”값은 대소 문자를 구분하는 세계에서 일치하지 않습니다.
즉, 데이터 정렬이없는 것과 기본 데이터 정렬을 사용하는 것에는 차이가 있습니다. 한쪽에 데이터 정렬이 없으면 다른 쪽의 명시 적 데이터 정렬이 “할당”됩니다.
(명시 적 데이터 정렬이 왼쪽에있을 때 결과는 동일합니다.)