특정 아랍어 문자를 동일하게 취급


10

아랍어에는 ا (alef) 및 أ (hamef와 함께 alef)와 같은 문자가 있습니다.

사용자는 그것들을 서로 바꿔 쓸 수 있고 우리는 그것들을 서로 바꾸어 검색하려고합니다. SQL Server는 이들을 개별 문자로 취급합니다. SQL을 동일한 문자로 취급하도록하려면 어떻게해야합니까?

삽입시 أ (alef와 hamza)를 ا (alef)로 대체하려고 생각했지만 우리는 ا (alef)와 أ (hamf와 hamza)뿐만 아니라 아랍어로 많은 대안을 가지고 있습니다.

나는 시도 Arabic_CI_AS하고 Arabic_CI_AI있지만이 문제가 해결되지 않습니다.

문제를 재생성하는 스크립트는 다음과 같습니다.

CREATE TABLE [dbo].[TestTable] (
    [ArabicChars] [nvarchar](50) NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];


INSERT INTO TestTable values (N'احمد');
INSERT INTO TestTable values (N'أحمد');

SELECT * 
FROM TestTable 
WHERE ArabicChars like N'ا%';

결과는 다음과 같습니다.

ArabicChars 

احمد

(1 row(s) affected)

원하는 결과는 삽입 한 두 행 모두입니다.


문제 없어요. Aaron Bertrand에는 가능한 모든 데이터 정렬을 테스트 할 수 있는 멋진 스크립트 가 있습니다. 그러나 데이터 정렬이 두 문자를 동일하게 고려하지 않을 것이라고 생각합니다.
Nick Chammas 2013

그러나 당신은 언급 된 이름에 두 가지 다른 문자가 있으며 적어도 외형에 있습니다. 물론 다른 문자로 취급해야한다고 생각합니다.ا and أ
nuux

3
SOUNDEX ()가 아랍어 문자에 대해 0000을 반환한다고 생각한 것처럼 @NickChammas
George Botros

1
@ NickChammas : 문제는 다음과 같습니다. 사용자 행동 + 가정은 더 엄격한 조합 행동과 다릅니다.
gbn

1
@gbn-이것들이 다른 글자라고 가정하면 문제는 사용자 교육이라고 말할 수 있습니다. 사용자가 해당 문자를 특히 검색에서 동일하게 취급하려면 해당 기능을 명시 적으로 작성해야합니다. 데이터 정렬 문제가 아닙니다.
Nick Chammas

답변:


4

나는 몇 가지 테스트를했는데 해결 방법이라고 생각하지만 SQL 자체는별로 도움이되지 않기 때문에 작업을 완료 할 수 있습니다.

이 문자의 유니 코드가 서로 가깝다는 것을 알게되면

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

그래서 1571에서 1575 사이의 أ와 σ 사이에 있거나 사이에있는 모든 것을 얻길 원한다면

1569에서 1575까지 포함 시키십시오

어느

Select NCHAR(1569) = ء
Select NCHAR(1570) = آ
Select NCHAR(1571) = أ
Select NCHAR(1572) = ؤ
Select NCHAR(1573) = إ
Select NCHAR(1574) = ئ 
Select NCHAR(1575) = ا

검색에 비슷한 것을 모두 포함 시키려면 정규식을 사용할 수 있습니다.

SELECT * 
FROM TestTable 
WHERE ArabicChars like '%[ء-ا]%'

이 경우 15와 1575 사이의 모든 문자를 포함하여 ء와 ا 사이의 모든 문자를 얻습니다.

이 경우 테이블에

 CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,
) 
INSERT INTO TestTable values (N'احمد');
INSERT INTO TestTable values (N'أحمد');
INSERT INTO TestTable values (N'إحمد');

위의 쿼리는 그들 모두를 얻을 것입니다.

그러나 당신은 뭔가 재미있는 것을 알 수 있습니다

기본 키로 열이있는 경우

CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];

이 2 개의 레코드를 삽입 할 수 없습니다

INSERT INTO TestTable values (N'أحمد');
INSERT INTO TestTable values (N'إحمد');
INSERT INTO TestTable values (N'ءحمد');

ء, أ, إ는 모두 SQL에 있기 때문에 ء 인 hamza의 일부입니다.

쿼리를 실행하면

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

그것은 당신을 보여줄 것입니다

أحمد
إحمد

긴 이야기를 짧게하려면

그것의 2 개의 다른 문자 hamza와 alefp이기 때문에

그러나 ء = آ = أ = ؤ = إ = ئ

그들은 모두 함자 입니다


위대한 작품 @ AmmarR
조지

1

이것은 내가 통과 한 가장 복잡한 문제 중 하나입니다

그래서 내가 시도하지 않은 모든 것을 쓸 것입니다. 그 후에 시작할 수 있습니다.

 CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];

CI = 대소 문자를 구분하지 않고 AI = 악센트를 구분하지 않는 COLLATE Arabic_CI_AI를 사용하여 열을 만들었습니다. 예를 들어 S 및 Š와 같은 다른 언어를 선택했기 때문에 작동합니다.

또한 데이터베이스 데이터 정렬을 Arabic_CI_AI로 변경하려고 시도했지만 여전히 작동하지 않습니다.

당신은 또한 같은 스크립트를 대조 할 수 있습니다

선택 * 테스트 테이블에서 ArabicChars COLLATE Arabic_CI_AI like 'ا %'COLLATE Arabic_CI_AI;

그리고 그것은 여전히 ​​작동하지 않았다

이 기사에서 동일한 문제에 대해 말하지만 정렬 지점에서 확인하십시오.

http://technet.microsoft.com/en-us/library/cc295829(SQL.90).aspx

이 기사에서 가져옵니다

예를 들어 정렬 순서는 아라비아 문자 ''가 ''보다 작거나 같거나 큰지 여부를 정의합니다. 또한 데이터 정렬이 악센트를 구분하는지 여부 (예 : ''가 ''와 같거나 같지 않은지)를 정의합니다.

여기 에이 문제를 연구했지만 해결책을 찾을 수없는 다른 사람이 있습니다 http://www.siao2.com/2008/11/11/9056745.aspx

분음 부호 또는 hamza를 무시하려고 노력 중입니다. 현재 SQL Server에서 불가능하다고 생각합니다.

향후 버전 일 수 있습니다


Good @ @AmmarR
George Botros

0

이 게시물에 언급 된 목적으로 만 SQL_Latin1_General_CP1251_CI_AS [아랍어 / 페르시아어 및 영어 / 라틴어 문자 세트에 대해서만 작동]를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.