Apa arti himpunan karakter dan susunan sebenarnya?

316

Saya dapat membaca dokumentasi MySQL dan cukup jelas. Tetapi, bagaimana seseorang memutuskan karakter mana yang akan digunakan? Pada data apa collation memiliki efek?

Saya meminta penjelasan dari keduanya dan bagaimana memilihnya.

Sander Versluys
sumber

Jawaban:

512

Dari MySQL docs :

Sebuah set karakter adalah seperangkat simbol dan pengkodean. Sebuah pemeriksaan adalah seperangkat aturan untuk membandingkan karakter dalam set karakter. Mari kita perjelas perbedaannya dengan contoh kumpulan karakter imajiner.

Misalkan kita memiliki alfabet dengan empat huruf: 'A', 'B', 'a', 'b'. Kami memberi setiap huruf nomor: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. Huruf 'A' adalah simbol, angka 0 adalah penyandian untuk 'A' , dan kombinasi keempat huruf dan penyandiannya adalah serangkaian karakter.

Sekarang, anggaplah kita ingin membandingkan dua nilai string, 'A' dan 'B'. Cara paling sederhana untuk melakukan ini adalah dengan melihat pengkodean: 0 untuk 'A' dan 1 untuk 'B'. Karena 0 kurang dari 1, kita katakan 'A' kurang dari 'B'. Sekarang, apa yang baru saja kita lakukan adalah menerapkan collation ke set karakter kita. Susunan adalah seperangkat aturan (hanya satu aturan dalam kasus ini): "bandingkan penyandian." Kami menyebut ini paling sederhana dari semua kemungkinan collation binary collation.

Tetapi bagaimana jika kita ingin mengatakan bahwa huruf kecil dan besar sama? Maka kita akan memiliki setidaknya dua aturan: (1) memperlakukan huruf kecil 'a' dan 'b' setara dengan 'A' dan 'B'; (2) lalu bandingkan pengkodeannya. Kami menyebutnya pengumpulan yang tidak sensitif terhadap huruf besar-kecil Ini sedikit lebih kompleks daripada pemeriksaan biner.

Dalam kehidupan nyata, sebagian besar set karakter memiliki banyak karakter: tidak hanya 'A' dan 'B' tetapi seluruh huruf, kadang-kadang beberapa huruf atau sistem penulisan timur dengan ribuan karakter, bersama dengan banyak simbol khusus dan tanda baca. Juga dalam kehidupan nyata, sebagian besar kumpulan memiliki banyak aturan: tidak hanya case insensitivity tetapi juga accent insivityivity ("aksen" adalah tanda yang melekat pada karakter seperti dalam bahasa Jerman 'o') dan pemetaan multi-karakter (seperti aturan yang ' ö '=' OE 'di salah satu dari dua koleksi Jerman).

Dan Esparza
sumber
206

Sebuah pengkodean karakter adalah cara untuk karakter encode sehingga mereka cocok di memori. Artinya, jika rangkaian karakter adalah ISO-8859-15, simbol euro, €, akan dikodekan sebagai 0xa4, dan dalam UTF-8, itu akan menjadi 0xe282ac.

The pemeriksaan adalah bagaimana untuk membandingkan karakter, di latin9, ada surat-surat seperti e é è ê f, jika diurutkan menurut representasi biner mereka, ia akan pergi e f é ê ètetapi jika pemeriksaan diatur, misalnya, Perancis, Anda akan memiliki mereka dalam urutan yang Anda pikir mereka akan menjadi, yang semuanya e é è êsama, dan kemudian f.

tikar
sumber
5
Penting untuk dicatat bahwa mungkin ada banyak susunan berbeda untuk satu rangkaian karakter tunggal. Yang "benar" tergantung pada semantik teks yang biasanya ditentukan oleh bahasa yang digunakan untuk menulis.
Phil
20

Himpunan karakter adalah himpunan bagian dari semua mesin terbang yang ditulis. Pengkodean karakter menentukan bagaimana karakter tersebut dipetakan ke nilai numerik. Beberapa penyandian karakter, seperti UTF-8 dan UTF-16, dapat menyandikan karakter apa pun di Universal Character Set. Lainnya, seperti US-ASCII atau ISO-8859-1 hanya dapat menyandikan subset kecil, karena mereka masing-masing menggunakan 7 dan 8 bit per karakter. Karena banyak standar menentukan set karakter dan pengkodean karakter, istilah "set karakter" sering diganti secara bebas untuk "pengkodean karakter".

Kolasi terdiri dari aturan yang menentukan bagaimana karakter dapat dibandingkan untuk disortir. Aturan pengumpulan dapat spesifik lokal: urutan dua karakter yang tepat bervariasi dari satu bahasa ke bahasa lainnya.

Memilih kumpulan karakter dan susunan karakter turun ke apakah aplikasi Anda diinternasionalisasi atau tidak. Jika tidak, lokal apa yang Anda targetkan?

Untuk memilih set karakter apa yang ingin Anda dukung, Anda harus mempertimbangkan aplikasi Anda. Jika Anda menyimpan input yang disediakan pengguna, mungkin akan sulit untuk memperkirakan semua lokal tempat perangkat lunak Anda pada akhirnya akan digunakan. Untuk mendukung mereka semua, mungkin yang terbaik adalah mendukung UCS (Unicode) dari awal. Namun, ada biaya untuk ini; banyak karakter Eropa barat sekarang akan membutuhkan dua byte penyimpanan per karakter, bukan satu.

Memilih susunan yang tepat dapat membantu kinerja jika basis data Anda menggunakan susunan untuk membuat indeks, dan kemudian menggunakan indeks itu untuk memberikan hasil yang diurutkan. Namun, karena aturan pengumpulan sering khusus lokal, indeks itu tidak akan bernilai jika Anda perlu mengurutkan hasil sesuai dengan aturan lokal lain.

erickson
sumber
maaf kawan saya hanya pemula dan hanya perlu klarifikasi Anda. Jadi, bisakah saya memahami susunan seperti ini, yang memastikan bahwa setiap karakter (baik latin atau Cina) dikenali dengan benar dan diberi penyandian masing-masing. Apakah itu benar? Saya harap balasan Anda
Mirich
1
@Mirich Tidak, collation adalah informasi tentang cara mengurutkan karakter. Berbagai wilayah dunia lebih suka mengurutkan karakter dengan cara yang berbeda.
erickson
3

Saya menyarankan untuk menggunakan utf8mb4_unicode_ci, yang didasarkan pada standar Unicode untuk pengurutan dan perbandingan, yang mengurutkan secara akurat dalam berbagai bahasa yang sangat luas.

simhumileco
sumber
3
dari OP: "Saya meminta penjelasan dari keduanya dan bagaimana memilihnya"
Dan Esparza
1
@simhumileco, Bung maaf saya hanya pemula dan hanya perlu klarifikasi Anda. Jadi, bisakah saya memahami susunan seperti ini, yang memastikan bahwa setiap karakter (baik latin atau Cina) dikenali dengan benar dan diberi penyandian masing-masing. Apakah itu benar? Saya harap balasan Anda
Mirich
1
@Mirich Itu semua tergantung pada pengkodean apa yang Anda gunakan di tempat lain, jika Anda menggunakan UTF-8pengkodean dalam sistem di luar database, maka semua yang ada di database juga harus ditulis dengan benar jika Anda gunakan utf8mb4di MySQL . Ketika datang ke operasi yang benar menyortir, membandingkan dan mengubah teks untuk karakter tertentu di MySQL , sulit untuk menemukan solusi yang sempurna, tetapi *_unicode_citentu saja lebih baik daripada *_general, tetapi juga memiliki kekurangannya. Silakan baca: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco