아랍어에는 ا (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)
원하는 결과는 삽입 한 두 행 모두입니다.
답변
나는 몇 가지 테스트를했는데 해결 방법이라고 생각하지만 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이기 때문에
그러나 ء = آ = أ = ؤ = إ = ئ
그들은 모두 함자 입니다
답변
이것은 내가 통과 한 가장 복잡한 문제 중 하나입니다
그래서 내가 시도하지 않은 모든 것을 쓸 것입니다. 그 후에 시작할 수 있습니다.
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에서 불가능하다고 생각합니다.
향후 버전 일 수 있습니다
답변
이 게시물에 언급 된 목적으로 만 SQL_Latin1_General_CP1251_CI_AS [아랍어 / 페르시아어 및 영어 / 라틴어 문자 세트에 대해서만 작동]를 사용할 수 있습니다.