Batasan kolasi dan perbedaan perilaku - Amazon Aurora

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 dan nvarchar) secara berbeda dibandingkan data yang tidak berenkode Unicode (char dan varchar). Basis data Babelfish selalu berenkode UTF-8 dan selalu menerapkan aturan pengurutan Unicode secara konsisten, terlepas dari tipe data, jadi urutan untuk char atau varchar sama dengan urutan untuk nchar atau nvarchar.

  • 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 fungsi TERTIARY_WEIGHTS dan kemampuan untuk mengurutkan string yang membandingkan secara merata dalam kolasi CI_AS yang akan diurutkan berdasarkan huruf besar terlebih dahulu: ABC, ABc, AbC, Abc, aBC, aBc, abC, dan terakhir abc. Dengan demikian, fungsi analitik DENSE_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 klausa ORDER BY yang menentukan kolasi CS_AS tersier yang menentukan @colCaseFirst=upper. Namun, pengubah colCaseFirst hanya berlaku untuk string setara tersier (bukan setara sekunder seperti kolasi CI_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 kolasi BBF_SQL_Latin1_General_CP1_CI_AS terlebih dahulu. Kemudian, tambahkan COLLATE BBF_SQL_Latin1_General_Pref_CP1_CS_AS ke klausa ORDER 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 atau varchar, urutan karakter ASCII 127 sebelumnya ditentukan oleh halaman kode spesifik untuk kolasi SQL tersebut. Untuk kolasi SQL, string yang dideklarasikan sebagai char atau varchar mungkin diurutkan secara berbeda dibandingkan string yang dideklarasikan sebagai nchar atau nvarchar.

    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, dan LEN 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 dan Katakana secara berbeda. ICU mendukung standar kolasi Jepang JIS X 4061. Pengubah lokal colhiraganaQ [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 dan Japanese_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