SQL Server collation mana yang harus saya gunakan untuk bahasa Ibrani Alkitab Database yang dipertimbangkan perlu mengakomodasi diakritik (yaitu, vokal, aksen, kiasan, dll.).
SQL Server collation mana yang harus saya gunakan untuk bahasa Ibrani Alkitab Database yang dipertimbangkan perlu mengakomodasi diakritik (yaitu, vokal, aksen, kiasan, dll.).
Pertama: Tidak ada perbedaan, dari segi pengumpulan, antara bahasa Ibrani alkitabiah dan bahasa Ibrani modern. Kami hanya berurusan dengan bahasa Ibrani.
Kedua: Terlepas dari apa pun, Anda ingin menggunakan kumpulan kolasi terbaru, yang merupakan Biasanya saya sangat merekomendasikan menggunakan versi terbaru dari apa pun pemeriksaan yang Anda butuhkan, tetapi setidaknya dalam satu contoh ini ada alasan yang baik untuk menggunakan versi tanpa nomor versi dalam nama. Versi 100 (atau yang lebih baru) jauh lebih lengkap, dan dapat membedakan antara karakter tambahan (atau bahkan sepenuhnya mendukung mereka jika menggunakan _100_
seri karena mereka memiliki bobot sortir dan aturan linguistik yang lebih baru / lebih lengkap daripada seri yang lebih lama tanpa nomor versi dalam namanya (secara teknis versi are 80
).SC
atau 140
koleksi), tetapi dengan asumsi bahwa Anda tidak berurusan dengan karakter tambahan, maka versi 80 (tidak ada versi number in name) collations melakukan pekerjaan yang lebih baik dalam menangani bahasa Ibrani (lihat item "Keenam" di bawah).
Ketiga: Tidak ada konsep "Kana" (atau tipe Kana) dalam bahasa Ibrani, jadi Anda dapat mengabaikan variasi variasi penyebutan dengan _KS
namanya (karena itu adalah sensitivitas yang tidak akan pernah Anda gunakan).
Keempat: Penyusunan yang diakhiri dengan _SC
karakter pelengkap dukungan (yaitu UTF-16 penuh) jadi biasanya yang terbaik untuk memilih salah satunya, jika tersedia (artinya: jika Anda menggunakan SQL Server 2012 atau yang lebih baru).
Kelima: Anda tidak ingin collation biner ( _BIN
atau _BIN2
) karena mereka tidak dapat membedakan antara huruf Ibrani dengan kedua vokal dan cantillation yang sama tetapi memiliki karakter menggabungkan dalam urutan yang berbeda, mereka juga tidak dapat mengabaikan vokal dan tanda lain untuk menyamakan hal-hal seperti א
dan אֽ
.
Misalnya (tanda vokal dan cantillation menggabungkan karakter dalam urutan yang berlawanan):
SELECT NCHAR(0x05D0) + NCHAR(0x059C) + NCHAR(0x05B8),
NCHAR(0x05D0) + NCHAR(0x05B8) + NCHAR(0x059C)
WHERE NCHAR(0x05D0) + NCHAR(0x059C) + NCHAR(0x05B8) =
NCHAR(0x05D0) + NCHAR(0x05B8) + NCHAR(0x059C) COLLATE Hebrew_100_CS_AS_SC;
-- אָ֜ אָ֜
SELECT NCHAR(0x05D0) + NCHAR(0x059C) + NCHAR(0x05B8),
NCHAR(0x05D0) + NCHAR(0x05B8) + NCHAR(0x059C)
WHERE NCHAR(0x05D0) + NCHAR(0x059C) + NCHAR(0x05B8) =
NCHAR(0x05D0) + NCHAR(0x05B8) + NCHAR(0x059C) COLLATE Hebrew_100_BIN2;
-- no rows
Keenam: Itu tergantung pada bagaimana Anda akan berinteraksi dengan nilai-nilai string. Bahasa Ibrani tidak memiliki huruf besar / kecil, namun ada beberapa poin kode yang dipengaruhi oleh sensitivitas huruf. Bahkan ada beberapa titik kode yang peka terhadap lebar. Aksen-sensitif / tidak sensitif mempengaruhi diakritik yang digunakan untuk vokal, pengucapan, dan tanda cantillation (yaitu kiasan).
Apakah Anda perlu membedakan antara bentuk final dan non-final dari surat yang sama? Ada lima huruf dalam bahasa Ibrani yang terlihat berbeda ketika digunakan sebagai huruf terakhir dari sebuah kata. SQL Server menangani ini melalui case-sensitivity / _CS
collations (walaupun, sayangnya, tampaknya rusak di yang lebih baru, dan versi yang lebih baik, collations 100 dan lebih baru):
SELECT NCHAR(0x05DE) AS [Mem],
NCHAR(0x05DD) AS [Final Mem]
WHERE NCHAR(0x05DE) = NCHAR(0x05DD) COLLATE Hebrew_CI_AS_KS_WS;
-- 1 row (expected; all sensitive except case)
-- Mem Final Mem
-- מ ם
SELECT NCHAR(0x05DE) AS [Mem],
NCHAR(0x05DD) AS [Final Mem]
WHERE NCHAR(0x05DE) = NCHAR(0x05DD) COLLATE Hebrew_CS_AI;
-- no rows (expected; all insensitive except case)
SELECT NCHAR(0x05DE) AS [Mem],
NCHAR(0x05DD) AS [Final Mem]
WHERE NCHAR(0x05DE) = NCHAR(0x05DD) COLLATE Hebrew_100_CI_AI;
-- no rows (expected 1 row; all insensitive)
Apakah Anda perlu membedakan antara tanda pelafalan, vokal, dan tanda cantillation? SQL Server menangani ini melalui aksen-sensitivitas / _AS
collations (walaupun, sayangnya, tampaknya rusak di yang lebih baru, dan versi yang lebih baik, collations 100 dan lebih baru). Harap dicatat bahwa ketiganya dikelompokkan bersama di bawah sensitivitas aksen dan tidak dapat dikontrol secara terpisah (mis. Anda tidak dapat melakukan peka huruf vokal tetapi cantillation tidak peka).
Tanda pelafalan
Ada beberapa huruf yang memiliki dua suara berbeda. Kadang-kadang satu-satunya indikator yang menggunakan bunyi adalah konteks dari kata mana huruf itu berada (dan kadang-kadang bahkan kata-kata sekitarnya), seperti dalam Taurat yang sebenarnya (di mana tidak ada tanda pengucapan atau vokal). Tapi, teks yang sama dalam bentuk lain, seperti halnya teks lainnya, akan memiliki titik-titik yang ditempatkan di dalam surat, atau untuk huruf Shin, di atas huruf. Huruf Shin dapat memiliki bunyi "sh" atau "s". Untuk menunjukkan bunyi "sh" (yaitu huruf "shin"), ada titik di atas di sisi kanan, sedangkan titik di atas di sisi kiri menunjukkan bunyi "s" (huruf "sin"):
SELECT NCHAR(0x05E9) AS [Shin], -- ש
NCHAR(0x05E9) + NCHAR(0x05C1) AS [Shin + Shin Dot], -- שׁ
NCHAR(0x05E9) + NCHAR(0x05C2) AS [Shin + Sin Dot] -- שׂ
WHERE NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C1) COLLATE Hebrew_CS_AI_KS_WS
AND NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C2) COLLATE Hebrew_CS_AI_KS_WS;
-- 1 row (expected; all sensitive except accent)
SELECT NCHAR(0x05E9) AS [Shin], -- ש
NCHAR(0x05E9) + NCHAR(0x05C1) AS [Shin + Shin Dot], -- שׁ
NCHAR(0x05E9) + NCHAR(0x05C2) AS [Shin + Sin Dot] -- שׂ
WHERE NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C1) COLLATE Hebrew_CI_AS
OR NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C2) COLLATE Hebrew_CI_AS;
-- no rows (expected; all insensitive except accent)
SELECT NCHAR(0x05E9) AS [Shin], -- ש
NCHAR(0x05E9) + NCHAR(0x05C1) AS [Shin + Shin Dot], -- שׁ
NCHAR(0x05E9) + NCHAR(0x05C2) AS [Shin + Sin Dot] -- שׂ
WHERE NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C1) COLLATE Hebrew_100_CI_AI_SC
OR NCHAR(0x05E9) = NCHAR(0x05E9) + NCHAR(0x05C2) COLLATE Hebrew_100_CI_AI_SC;
-- no rows (expected 1 row; all insensitive)
Vokal
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05B8) AS [Aleph with vowel] -- אָ
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05B8) COLLATE Hebrew_CS_AI_KS_WS;
-- 1 row (expected; all sensitive except accent)
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05B8) AS [Aleph with vowel] -- אָ
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05B8) COLLATE Hebrew_CI_AS;
-- no rows (expected; all insensitive except accent)
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05B8) AS [Aleph with vowel] -- אָ
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05B8) COLLATE Hebrew_100_CI_AI_SC;
-- no rows (expected 1 row; all insensitive)
Tanda kantilasi
Secara teknis, menurut data Unicode resmi, tanda cantillation Ibrani diabaikan dan hanya boleh didaftarkan sebagai perbedaan di sini saat menggunakan pengumpulan biner. Namun, SQL Server memperlakukannya sama dengan aksen (sayangnya) dan tidak dapat mengabaikannya secara terpisah dari tanda pelafalan atau vokal.
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05A8) AS [Aleph with cantillation mark] -- א֨
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05A8) COLLATE Hebrew_CS_AI_KS_WS;
-- 1 row (expected; all sensitive except accent)
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05A8) AS [Aleph with cantillation mark] -- א֨
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05A8) COLLATE Hebrew_CI_AS;
-- no rows (expected; all insensitive except accent)
SELECT NCHAR(0x05D0) AS [Aleph], -- א
NCHAR(0x05D0) + NCHAR(0x05A8) AS [Aleph with cantillation mark] -- א֨
WHERE NCHAR(0x05D0) =
NCHAR(0x05D0) + NCHAR(0x05A8) COLLATE Hebrew_100_CI_AI_SC;
-- no rows (expected 1 row; all insensitive)
Apakah Anda perlu membedakan antara bentuk lebar dan tidak lebar dari surat yang sama? Ada delapan huruf dalam bahasa Ibrani yang diregangkan (lebar) tetapi hanya untuk tujuan penggunaan dalam gulungan Taurat (baik tulisan tangan / nyata atau dicetak) untuk menjaga format kolom sepenuhnya dibenarkan (yang sebenarnya bagaimana itu muncul dalam gulungan Taurat ). SQL Server menangani ini melalui lebar-sensitivitas / _WS
collations (cukup menarik, tampaknya satu-satunya sensitivitas yang bekerja dengan benar di versi 100 yang lebih baru dan collations yang lebih baru, meskipun sayangnya, ini adalah yang paling mungkin untuk digunakan):
SELECT NCHAR(0x05DC) AS [Lamed],
NCHAR(0xFB25) AS [Wide Lamed]
WHERE NCHAR(0x05DC) = NCHAR(0xFB25) COLLATE Hebrew_CI_AI;
-- no rows (expected 1 row; all insensitive)
SELECT NCHAR(0x05DC) AS [Lamed],
NCHAR(0xFB25) AS [Wide Lamed]
WHERE NCHAR(0x05DC) = NCHAR(0xFB25) COLLATE Hebrew_100_CS_AS_KS_SC;
-- 1 row (expected; all sensitive except width)
-- Lamed Wide Lamed
-- ל ﬥ
SELECT NCHAR(0x05DC) AS [Lamed],
NCHAR(0xFB25) AS [Wide Lamed]
WHERE NCHAR(0x05DC) = NCHAR(0xFB25) COLLATE Hebrew_100_CI_AI_WS_SC;
-- no rows (expected; all insensitive except width)
Jadi, mungkin Hebrew_CI_AI
untuk kolom, dan Anda dapat mengganti per ekspresi / predikat melalui COLLATE
pernyataan jika Anda perlu menggunakan variasi, seperti COLLATE Hebrew_CS_AI
atau Hebrew_CI_AS
atau Hebrew_CS_AS
.
catatan tambahan
Anda perlu menyimpan data dalam NVARCHAR
kolom / variabel. Anda bisa menyelesaikan sebagian besar ini dalam 8-bit biasa VARCHAR
menggunakan halaman kode Windows-1255 (yang semuanya ituHebrew_*
kumpulan), termasuk menggabungkan karakter untuk vokal dan titik pengucapan:
;WITH Hebrew AS
(
SELECT NCHAR(0x05E9) + NCHAR(0x05C1) + NCHAR(0x05B8)
COLLATE Hebrew_100_CS_AS AS [Shin]
)
SELECT
Hebrew.[Shin] AS [Unicode],
CONVERT(VARCHAR(20), Hebrew.[Shin]) AS [CodePage1255],
CONVERT(VARBINARY(10), CONVERT(VARCHAR(20), Hebrew.[Shin])) AS [CodePage1255_bytes]
FROM Hebrew;
-- Unicode CodePage1255 CodePage1255_bytes
-- שָׁ שָׁ F9D1C8
Namun, hanya Unicode Hebrew block yang berisi tanda cantillation (yaitu trope; kode poin U + 0591 hingga U + 05AF) ditambah beberapa ekstra (titik kode U + 05C4 hingga U + 05C7), dan blok Bentuk Presentasi Alfabet berisi lebar varian beberapa huruf plus beberapa hal lainnya.
Menurut aturan resmi Unicode CLDR (penjahit khusus lokal) untuk budaya Ibrani ("he" dan "he-IL"), U + 05F3 HEBREW PUNCTUATION GERESH harus cocok atau datang sebelumnya , U + 0027 APOSTROPHE. Biasanya, U + 05F3 diurutkan setelah apostrof. Perilaku ini memang terlihat ketika menggunakan ICA collation demo dan beralih antara "sortir" / urutan standar (digunakan oleh US English / "en-US") dan "he". Namun, perilaku ini tampaknya tidak tersedia di .NET atau SQL Server:
SELECT NCHAR(0x05F3)
WHERE NCHAR(0x05F3) <= N'''' COLLATE Hebrew_100_CS_AS_KS_WS;
-- no rows
SELECT NCHAR(0x05F3)
WHERE NCHAR(0x05F3) <= N'''' COLLATE Hebrew_CS_AS_KS_WS;
-- no rows
Meskipun kelalaian yang tidak menguntungkan, masuk akal mengingat bahwa saya tidak melihat "he" atau "he-IL" -penyesuaian khusus dalam file Windows Sorting Weight Table. Ini bisa sangat berarti bahwa tidak ada perbedaan aktual antara Hebrew_*
dan Latin1_General_*
koleksi di luar halaman kode terkait, yang hanya digunakan untuk VARCHAR
data, dan itu tidak berlaku di sini.
OP menjawab dengan:
Ya, saya perlu membedakan antara: 1) bentuk final dan non-final dari huruf yang sama 2) tanda pengucapan 3) vokal, dan 4) tanda cantillation.
Dalam hal ini, karena Anda tidak perlu mengabaikan perbedaan antara properti tersebut, Anda dapat menggunakan 100 level collations. Contoh di bawah ini menunjukkan huruf Ibrani (Dosa) dengan tanda pelafalan, tanda cantillation, dan vokal. Ada enam versi sehingga setiap kemungkinan kombinasi urutan karakter penggabungan dapat direpresentasikan. Ada entri ketujuh yang menggunakan titik lainnya untuk membuat huruf Shin dengan huruf dasar, vokal, dan tanda cantillation yang sama. Kueri menunjukkan bahwa hanya enam entri "Sin" yang cocok satu sama lain (bahkan dengan urutan byte yang berbeda), tetapi tidak dengan "Shin".
Saya menyertakan penggunaan Latin1_General
dan susunan Japanese_XJIS_140
untuk menunjukkan bahwa aturan berfungsi dengan baik juga jika Anda perlu memanfaatkannya (susunan 140
, hanya dalam bahasa Jepang, memiliki lebih banyak pemetaan huruf besar / huruf kecil daripada versi yang lebih lama). Tetapi secara umum, mungkin yang terbaik untuk tetap menggunakan koleksi Ibrani, dan menggunakan 100
versi non- versi jika Anda perlu mengabaikan perbedaan dalam vokal, tanda, titik, dan bentuk final vs non-final.
DECLARE @Shin NVARCHAR(5) = NCHAR(0x05E9), -- base Hebrew letter
@Dot NVARCHAR(5) = NCHAR(0x05C2), -- Sin Dot
@Mark NVARCHAR(5) = NCHAR(0x05A8), -- Cantillation Mark (i.e. trope)
@Vowel NVARCHAR(5) = NCHAR(0x05B8); -- Vowel
DECLARE @Dot_Mark_Vowel NVARCHAR(20) = @Shin + @Dot + @Mark + @Vowel,
@Dot_Vowel_Mark NVARCHAR(20) = @Shin + @Dot + @Vowel + @Mark,
@Vowel_Dot_Mark NVARCHAR(20) = @Shin + @Vowel + @Dot + @Mark,
@Vowel_Mark_Dot NVARCHAR(20) = @Shin + @Vowel + @Mark + @Dot,
@Mark_Vowel_Dot NVARCHAR(20) = @Shin + @Mark + @Vowel + @Dot,
@Mark_Dot_Vowel NVARCHAR(20) = @Shin + @Mark + @Dot + @Vowel,
@ShinDot_Mark_Vowel NVARCHAR(20) = @Shin + NCHAR(0x05C1) + @Mark + @Vowel;
SELECT @Dot_Mark_Vowel AS [Sin], @ShinDot_Mark_Vowel AS [Shin];
;WITH chr AS
(
SELECT *
FROM (VALUES
(@Dot_Mark_Vowel, 'Dot + Mark + Vowel'),
(@Dot_Vowel_Mark, 'Dot + Vowel + Mark'),
(@Vowel_Dot_Mark, 'Vowel + Dot + Mark'),
(@Vowel_Mark_Dot, 'Vowel + Mark + Dot'),
(@Mark_Vowel_Dot, 'Mark + Vowel + Dot'),
(@Mark_Dot_Vowel, 'Mark + Dot + Vowel'),
(@ShinDot_Mark_Vowel, 'ShinDot + Mark + Vowel')
) tmp([Hebrew], [Description])
) SELECT chr1.[Hebrew],
'--' AS [---],
chr1.[Description] AS [Description_1],
CONVERT(VARBINARY(20), RIGHT(chr1.[Hebrew], 3)) AS [Bytes_1],
'--' AS [---],
chr2.[Description] AS [Description_2],
CONVERT(VARBINARY(20), RIGHT(chr2.[Hebrew], 3)) AS [Bytes_2]
FROM chr chr1
CROSS JOIN chr chr2
WHERE chr1.[Description] <> chr2.[Description] -- do not compare item to itself
AND chr1.[Hebrew] = chr2.[Hebrew] COLLATE Hebrew_100_CS_AS_SC
AND chr1.[Hebrew] = chr2.[Hebrew] COLLATE Latin1_General_100_CS_AS_SC
AND chr1.[Hebrew] = chr2.[Hebrew] COLLATE Japanese_XJIS_140_CS_AS;
-- this query returns 30 rows
Itu tergantung pada banyak hal. Collation menyortir, membandingkan, dan halaman kode non-unicode.
Repo ini memiliki daftar opsi yang bagus seputar bahasa Ibrani.
sumber