Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Batasan kolasi dan perbedaan perilaku
Babelfish menggunakan pustaka ICU untuk dukungan kolasi. PostgreSQL dibuat dengan versi ICU tertentu dan dapat mencocokkan paling banyak satu versi kolasi. Variasi antarversi tidak dapat dihindari, begitu juga variasi kecil sepanjang waktu seiring berkembangnya bahasa. Dalam daftar berikut, Anda dapat menemukan batasan dan variasi perilaku yang diketahui dari kolasi Babelfish:
Ketergantungan tipe indeks dan pemeriksaan – Indeks pada tipe yang ditentukan pengguna yang bergantung pada pustaka kolasi International Components for Unicode (ICU) (pustaka yang digunakan oleh Babelfish) valid saat versi pustaka berubah.
Fungsi COLLATIONPROPERTY – Properti kolasi diimplementasikan hanya untuk kolasi BBF Babelfish yang didukung. Untuk informasi selengkapnya, lihat Babelfish supported collations table.
Perbedaan aturan pengurutan Unicode – Kolasi SQL untuk SQL Server mengurutkan data yang berenkode Unicode (
nchar
dannvarchar
) secara berbeda dibandingkan data yang tidak berenkode Unicode (char
danvarchar
). Basis data Babelfish selalu berenkode UTF-8 dan selalu menerapkan aturan pengurutan Unicode secara konsisten, terlepas dari tipe data, jadi urutan untukchar
atauvarchar
sama dengan urutan untuknchar
ataunvarchar
.-
Perilaku pengurutan dan kolasi setara sekunder – Kolasi ICU Unicode setara sekunder default (
CI_AS
) mengurutkan tanda baca dan karakter nonalfanumerik lainnya sebelum karakter numerik, dan karakter numerik sebelum karakter abjad. Namun, urutan tanda baca dan karakter khusus lainnya berbeda. -
Kolasi tersier, solusi untuk ORDER BY – Kolasi SQL, seperti
SQL_Latin1_General_Pref_CP1_CI_AS
, mendukung fungsiTERTIARY_WEIGHTS
dan kemampuan untuk mengurutkan string yang membandingkan secara merata dalam kolasiCI_AS
yang akan diurutkan berdasarkan huruf besar terlebih dahulu:ABC
,ABc
,AbC
,Abc
,aBC
,aBc
,abC
, dan terakhirabc
. Dengan demikian, fungsi analitikDENSE_RANK OVER (ORDER BY column)
menilai string-string ini sebagai memiliki peringkat yang sama tetapi mengurutkan string berdasarkan huruf besar terlebih dahulu dalam sebuah partisi.Anda bisa mendapatkan hasil yang serupa menggunakan Babelfish dengan menambahkan klausa
COLLATE
ke klausaORDER BY
yang menentukan kolasiCS_AS
tersier yang menentukan@colCaseFirst=upper
. Namun, pengubahcolCaseFirst
hanya berlaku untuk string setara tersier (bukan setara sekunder seperti kolasiCI_AS
). Jadi, Anda tidak dapat mengemulasi kolasi SQL tersier menggunakan satu kolasi ICU.Sebagai solusinya, kami merekomendasikan agar Anda mengubah aplikasi yang menggunakan kolasi
SQL_Latin1_General_Pref_CP1_CI_AS
untuk menggunakan kolasiBBF_SQL_Latin1_General_CP1_CI_AS
terlebih dahulu. Kemudian, tambahkanCOLLATE BBF_SQL_Latin1_General_Pref_CP1_CS_AS
ke klausaORDER BY
apa pun untuk kolom ini. -
Ekspansi karakter – Ekspansi karakter memperlakukan satu karakter sama dengan urutan karakter di tingkat primer. Kolasi
CI_AS
default SQL Server mendukung ekspansi karakter. Kolasi ICU mendukung ekspansi karakter hanya untuk kolasi yang tidak peka terhadap aksen.Ketika ekspansi karakter diperlukan, gunakan kolasi
AI
untuk perbandingan. Namun, kolasi tersebut saat ini tidak didukung oleh operator LIKE. -
enkode char dan varchar – Ketika kolasi SQL digunakan untuk tipe data
char
atauvarchar
, urutan karakter ASCII 127 sebelumnya ditentukan oleh halaman kode spesifik untuk kolasi SQL tersebut. Untuk kolasi SQL, string yang dideklarasikan sebagaichar
atauvarchar
mungkin diurutkan secara berbeda dibandingkan string yang dideklarasikan sebagainchar
ataunvarchar
.PostgreSQL mengenkode semua string dengan enkode basis data, sehingga semua karakter dikonversi ke UTF-8 dan diurutkan menggunakan aturan Unicode.
Karena kolasi SQL mengurutkan tipe data nchar dan nvarchar menggunakan aturan Unicode, Babelfish mengenkode semua string di server menggunakan UTF-8. Babelfish mengurutkan string nchar dan nvarchar dengan cara yang sama seperti mengurutkan string char dan varchar, yaitu menggunakan aturan Unicode.
-
Karakter tambahan – Fungsi SQL Server
NCHAR
,UNICODE
, danLEN
mendukung karakter untuk titik kode di luar Unicode Basic Multilingual Plane (BMP). Sebaliknya, kolasi non-SC menggunakan karakter pasangan pengganti untuk menangani karakter tambahan. Untuk tipe data Unicode, SQL Server dapat mewakili hingga 65.535 karakter menggunakan UCS-2, atau rentang Unicode penuh (1.114.114 karakter) jika karakter tambahan digunakan. -
Kolasi yang peka terhadap Kana (KS) – Kolasi yang peka terhadap Kana (KS) adalah salah satu kolasi yang memperlakukan karakter Kana Jepang
Hiragana
danKatakana
secara berbeda. ICU mendukung standar kolasi JepangJIS X 4061
. Pengubah lokalcolhiraganaQ [on | off]
yang kini tidak digunakan lagi mungkin menyediakan fungsi yang sama dengan kolasi KS. Namun, kolasi KS untuk nama yang sama dengan SQL Server saat ini tidak didukung oleh Babelfish. -
Kolasi yang peka terhadap lebar (WS) – Ketika karakter byte tunggal (lebar setengah) dan karakter sama yang direpresentasikan sebagai karakter byte ganda (lebar penuh) diperlakukan secara berbeda, kolasi ini disebut sebagai peka terhadap lebar (WS). Kolasi WS untuk nama yang sama dengan SQL Server saat ini tidak didukung oleh Babelfish.
-
Kolasi yang peka terhadap pemilih variasi (VSS) – Kolasi yang peka terhadap pemilih variasi (VSS) membedakan antara pemilih variasi ideografis dalam kolasi Jepang
Japanese_Bushu_Kakusu_140
danJapanese_XJIS_140
. Urutan variasi terdiri dari karakter dasar ditambah pemilih variasi tambahan. Jika Anda tidak memilih opsi_VSS
, pemilih variasi tidak dipertimbangkan dalam perbandingan.Kolasi VSS saat ini tidak didukung oleh Babelfish.
-
Kolasi BIN dan BIN2 – Kolasi BIN2 mengurutkan karakter menurut urutan titik kode. Urutan biner byte-per-byte UTF-8 mempertahankan urutan titik kode Unicode, sehingga kolasi ini juga cenderung menjadi kolasi dengan performa terbaik. Jika urutan titik kode Unicode berfungsi untuk aplikasi, pertimbangkan untuk menggunakan kolasi BIN2. Namun, penggunaan kolasi BIN2 dapat mengakibatkan data ditampilkan kepada klien dalam urutan yang tidak terduga secara budaya. Pemetaan baru untuk karakter huruf kecil ditambahkan ke Unicode seiring berjalannya waktu, sehingga fungsi
LOWER
mungkin memiliki performa yang berbeda pada versi ICU yang berbeda. Kasus ini bersifat khusus untuk masalah versioning kolasi yang lebih umum daripada sebagai satu kasus spesifik untuk kolasi BIN2.Babelfish menyediakan kolasi
BBF_Latin1_General_BIN2
dengan distribusi Babelfish untuk membuat kolasi dalam urutan titik kode Unicode. Dalam kolasi BIN, hanya karakter pertama yang diurutkan sebagai wchar. Karakter yang tersisa diurutkan byte-per-byte, secara efektif dalam urutan titik kode sesuai dengan enkodenya. Pendekatan ini tidak mengikuti aturan kolasi Unicode dan tidak didukung oleh Babelfish. Kolasi nondeterministik dan batasan CHARINDEX – Untuk rilis Babelfish yang lebih lama dari versi 2.1.0, Anda tidak dapat menggunakan CHARINDEX dengan kolasi nondeterministik. Secara default, Babelfish menggunakan kolasi yang tidak peka terhadap huruf besar/kecil (nondeterministik). Menggunakan CHARINDEX untuk versi Babelfish yang lebih lama akan menimbulkan kesalahan runtime berikut:
nondeterministic collations are not supported for substring searches
catatan
Batasan dan solusi ini hanya berlaku untuk Babelfish versi 1.x (versi Aurora PostgreSQL 13.x). Babelfish 2.1.0 dan rilis yang lebih tinggi tidak memiliki masalah ini.
Anda dapat mengatasi masalah ini dengan salah satu cara berikut:
Ubah ekspresi secara eksplisit menjadi kolasi yang peka terhadap huruf besar/kecil dan seragamkan huruf besar/kecil pada kedua argumen dengan menerapkan LOWER atau UPPER. Misalnya,
SELECT charindex('x', a) FROM t1
akan menjadi berikut:SELECT charindex(LOWER('x'), LOWER(a COLLATE sql_latin1_general_cp1_cs_as)) FROM t1
Buat fungsi SQL f_charindex, lalu ganti panggilan CHARINDEX dengan panggilan ke fungsi berikut:
CREATE function f_charindex(@s1 varchar(max), @s2 varchar(max)) RETURNS int AS BEGIN declare @i int = 1 WHILE len(@s2) >= len(@s1) BEGIN if LOWER(@s1) = LOWER(substring(@s2,1,len(@s1))) return @i set @i += 1 set @s2 = substring(@s2,2,999999999) END return 0 END go