2009-04-23 3 views
4

모든 터키어 데이터 정렬에 설정된 MSSQL 데이터베이스에 문제가 있습니다. "터키어 I"문제로 인해 'i'가 포함 된 쿼리가 제대로 작동하지 않습니다. 예를 들어, "Unit"열이 "Unit"열이고이 경우 "Select unit from unit"쿼리는 "id"의 소문자 "i"가 정의 된 대문자와 다르기 때문에 더 이상 작동하지 않습니다 "UnitID"에 있습니다. 오류 메시지는 "잘못된 열 이름 'unitid'입니다."터키어 SQL 데이터 정렬 문제 (터키어 "I")

터키에서는 문자 i와 문자가 다른 문자로 인식되기 때문에 이것이 발생하고 있음을 알고 있습니다. 그러나이 문제를 해결하는 방법에 대해서는 확신하지 못합니다. DB에있는 1900 개의 모든 SP를 살펴보고 "i"의 대소 문자를 수정하는 것은 옵션이 아닙니다.

터키어 대신 사용할 수 있지만 해당 문자 집합을 지원하는 다른 데이터 정렬에 대한 제안은 도움이 될 것입니다.

+0

"turkish i problem"을 설명하는 페이지에 대한 링크를 게시 할 수 있습니까? – Tomalak

+1

@Tomalak,이 페이지를보십시오 : http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

+0

그 페이지를 압니다. 그러나 당신이 옳은 일을하고 있는지 확실하지 않습니다. "터키 테스트"는 데이터를 구문 분석하는 것이지만 SQL 쿼리 텍스트에서 터키어 i를 사용하는 것처럼 문제 설명이 들린다. – Tomalak

답변

4

최상의 해결책은 사실 모든 SQL과 코드를 리팩토링하는 것이 었습니다.내가 올바른 케이싱 등을 일관되게 모든 저장 발동, 함수, 뷰, 테이블 이름을 수정하고 사용하기 위해 리팩토링 응용 프로그램을 작성했습니다 지난 몇 일에서

는 :

select unitid from dbo.unit 

로 변경됩니다
select UnitId from dbo.Unit 

앱은 또한 코드를 거치고 저장된 proc 및 해당 매개 변수의 모든 항목을 대체하고 DB에 정의 된 대소 문자와 일치하도록 수정합니다. 응용 프로그램의 모든 데이터 테이블은 불변의 로케일로 설정되어 있습니다 (FXCop 덕분에 모든 데이터 테이블을 나타낼 수 있습니다 ..). 코드 내의 대/소문자를 구분해야합니다.

누군가 응용 프로그램이나 프로세스에 대한 조언을 원하면 [email protected]으로 저에게 연락하십시오.

+0

...하지만 귀하의 필드는 "UnitID"(대문자 "D")입니다. – nickgrim

0

아마 여기서 문제를 이해하지 못 하겠지만 데이터베이스가 대소 문자를 구분하고 쿼리가 아니기 때문에이 문제가 더 이상 발생하지 않을까요? 예를 들어, 사이베이스에 나는 다음을 수행 할 수 있습니다 내 데이터베이스가 대소 문자를 구분 하더군요

USE master 
GO 
EXEC sp_server_info 16 
GO 

:

attribute_id attribute_name  attribute_value 
      16 IDENTIFIER_CASE MIXED 
+0

코멘트 주셔서 감사합니다. 나는 대소 문자를 구분하지 않고 슬픈 듯이 터키 언어로 작은 i와 큰 문자로 설정했습니다. 실제로 큰 문자가 아닌 다른 문자로 보입니다. 고마워요. – Madeleine

0

당신은 당신이 시도 후 사용하고있는 데이터 정렬을 변경할 수있는 경우 불변의 로케일. 그러나 고객 이름 및 주소와 같은 다른 것들에 영향을주지 않도록하십시오. 고객이 대소 문자를 구별하지 않고 자신의 이름을 검색하는 데 익숙하다면 ı와 내가 동등한 자격을 잃거나 i와 İ가 더 이상 동일하지 않으면 좋아하지 않을 것입니다.

0

데이터베이스 데이터 정렬을 기본값으로 변경할 수 있습니까? 이렇게하면 모든 텍스트 열에 터키어가 표시됩니다.

쿼리가 작동하지만 데이터가 올바르게 동작합니다. 이론적으로 ...

는 VARCHAR 컬럼이있는 임시 테이블과 테이블 변수를 몇 개는있다 : 당신은 당신이 모든 저장을 통해 가고 싶지 않아 실현이

+0

불행히도 우리의 모든 varchar 열은 database_default로 설정되어 있습니다. 따라서 데이터 정렬이 일반 라틴 옵션으로 변경되면 varchar 열은 latin을 사용하게됩니다. 모든 varchar 열에서 데이터 정렬을 turkish로 설정하고 db collation을 latin으로 설정하고 어떤 일이 발생하는지 확인하는 스크립트를 실행 해 보겠습니다! 이상적인 아이디어는 DB가 대소 문자를 구분하지 않고 작업하기를 원합니다. 응답 주셔서 감사합니다 – Madeleine

+0

DB 데이터 정렬 (ALTER DATABASE)을 변경하면 모든 텍스트 열을 그대로 두어야합니다. 그것은 단지 시스템 테이블에 영향을 미치고 기본값 인 – gbn

+0

이 그것을 시도하고 트릭을 수행합니다. 터키어로 모든 열 데이터 정렬을 업데이트하는 스크립트를 실행 한 다음 DB 데이터 정렬을 일반 라틴 데이터 정렬로 설정하면 문제가있는 것처럼 보입니다. 이 솔루션은 매우 유지 보수가 아니므로 내 대답에서 볼 수있는 코드를 리팩토링 끝. 그러나 확실히 단기간에 작동합니다. 감사합니다 – Madeleine

0

에 COLLATE 절을 추가해야합니다 문제를 해결하는 절차는 있지만 리팩토링 도구를 사용하여 문제를 해결하는 것이 좋습니다. 나는 SQL Refactor을 봐라. 나는 그것을 사용하지 않았지만 유망 해 보인다.

+0

이것은 최고의 제안처럼 보입니다. 원래의 포스터는 1900 개의 저장 프로 시저를 수정하는 것은 선택 사항이 아니라 1900 개의 저장 프로 시저를 손상시키지 않는 것이 좋은 방법이라고 말했습니다. –

0

나는 터키어를 지원하는 많은 시스템을 개발했으며 이것은 잘 알려진 문제입니다.

데이터베이스 설정을 UTF-8로 변경하는 것이 가장 좋습니다. 그게 전부입니다. 그것은 모든 문제를 해결해야합니다.

SQL Server에서 문제가 될 수있는 (ı-I, i-İ) 대/소문자 구분을 지원하려면 문제가 발생할 수 있습니다. 전체 출입구가 웹에서 나온 것이라면 UTF-8도되도록하십시오.

웹 UTF-8 입력 및 SQL Server 설정을 UTF-8로 유지하면 모든 작업이 원활하게 처리됩니다.

0

컴퓨터의 국가 별 설정을 영어 (미국)로 변경하면 하루를 완전히 절약 할 수 있습니다!

관련 문제