Perbedaan antara utf8 dan latin1

128

apa perbedaan antara utf8 dan latin1?

binbash
sumber
3
Mereka adalah pengkodean yang berbeda (dengan beberapa karakter dipetakan ke urutan byte umum, misalnya karakter ASCII dan banyak huruf beraksen). UTF-8 adalah salah satu pengkodean Unicode dengan semua codepointnya; Latin1 mengkodekan kurang dari 256 karakter.
ShreevatsaR
Ada juga latin9 yang tersedia di Linux lokal dan bisa disebutkan dalam pertanyaan: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Jawaban:

151

UTF-8 disiapkan untuk dominasi dunia, sedangkan Latin1 tidak.

Jika Anda mencoba untuk menyimpan karakter non-Latin seperti Cina, Jepang, Ibrani, Rusia, dll menggunakan pengodean Latin1, maka mereka akan berakhir sebagai mojibake . Anda mungkin menemukan teks pengantar artikel ini berguna (dan bahkan lebih jika Anda tahu sedikit Java).

Perhatikan bahwa dukungan UTF-8 4-byte penuh hanya diperkenalkan di MySQL 5.5. Sebelum versi itu, hanya berjalan hingga 3 byte per karakter, bukan 4 byte per karakter. Jadi, itu hanya mendukung pesawat BMP dan bukan misalnya pesawat Emoji. Jika Anda ingin dukungan UTF-8 4-byte penuh, tingkatkan MySQL ke setidaknya 5,5 atau gunakan RDBMS lain seperti PostgreSQL. Di MySQL 5.5+ itu disebut utf8mb4.

BalusC
sumber
31
Mysql 5.1 mendukung 3 byte UTF-8, namun Mysql 5.5 mendukung 4 byte UTF-8 sebagai utf8mb4.
velcrow
2
@ BalusC Bisakah Anda menguraikan lebih lanjut tentang bagaimana UTF-8 tidak sepenuhnya didukung? Apakah ini berarti bahwa Mysql 5.1 tidak dapat menyimpan semua karakter unicode?
Pacerier
2
@Pacerier: hanya mendukung 3 byte per karakter, sehingga hanya BMP (65535 karakter pertama) yang didukung, sisanya tidak. Untuk semua karakter, lihat en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@ BalusC Adapun orang yang menggunakan 5.1.63 dan tidak memiliki hak istimewa untuk memperbarui versi mysql server web, apa yang mungkin menjadi alternatif?
Pacerier
6
@Pacerier: Anda dapat menyimpan sendiri sebagai VARBINARYganti VARCHARdan mendekode / menyandikan di tingkat bisnis sendiri, tetapi ini adalah peretasan. Pertimbangkan mengajukan pertanyaan baru, mungkin ada cara yang lebih baik.
BalusC
47

Dalam latin1 setiap karakter persis panjang satu byte. Dalam utf8 karakter dapat terdiri dari lebih dari satu byte. Akibatnya utf8 memiliki lebih banyak karakter daripada latin1 (dan karakter yang mereka miliki bersama belum tentu diwakili oleh byte / bytesequence yang sama).

sepp2k
sumber
1
Bagaimana dengan ascii dan bin?
Yousha Aleayoub
8
@YoushaAleayoub ASCII adalah pengodean byte tunggal yang menggunakan karakter 0 hingga 127, sehingga dapat meng-enkode karakter setengah sebanyak karakter latin1. Ini adalah subset ketat dari kedua latin1 dan utf8, yang berarti byte 0 hingga 127 di kedua latin1 dan utf8 menyandikan hal yang sama seperti yang mereka lakukan di ASCII. Bin bukan pengkodean. Ini biasanya merupakan opsi yang dapat Anda berikan saat membaca file, memberi tahu fungsi IO untuk tidak menerapkan pengkodean apa pun, tetapi sebaliknya hanya membaca file byte demi byte.
sepp2k
1
terima kasih, binarymaksudku susun ...? dan mana yang lebih baik untuk bidang bahasa Inggris / numerik: ascii_general_ciatau ascii_bin?
Yousha Aleayoub