Coi một số ký tự tiếng Ả Rập là giống hệt nhau


10

Trong tiếng Ả Rập, chúng ta có các ký tự như: (alef) và (alef với hamza).

Người dùng viết chúng thay thế cho nhau và chúng tôi muốn tìm kiếm chúng thay thế cho nhau. SQL Server coi chúng là các ký tự riêng biệt. Làm cách nào để tạo SQL xử lý chúng như cùng một ký tự?

Tôi đã nghĩ sẽ thay thế bất kỳ (alef bằng hamza) bằng cách chèn (alef) khi chèn nhưng chúng tôi có rất nhiều lựa chọn thay thế trong ngôn ngữ Ả Rập không chỉ là ((alef) và أ (alef bằng hamza).

Tôi đã thử Arabic_CI_ASArabic_CI_AIđiều đó không giải quyết được vấn đề.

Đây là một kịch bản để tạo lại vấn đề:

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'ا%';

Kết quả là:

ArabicChars 

احمد

(1 row(s) affected)

Kết quả mong muốn sẽ là cả hai hàng chúng tôi đã chèn.


Không vấn đề gì. Aaron Bertrand có một kịch bản nhỏ đẹp mà bạn có thể điều chỉnh để kiểm tra tất cả các hợp đồng có thể. Tuy nhiên, tôi nghi ngờ không có đối chiếu sẽ coi hai nhân vật đó giống nhau.
Nick Chammas

nhưng bạn có hai ký tự khác nhau trong các tên đã nêu, ít nhất là về ngoại hình. Và tất nhiên, tôi nghĩ rằng chúng nên được coi là những ký tự khác nhauا and أ
nuux

3
@NickChammas như bạn đoán SOUNDEX () trả lại 0000 cho bất kỳ ký tự tiếng Ả Rập nào
George Botros

1
@NickChammas: đó là vấn đề sau đó: hành vi người dùng + giả định khác với hành vi đối chiếu chặt chẽ hơn.
gbn

1
@gbn - Cho rằng đây là những chữ cái khác nhau, tôi muốn nói vấn đề là giáo dục người dùng. Nếu người dùng muốn những chữ cái đó được đối xử bình đẳng - đặc biệt là trong tìm kiếm - thì chức năng đó cần được xây dựng rõ ràng. Nó không phải là một vấn đề đối chiếu.
Nick Chammas

Câu trả lời:


4

Tôi đã thực hiện một vài thử nghiệm và tôi đoán đó là một công việc xung quanh nhưng có thể hoàn thành công việc của bạn, vì SQL tự nó không giúp được gì nhiều.

nếu bạn nhận thấy rằng các ký tự của các ký tự này gần nhau

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

vì vậy, giữa và ا, từ 1571 đến 1575 hoặc nếu bạn muốn chắc chắn rằng bạn có được mọi thứ ở giữa

đảm bảo bạn bao gồm từ 1569 đến 1575

đó là

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

Vì vậy, để đảm bảo rằng bạn bao gồm mọi thứ tương tự trong tìm kiếm của mình, bạn có thể sử dụng các biểu thức thông thường

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

Vì vậy, trong trường hợp này, bạn nhận được tất cả các ký tự trong khoảng và ا, bao gồm tất cả các ký tự trong khoảng từ 1569 đến 1575

vì vậy trong trường hợp này nếu bảng của bạn có

 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'إحمد');

truy vấn trên sẽ có được tất cả.

nhưng bạn sẽ nhận thấy một cái gì đó buồn cười

nếu bạn có cột của bạn làm khóa chính

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

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

bạn sẽ không thể chèn 2 bản ghi này

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

bởi vì,, đều thuộc về SQL là một phần của hamza, đó là

Vì vậy, nếu bạn chạy truy vấn

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

nó sẽ cho bạn thấy

أحمد
إحمد

vì vậy để có được câu chuyện dài

to SQL is not = to ا vì 2 chữ cái khác nhau của nó là hamza và alefp

nhưng ء = آ = أ = ؤ = إ = ئ

họ là tất cả Hamza ء


Công việc tuyệt vời @AmmarR
George Botros

1

đây là một trong những vấn đề phức tạp nhất mà tôi đã trải qua

Vì vậy, tôi sẽ viết cho bạn tất cả những gì tôi đã cố gắng mà không làm việc, có thể bạn có thể bắt đầu sau đó

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

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

tôi đã tạo cột của bạn bằng cách sử dụng COLLATE Tiếng Ả Rập

tôi cũng đã thử thay đổi đối chiếu cơ sở dữ liệu thành tiếng Ả Rập_CI_AI vẫn không hoạt động

bạn cũng có thể đối chiếu tập lệnh như

CHỌN * TỪ TestTable WHERE ArabChars THU THẬP Ả Rập_CI_AI như 'B %%' THU LẬP Ả Rập_CI_AI;

và nó vẫn không hoạt động

kiểm tra bài viết này nó nói về cùng một vấn đề nhưng từ điểm sắp xếp

http://technet.microsoft.com/en-us/l Library / cc295829 (MySQL.90) .aspx

cái này được lấy từ bài báo

Ví dụ: thứ tự sắp xếp xác định xem ký tự tiếng Ả Rập '' nhỏ hơn, bằng hoặc lớn hơn ''. Nó cũng xác định liệu đối chiếu có nhạy cảm với dấu hay không (ví dụ: liệu '' có bằng hay không bằng '').

đây là một người khác đã nghiên cứu vấn đề này nhưng không thể tìm thấy bất kỳ giải pháp nào http://www.siao2.com/2008/11/11/9056745.aspx

cố gắng bỏ qua dấu phụ hoặc hamza tôi đoán là không thể trong máy chủ sql

có thể là phiên bản trong tương lai


Làm tốt lắm @AmmarR
George Botros

0

Đối với mục đích được đề cập trong bài đăng này, bạn chỉ có thể sử dụng: SQL_Latin1_General_CP1251_CI_AS [nó hoạt động cho các bộ ký tự tiếng Ả Rập và tiếng Ba Tư cũng như tiếng Anh / tiếng Latin].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.