SQL Server 열 이름 대소 문자 구분

case-insensitive case-sensitive collation sqlbulkcopy sql-server

문제

내가 사용하는 DB는 French_CI_AS 데이터 정렬 (CI는 대소 문자를 구분해야 함)이지만 대 / 소문자를 구분합니다. 이유를 이해하려고 노력 중입니다.

내가 이것을 주장하는 이유는 'GIVEN'케이스 설정이있는 대량 삽입은 실패하지만 다른 'Given'케이스 설정과 함께 성공합니다.

예 :

  • INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2") 실패하지만
  • INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2") 작동합니다.

편집 그냥 보았다 :

http://msdn.microsoft.com/en-us/library/ms190920.aspx

따라서 모든 데이터를 비우지 않고 관련 테이블을 다시 만들지 않고도 열의 데이터 정렬을 변경할 수 있어야합니다.

인기 답변

정보의 중요한 부분을 감안할 때 (즉, 문제에 아닌 실제 문제의 코멘트에) :

사실 Microsoft .Net의 대량 삽입 방법을 사용하므로 DB 서버에 보내는 정확한 쿼리를 실제로 알지 못합니다.

대소 문자를 구별하지 않는 DB에서도 SqlBulkCopy 클래스가 작동하는 방식이므로 열 이름은 대 / 소문자를 구분하여 처리됩니다. SqlBulkCopy의 열 매핑은 대 / 소문자를 구분합니다를 참조하십시오.

추가 노트

  1. 오류에 관해 질문 할 때는 질문에 항상 실제 적이고 완전한 오류 메시지를 포함 시키십시오. 오류가 있었다는 말은 추측과 야생 거위 추격으로 이어지며 이는 주제를 벗어난 답변으로 이어집니다.
  2. 질문 할 때, 상대하고있는 상황을 바꾸지 마십시오. 예를 들어, 질문 상태 (강조 추가됨) :

    'GIVEN'케이스 설정이 포함 된 대량 삽입물 은 실패하지만 다른 'Given'케이스 설정과 함께 성공합니다.

    그러나 예제 문장은 단일 INSERT 이다. 또한 질문에 대한 의견은 다음과 같이 말합니다.

    사실 Microsoft .Net의 대량 삽입 방법을 사용하므로 DB 서버에 보내는 정확한 쿼리를 실제로 알지 못합니다.

    .NET과 SqlBulkCopy 사용하면 BULK INSERT 또는 INSERT 사용하는 것과는 다른 Waaaay가되어 현재의 질문을 오도하게 만들고 올바르게 대답하기가 어렵거나 불가능할 수도 있습니다. SqlBulkCopy 사용할 때 SELECT 문을 작성하고 대상 테이블의 이름을 지정하기 만하면 INSERT 문을 작성하지 않기 때문에이 새로운 정보가 더 많은 질문을하게됩니다. 대상 테이블에 대한 열 이름을 모두 지정하면 선택적 열 매핑에 있습니다. 문제가있는 곳인가요?

  3. 질문의 "수정"부분에 관해서 :

    아니요. SqlBulkCopy 사용하지 않아도 열의 데이터 정렬을 변경해도 전혀 도움이되지 않습니다. 열의 데이터 정렬은 열 이름 (예 : 테이블의 메타 데이터)이 작동하는 방식이 아니라 열에 저장된 데이터의 작동 방식을 결정합니다. 데이터베이스 수준 개체 메타 데이터의 작동 방식을 결정하는 것은 데이터베이스 자체의 데이터 정렬입니다. 이 경우 DB에서 대소 문자를 구분하지 않는 데이터 정렬을 사용한다고 주장합니다. 올바른 데이터 정렬 이름의 _CI_ 부분은 " C ase I nsensitive"를 의미합니다.

  4. 조나단 룰러 (Jonathan Leffler)가 다음과 같은 질문에 대해 언급했다.

    분리 식별자 (대소 문자 구별)와 데이터 정렬 (대소 문자를 구분하지 않음) 사이의 상호 작용에 매우 민감한 영역으로 들어갑니다.

    아니요, 구분 식별자는 대개 대소 문자를 구분하지 않습니다. 구분 식별자의 민감도 (대소 문자, 액센트, 가나 유형, 너비 및 SQL Server 2017 변형 선택기에서 시작)는 동일한 수준의 구분되지 않은 식별자와 동일합니다. "동일한 레벨"은 데이터베이스 레벨 이름 (스키마, 객체 - 테이블, 뷰, 함수, 저장 프로 시저 등 -)이 인스턴스 레벨 데이터 정렬에 의해 제어되는 동안 인스턴스 레벨 이름 (데이터베이스, 로그인 등) 사용자 등)는 데이터베이스 수준 데이터 정렬에 의해 제어됩니다. 이 두 레벨은 서로 다른 데이터 정렬을 가질 수 있습니다.

    구분 된 경우 데이터베이스의 SQL C 럼 이름이 대소.자를 구분하는지 여부를 조사해야합니다. 또한 CREATE TABLE.이 작성된 f} (이름이?으로 분리 되었습니까?)에 따라 다를 수 있습니다. 일반적으로 SQL은 열과 테이블 이름에서 대소 문자를 구분하지 않습니다. 당신은 INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2") 쓸 수 있었고 이름이 절대로 구분되지 않았다면 괜찮을 것입니다.

    테이블을 작성할 때 컬럼 이름이 분리되었는지 여부는 중요하지 않습니다. 적어도 해상도가 처리되는 방식은 아닙니다. 열 이름은 데이터베이스 수준의 메타 데이터로, 데이터베이스의 기본 데이터 정렬에 의해 제어됩니다. 또한 각 데이터베이스 내의 모든 데이터베이스 수준 메타 데이터에 대해 동일합니다. 대소.자를 구분하지 않는 일부 C 럼 이름은 대소.자를 구분할 수 없습니다.

    또한 테이블 및 열 이름에는 특별한 것이 없습니다. 사용자 이름, 스키마 이름, 색인 이름 등과 같은 데이터베이스 수준의 메타 데이터입니다.이 메타 데이터는 모두 데이터베이스의 기본 데이터 정렬에 의해 제어됩니다.

    메타 데이터 (인스턴스 수준 및 데이터베이스 수준 모두)는 설치 중에 대 / 소문자를 구분하지 않는 데이터 정렬이라고 제안되는 기본 데이터 정렬로 인해 대개 대 / 소문자를 구분하지 않습니다.

    '구분 식별자'는 열 이름, 테이블 이름 또는 CREATE TABLE "table"(...)과 같이 큰 따옴표로 묶인 유사한 이름입니다.

    분리 식별자는 해당 DBMS가 분리 문자로 정의한 문자로 묶인 식별자입니다. 구분 기호로 사용되는 특정 문자는 서로 다른 DBMS마다 다릅니다.

    SQL Server에서 구분 된 식별자는 대괄호로 묶습니다. [GIVEN]

    대괄호는 식별자의 구분 기호로 항상 작동하지만 QUOTED_IDENTIFIER 의 세션 수준 속성이 ON 설정되어 있으면 구분 기호로 큰 따옴표를 사용할 수 있습니다 (항상 QUOTED_IDENTIFIER 되는 것이 가장 좋습니다).

    SQL에 대한 불가사의 한 부분이 있습니다 (구분 된 식별자 처리 중 하나)

    구분 된 식별자는 실제로 매우 간단합니다. 식별자를 구분하는 전체 요점은 규칙적인 (즉, 구분되지 않은) 식별자의 규칙을 효과적으로 무시하는 것입니다. 그러나 규칙적인 식별자의 관점에서 볼 때, 그 규칙은 (주로 공식 문서가 불완전하고 부정확하기 때문에) 다소 비밀입니다. 따라서 SQL Server의 식별자가 실제로 어떻게 작동하는지에 대한 수수께끼를 없애기 위해 나는 여러 가지 조사를 수행하여 여기에 결과를 게시했습니다 (여기에는 연구 자체에 대한 링크가 포함됨).

    T-SQL 식별자에 대한 규칙 목록 완전 작성

Collations / Encodings / Unicode / ASCII에 대한 자세한 정보는 Microsoft SQL Server와 관련되어 있습니다.

Collations.Info



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.