Bagikan melalui


Pengurutan

Penting

Fitur ini ada di Pratinjau Umum.

Berlaku untuk:dilakukan pemeriksaan dengan tanda centang ya Databricks SQL dengan tanda centang ya Databricks Runtime 16.1 ke atas

Kolase adalah sekumpulan aturan yang menentukan bagaimana perbandingan string dilakukan. Kolasi digunakan untuk membandingkan string dalam urutan tidak peka huruf besar/kecil, tidak peka aksen, atau tidak peka spasi akhir, atau untuk mengurutkan string dalam urutan yang memperhatikan bahasa tertentu.

String di Azure Databricks direpresentasikan sebagai karakter Unicode yang dikodekanUTF-8. Secara default, Azure Databricks membandingkan string dengan representasi UTF8 biner mereka. Ini dikenal sebagai kolase UTF8_BINARY. UTF8_BINARY perbandingan cepat dan tepat dalam banyak kasus, tetapi mungkin tidak cocok untuk semua aplikasi, terutama aplikasi yang memerlukan pengurutan atau perbandingan yang mempertimbangkan bahasa.

Selain perbandingan sadar bahasa, kasus penggunaan umum adalah menerapkan tidak sensitif terhadap huruf besar/kecil. Azure Databricks memiliki kolasi UTF8_LCASE khusus untuk tujuan ini. Ini mengonversi string menjadi huruf kecil sebelum membandingkannya menggunakan pengurutan cepat UTF8_BINARY.

Untuk perbandingan sadar bahasa, Azure Databricks menggunakan teknologi berikut:

Teknologi ini dienkapsulasi dalam satu set kolase bernama yang dapat digunakan dalam pernyataan SQL.

Nama kolasi

Karena mengidentifikasi pengurutan berdasarkan spesifikasi LDML mereka bisa rumit dan menantang untuk dibaca, Azure Databricks memiliki serangkaian pengurutan sistem yang sudah diberi nama dan lebih mudah digunakan.

Sintaksis

{ UTF8_BINARY |
  UTF8_LCASE |
  { UNICODE | locale } [ _ modifier [...] ] }

locale
  language_code [ _ script_code ] [ _ country_code ]

modifier
  { CS | CI | AS | AI | RTRIM }
  • UTF8_BINARY

    Urutan biner meta-locale yang membandingkan string satu per satu berdasarkan representasi byte UTF-8. UTF8_BINARY adalah kolate default dan paling ringan untuk perbandingan string di Azure Databricks.

    Dalam kolatasi ini 'A' (x'65') < 'B' (x'66') < ... < 'Z' (x'90').

    Namun, 'Z' (x'90') < 'a' (x'97'), dan 'A' (x'65') <> 'a' (x'97').

    Selanjutnya, karakter seperti 'Ä' (x'C384') lebih besar dari 'Z' dan 'z' dalam kolase ini.

  • UTF8_LCASE

    Kolasi tidak peka huruf besar/kecil meta-locale ringan yang membandingkan string menggunakan representasi byte UTF-8 setelah mengonversi string menjadi huruf kecil.

    UTF8_LCASE adalah kolasasi yang digunakan untuk pengidentifikasi di Azure Databricks.

    Misalnya:

    ORDER BY col COLLATE UTF8_LCASE
    

    setara dengan

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Lokal dasar ICU.

    Pengurutan ini, yang dikenal dalam CLDR sebagai 'locale' root (spesifikasi LDML: 'und-u') menetapkan urutan yang tidak bergantung pada bahasa, dengan tujuan untuk menjadi intuitif. Dalam kolasi ini, karakter mirip dikelompokkan. Misalnya: 'a' < 'A' < 'Ä' < 'b'. 'A' tidak dianggap setara dengan 'a'. Oleh karena itu, pengurutan membedakan huruf besar dan kecil. 'a' tidak dianggap setara dengan 'ä'. Oleh karena itu, pengurutan sensitif terhadap aksen.

  • Lokasi

    Pengurutan yang peka terhadap lokalitas berdasarkan tabel CLDR.

    Lokal ditentukan sebagai kode bahasa, kode skrip opsional, dan kode negara opsional. locale tidak peka terhadap huruf besar atau kecil.

    • language_code: Kode bahasa ISO 639-1 dua huruf.
    • script_code: Kode skrip empat huruf ISO 15924.
    • country_code: Kode negara ISO 3166-1 alpha-3 tiga huruf.
  • Pengubah

    Menentukan perilaku penyusunan terkait sensitivitas huruf besar/kecil dan aksen.

    • CS: Peka huruf besar/kecil. Perilaku bawaan.
    • CI: Tidak peka huruf besar/kecil.
    • AS: Sensitif terhadap aksen. Perilaku bawaan.
    • AI: Tidak peka terhadap aksen.

    Berlaku untuk: ditandai dengan centang Databricks SQL ditandai dengan centang Databricks Runtime 16.2 ke atas

    • RTRIM: Tidak peka terhadap spasi di akhir. Memangkas spasi di belakang ('u0020') sebelum perbandingan.

    Berlaku untuk:dicentang ya Databricks SQL dicentang ya Databricks Runtime 16.2 dan versi lebih baru

    Anda dapat menentukan RTRIM, entah CS atau CI, dan entah AS atau AI masing-masing maksimal satu kali dan dalam urutan apa pun. Pengubah itu sendiri tidak peka huruf besar/kecil.

Saat memproses kolasi, Azure Databricks menormalkan nama kolasi dengan menghapus default. Misalnya, SR_CYR_SRN_CS_AS dinormalisasi ke SR.

Untuk daftar kolatasi yang didukung, lihat Kolate yang didukung.

Contoh

-- You can fully qualify collations, and case doesn't matter.
system.builtin.unicode

-- Since all collations are system defined you don't need to qualify them
unicode

-- Using 2-letter language code only for german collation
DE

-- Using 2-letter language code and 3-letter country code for french-canadian collation
-- It is common to use lower case 2-letter language codes and upper case 3-letter country codes
-- But collation names are case insensitive
fr_CAN

-- Using 2-letter language code and 4-letter script code and 3-letter country code for traditional chinese in Macao
zh_Hant_MAC

-- Using a 2 letter german language code and 2 modifiers for case insensitive and accent insensitive
-- So 'Ä', 'A', and 'a' are all considered equal
de_CI_AI

-- Using back ticks is allowed, but unnecessary for builtin collations
`UTF8_BINARY`

Pengurutan bawaan

Kolase default berlaku saat menggunakan STRING literal, penanda parameter, fungsi tanpa parameter STRING menghasilkan string, dan saat menentukan jenis kolom, bidang, atau variabel tanpa klausa COLLATE.

Pengurutan default diperoleh dengan salah satu cara berikut:

  • Untuk pernyataan DDL seperti ALTER TABLE, , CREATE VIEW, CREATE TABLEdan CREATE FUNCTION:

    • Kolase default adalah kolase default objek yang sedang dibuat atau diubah.
    • Jika tidak ada klausa DEFAULT COLLATION yang ditentukan, pengurutan default adalah UTF8_BINARY.
  • Untuk pernyataan DML (UPDATE, DELETE, INSERT, MERGE), dan kueri , kolase defaultnya adalah UTF8_BINARY.

Prioritas kolase

Untuk memutuskan kolase mana yang akan digunakan untuk string tertentu, Azure Databricks menentukan aturan prioritas kolase.

Aturan menetapkan 4 tingkat prioritas untuk kolase:

  1. Eksplisit

    Pengurutan telah secara eksplisit ditetapkan ke string menggunakan ekspresi COLLATE.

    Contoh

    -- Force fast binary collation to check whether a vin matches a Ferrari
    vin COLLATE UTF8_BINARY LIKE 'ZFF%'
    
    -- Force German collation to order German first names
    ORDER BY vorname COLLATE DE
    
  2. Implisit

    Pengurutan secara implisit ditetapkan oleh kolom , kolom , alias-kolom , variabel , atau parameter rutin referensi. Ini termasuk hasil subkueri selama kolase bukan Tidak Ada.

    Contoh

    -- Use the collation of the column as it was defined
    employee.name LIKE 'Mc%'
    
    -- Use the collation of the variable as it was defined.
    translate(session.tempvar, 'Z', ',')
    
  3. Standar

    STRING parameter literal, bernama atau tidak bernama, atau penanda atau STRING diproduksi oleh fungsi dari jenis lain.

    Contoh

    -- A literal string has the default collation
    'Hello'
    
    -- :parm1 is a parameter marker using session default collation
    EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1;
    
    -- ? is a parameter marker using session default collation
    EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello';
    
    -- The result of a cast of a non-STRING to a STRING is a STRING with the default collation
    CAST(5 AS STRING)
    
    -- The date is converted to a string using the default collation
    to_char(DATE'2016-04-08', 'y')
    
    -- The collation of the session_user STRING is the default collation
    session_user()
    

    Kolase yang ditetapkan adalah Kolase Default.

  4. Tidak

    Hasil dari fungsi, operator, atau operasi set (misalnya ) yang mengambil lebih dari satu argumen dengan kolasi implisit yang berbeda.

    Contoh

    -- Concatenating two strings with different explicit collations results in no collation
    SELECT fr || de AS freutsch FROM VALUES('Voulez vous ' COLLATE FR), 'Kartoffelsupp...' COLLATE DE) AS T(fr, de)
    
    -- A union of two strings with different excplicit collations results in no collation
    SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
    

Derivasi kolasi

Saat mengambil kolase untuk hasil STRING, aturan prioritas kolase diterapkan dengan cara berikut:

Jika ekspresi:

  1. cocok dengan definisi di atas

    Pengurutan dan prioritas ditentukan sebagaimana didefinisikan.

  2. adalah fungsi atau operator dengan parameter STRING tunggal, mengembalikan STRING

    Pengurutan dan prioritas mengikuti parameter STRING.

  3. adalah fungsi atau operator dengan dua parameter STRING atau lebih

    1. dengan pengurutan dan prioritas yang sama

      Pengurutan dan prioritasnya adalah sesuai dengan parameter STRING.

    2. dengan kolasi atau prioritas yang berbeda

      Biarkan C1 dan C2 menjadi kolase yang berbeda dan biarkan D menjadi kolase default. Prioritas dan kolase ditentukan oleh tabel berikut:

      Kolase dan Prioritas C1 Eksplisit C1 Implisit D Pengaturan Awal Tidak
      C2 Eksplisit Kesalahan C2 Eksplisit C2 Eksplisit C2 Eksplisit
      C2 Implisit C1 Eksplisit Tidak C2 Implisit Tidak
      D Default C1 Eksplisit C1 Implisit D Pengaturan Awal Tidak
      Tidak C1 Eksplisit Tidak Tidak Tidak

Contoh

> SELECT 'hello' = 'hello   ' COLLATE UNICODE_RTRIM;
  true

> CREATE TABLE words(fr STRING COLLATE FR, de STRING COLLATE DE, en STRING COLLATE EN);
> INSERT INTO words VALUES ('Salut', 'Hallo', 'Hello');

-- A literal string has the default collation
> SELECT collation('Ciao');
  UTF8_BINARY

-- A function producing a STRING has the default collation
> SELECT collation(user());
  UTF8_BINARY

-- Function modifying a STRING passes the collation through
> SELECT collation(upper('Ciao'));
  UTF8_BINARY

-- Implicit collation (French) wins over default collation
> SELECT collation(fr || 'Ciao') FROM words;
  FR

-- Explicit collation (French) wins over implicit collation (German)
> SELECT collation('Salut' COLLATE FR || de) FROM words;
  FR

-- Implicit collation German collides with implicit collation French
-- The result is no collation
> SELECT collation(de || fr) FROM words;
  null

-- Explicit collation (French) wins over default collation (Italian)
> SELECT collation('Salut' COLLATE FR || 'Ciao');
  FR

-- Explicit collation (French) collides with explicit collation (German)
> SELECT collation('Salut' COLLATE FR || 'Hallo' COLLATE DE);
  COLLATION_MISMATCH.EXPLICIT

-- The explicit collation wins over no collation
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
  IT

-- The implict collation (English) does not win over None
> SELECT collation(en || (fr || de)) FROM words;
  null

-- The explicit collation (English) wins over Implicit collation anywhere in the expression
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
  EN