SQL Server가 대소문자를 무시하는 식입니다.
"where" 절이 대소문자를 구분하지 않는 SQL 쿼리(MS SQL Server)를 구성하려면 어떻게 해야 합니까?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
사건을 무시하고 결과가 나왔으면 좋겠다
SQL Server 데이터베이스의 기본 구성에서 문자열 비교는 대소문자를 구분하지 않습니다.데이터베이스가 대체 데이터 정렬을 사용하여 이 설정을 재정의할 경우 질의에 사용할 데이터 정렬 유형을 지정해야 합니다.
SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS
제가 제공한 조합은 단순한 예에 불과합니다(단, 고객님께는 충분히 기능할 수 있습니다.SQL Server 조합의 자세한 개요는 여기를 참조하십시오.
일반적으로 문자열 비교에서는 대소문자가 구분되지 않습니다.데이터베이스가 대소문자를 구분하여 대조하도록 설정되어 있는 경우 대소문자를 구분하지 않도록 해야 합니다.
SELECT balance FROM people WHERE email = 'billg@microsoft.com'
COLLATE SQL_Latin1_General_CP1_CI_AS
다른 곳에서 다른 해결책을 찾았습니다. 즉,
upper(@yourString)
SQL Server에서는 대소문자를 무시하고 있기 때문에 상관없다고 합니다.우리 데이터베이스는 대소문자를 구분합니다.
(Adam Robinson과 Andrejs Kainikovs의) 상위 2개의 답변은 기술적으로 효과가 있다는 점에서 다소 정확하지만, 그들의 설명은 잘못되어 많은 경우 오해를 일으킬 수 있습니다.예를 들면,SQL_Latin1_General_CP1_CI_AS
대조는 많은 경우에 효과가 있으므로 적절한 대/소문자 구분 대조 대조라고 가정해서는 안 된다.실제로 O.P.는 대소문자를 구분하는(또는 바이너리) 데이터 정렬을 사용하는 데이터베이스에서 작업하고 있기 때문에 O.P.는 많은 설치에서 기본 데이터 정렬(특히 미국 영어를 사용하는 OS에 설치된 데이터 정렬)을 사용하지 않습니다. SQL_Latin1_General_CP1_CI_AS
네, O.P.는 이 정보를SQL_Latin1_General_CP1_CS_AS
, 을 「」, 「」를 참조해 주세요.VARCHAR
데이터, 데이터 손실의 원인이 될 수 있으므로 코드 페이지를 변경하지 않는 것이 중요합니다.또, 데이터 수집의 로케일/문화(Latin1_General vs 프랑스어 vs 히브리어 등)에 의해서 제어됩니다.9월 9일입니다.
나머지 4개의 답은 정도가 다를 정도로 틀렸다.
저는 독자들이 가장 적절하고 효율적인 선택을 할 수 있도록 모든 오해를 해소할 것입니다.
「 」를하지 주세요.
UPPER()
이치노 사용하다COLLATE
절을 클릭합니다. 문자열 하지만 " "를 합니다.UPPER()
또한 대문자 매핑이 있는지 문자별로 확인한 후 변경해야 합니다.그리고 양쪽 다 이렇게 해야 돼요." " "COLLATE
는 디폴트와는 다른 규칙 세트를 사용하여 정렬 키를 생성하도록 처리를 지시합니다.「」를 사용합니다.COLLATE
를 사용하는 것보다 확실히 효율적입니다(또는 「퍼포먼스」라고 하는 말이 좋다면).UPPER()
(PasteBin의 경우) 이 테스트스크립트에서 증명된 바와 같이@Danny의 답변에는 @Cisc가 지적한 문제도 있습니다.
일부 언어에서는 변환이 왕복되지 않습니다(예: LOWER(x) != LOWER(x)).
터키 대문자 'I'가 일반적인 예다.
아니요, 조합은 적어도 이 컨텍스트에서는 데이터베이스 전체의 설정이 아닙니다.의 디폴트, 이 조합은 변경 및 에 대해 이 컬럼에는 " " " " 가 지정되어 . " " " " " " " " " " " " " " 가 지정되어 있지 않습니다.
COLLATE
절(이러한 일반적인 오해의 근원지)은 문자열 리터럴 및 변수를 다른 문자열 리터럴 및 변수와 비교하거나 데이터베이스 수준의 메타데이터를 참조하지 않는 한 쿼리에 직접 영향을 주지 않습니다.아니요, 조회 수는 쿼리 당이 아닙니다.
조합은 쿼리 단위가 아니라 술어(즉, 연산자 및 무엇) 또는 식 단위입니다.이 사실은 전체 쿼리에 적용됩니다.
WHERE
절을 클릭합니다.JOINs, GROUP BY, ORDER BY, Partition BY.하지 마세요.
VARBINARY
convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
는 다음과 로 사용합니다- 이는 대소문자를 구분하지 않는 바이너리 비교입니다(이 질문에 대한 요구).
- 2진수 비교를 하려면 2진수 조회를 사용합니다.은 ㄴㄴ데로 끝나는 을 사용하세요.
_BIN2
Server 2008으로 ._BIN
데이터가 다음과 같은 경우NVARCHAR
어느 , 어떤 로케일을 하든 상관없습니다.Latin1_General_100_BIN2
항상 동작합니다.가 「」인VARCHAR
한 로케일을 " " " " " " " " " " 。Latin1_General
,French
,Japanese_XJIS
로케일에 따라 사용되는 코드 페이지가 결정되며 코드 페이지를 변경하면 데이터가 변경될 수 있습니다(즉, 데이터 손실). - 크기를 지정하지 않고 가변 길이 데이터 유형을 사용하면 기본 크기에 따라 달라지며 데이터 유형이 사용되는 컨텍스트에 따라 두 가지 기본값이 있습니다.1번 30번 30번「 」와 함께
CONVERT()
30분위험한 것은 문자열이 30바이트를 초과할 수 있는 경우 문자열이 자동으로 잘리고 이 술어에서 잘못된 결과를 얻을 수 있다는 것입니다. - 대소문자를 구분하는 비교가 필요한 경우에도 바이너리 조합은 대소문자를 구분하지 않습니다(또 다른 매우 일반적인 오해).
아요 no요 。
LIKE
반드시 대소문자를 구분하는 것은 아닙니다.있는 리터럴과 의 대조 인 "" " " " 에서 지정된 " 를 합니다.COLLATE
절을 클릭합니다.LCASE
SQL Server를 선택합니다.Oracle MySQL oracle oracle oracle oracle oracle 。Visual Basic?질문의 컨텍스트는 열을 문자열 리터럴과 비교하기 때문에 인스턴스(종종 "서버"라고 함)의 대조나 데이터베이스의 대조는 여기서 직접적인 영향을 미치지 않습니다.조합은 각 열별로 저장되며 각 열마다 다른 조합이 있을 수 있습니다. 이러한 조합은 데이터베이스의 기본 조합이나 인스턴스의 조합과 같을 필요가 없습니다.물론 인스턴스 조합은 새로 작성된 데이터베이스가 기본 조합으로 사용하는 기본 조합입니다.
COLLATE
데이터베이스를 만들 때 절이 지정되지 않았습니다.이 "변경" 또는 "" 컬럼에서 되는 것입니다.COLLATE
절이 지정되지 않았습니다.대/소문자를 구분하지 않는 대조는 열의 대조와 동일하게 사용해야 합니다. 대소문자를 구분하지 않는 데이터 정렬은 열의 데이터 정렬과 동일합니다.다음 쿼리를 사용하여 열의 데이터 정렬을 찾습니다(테이블 이름과 스키마 이름 변경).
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
다음 쿼리를 사용하여 유사한 조회를 찾습니다.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[_]%';
대조, 인코딩 등에 대한 자세한 내용은 다음 사이트를 참조하십시오.대조 정보
「」, 「」만을 사용합니다.LIKE
동작하지 않습니다. LIKE
는 지정된 패턴과 정확히 일치하는 값을 검색합니다. 경우, 「 」LIKE
'someVal'은 'someVal'은 'someVal'은 'someVal'이 됩니다.
은 pracitable을 합니다.LCASE()
★★★★★★ 。LCASE('sOmeVal')
썸벌하다비교의 양쪽에 이 함수를 사용하면 다음과 같이 동작합니다.
SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')
이 문은 두 개의 소문자 문자열을 비교하여 'someVal'이 'someval'의 다른 모든 표기법(예: 'Someval', 'sOMEVAL' 등)과 일치하도록 합니다.
대소문자를 구분하여 다음과 같은 바이너리에 캐스팅할 수 있습니다.
SELECT * FROM myTable
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
어떤 데이터베이스에 있어요?MS SQL Server에서는 데이터베이스 전체의 설정입니다.또는 COLATE 키워드를 사용하여 쿼리 단위로 덮어쓸 수 있습니다.
언급URL : https://stackoverflow.com/questions/1224364/sql-server-ignore-case-in-a-where-expression
'sourcecode' 카테고리의 다른 글
bash에서 "-ne"은 무슨 뜻입니까? (0) | 2023.04.18 |
---|---|
날짜 문자열에 대한 Oracle to_date 함수 사용(밀리초) (0) | 2023.04.18 |
TypeError를 극복하는 방법: 캐시할 수 없는 유형: '리스트' (0) | 2023.04.13 |
Windows(v10)에서 Android Studio를 완전히 제거하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
UIDevice uniqueIdentifier가 권장되지 않음 - 이제 어떻게 해야 합니까? (0) | 2023.04.13 |