Salah satu tanggapan atas pertanyaan yang saya ajukan kemarin menyarankan agar saya memastikan database saya dapat menangani karakter UTF-8 dengan benar. Bagaimana saya bisa melakukan ini dengan MySQL?
102
Salah satu tanggapan atas pertanyaan yang saya ajukan kemarin menyarankan agar saya memastikan database saya dapat menangani karakter UTF-8 dengan benar. Bagaimana saya bisa melakukan ini dengan MySQL?
CHARACTER SETs
; 5.1.24 mengacaukan susunan kata-kata tajam Jerman (ß), yang dikoreksi dengan menambahkan pemeriksaan lain di 5.1.62 (bisa dibilang memperburuk keadaan); 5.5.3 mengisi utf8 dengan charset utf8mb4 yang baru.utf8
. Ini hanya mendukung hingga karakter 3-byte. Kumpulan karakter yang benar yang harus Anda gunakan di MySQL adalahutf8mb4
.Jawaban:
Memperbarui:
Jawaban singkat - Anda seharusnya hampir selalu menggunakan
utf8mb4
charset danutf8mb4_unicode_ci
collation.Untuk mengubah database:
Lihat:
Komentar Aaron untuk jawaban ini Cara membuat MySQL menangani UTF-8 dengan benar
Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci
Panduan konversi: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Jawaban Asli:
MySQL 4.1 dan di atasnya memiliki rangkaian karakter default UTF-8. Anda dapat memverifikasi ini dalam
my.cnf
berkas, ingatlah untuk mengatur kedua klien dan server (default-character-set
dancharacter-set-server
).Jika Anda memiliki data yang ingin diubah menjadi UTF-8, buang database Anda, dan impor kembali sebagai UTF-8, pastikan:
SET NAMES utf8
sebelum Anda membuat kueri / memasukkan ke dalam databaseDEFAULT CHARSET=utf8
saat membuat tabel barumy.cnf
). ingat bahasa apa pun yang Anda gunakan (seperti PHP) harus UTF-8 juga. Beberapa versi PHP akan menggunakan pustaka klien MySQL mereka sendiri, yang mungkin tidak mendukung UTF-8.Jika Anda ingin memigrasi data yang ada, ingatlah untuk membuat cadangan terlebih dahulu! Banyak choping data yang aneh dapat terjadi ketika sesuatu tidak berjalan sesuai rencana!
Beberapa sumber:
sumber
utf8
dalam MySQL hanya mengacu pada sebagian kecil dari Unicode penuh. Anda harus menggunakanutf8mb4
sebagai gantinya untuk memaksa dukungan penuh. Lihat mathiasbynens.be/notes/mysql-utf8mb4 "Untuk waktu yang lama, saya menggunakan charset utf8 MySQL untuk database, tabel, dan kolom, dengan asumsi itu dipetakan ke encoding UTF-8 yang dijelaskan di atas."latin1
danlatin1_swedish_ci
untuk charset dan pemeriksaan default. Lihat halaman "Kumpulan Karakter dan Penyusunanutf8mb4
mengambil penyimpanan ekstra saat sebagian besar teks adalah ASCII. Meskipunchar
string sudah dialokasikan sebelumnya,varchar
string tidak - lihat beberapa baris terakhir di halaman dokumentasi ini . Misalnya,char(10)
akan secara pesimistis mencadangkan 40 byte di bawah utf8mb4, tetapivarchar(10)
akan mengalokasikan byte sesuai dengan pengkodean panjang variabel.varchar(n)
ketext
tipe data jika Anda mencoba mengubahvarchar(n)
bidang menjadi lebih besar dari ukuran byte yang layak (sambil mengeluarkan peringatan). Indeks juga akan memiliki batas atas kasus terburuk yang lebih rendah, dan itu dapat menimbulkan masalah lain.Untuk membuat ini 'permanen', di
my.cnf
:Untuk memeriksanya, buka klien dan tunjukkan beberapa variabel:
Verifikasi bahwa semuanya
utf8
, kecuali..._filesystem
, yang seharusnyabinary
dan..._dir
, yang mengarah ke suatu tempat di instalasi MySQL.sumber
create table my_name(field_name varchar(25) character set utf8);
utf8
bukanlah UTF-8 "penuh".MySQL 4.1 dan yang lebih baru memiliki rangkaian karakter default yang dipanggil
utf8
tetapi sebenarnya hanya merupakan bagian dari UTF-8 (hanya memungkinkan karakter tiga byte dan lebih kecil).Gunakan
utf8mb4
sebagai rangkaian karakter Anda jika Anda ingin UTF-8 "penuh".sumber
utf8
tidak menyertakan karakter seperti emotikon.utf8mb4
tidak. Periksa ini untuk info lebih lanjut tentang cara memperbarui: mathiasbynens.be/notes/mysql-utf8mb4Jawaban singkatnya: Gunakan
utf8mb4
di 4 tempat:SET NAMES utf8mb4
atau sesuatu yang setara saat membuat koneksi klien ke MySQLCHARACTER SET utf8mb4
pada semua tabel / kolom - kecuali kolom yang benar-benar ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
jika Anda menampilkan ke HTML. (Ya, ejaannya berbeda di sini.)Info lebih lanjut ;
UTF8 sepenuhnya
Tautan di atas memberikan "jawaban kanonis terperinci yang diperlukan untuk mengatasi semua masalah". - Ada batasan ruang di forum ini.
Edit
Selain
CHARACTER SET utf8mb4
berisi "semua" karakter dunia,COLLATION utf8mb4_unicode_520_ci
bisa dibilang susunan 'terbaik serba bisa' untuk digunakan. (Ada juga kumpulan bahasa Turki, Spanyol, dll untuk mereka yang menginginkan nuansa dalam bahasa tersebut.)sumber
Charset adalah properti database (default) dan tabel. Anda dapat melihat (perintah MySQL):
Dengan kata lain; cukup mudah untuk memeriksa charset database Anda atau mengubahnya:
sumber
utf8
bukanlah UTF-8 "penuh".Untuk mengubah encoding kumpulan karakter ke UTF-8 untuk database itu sendiri, ketikkan perintah berikut pada prompt mysql>. GUNAKAN
ALTER DATABASE
.. Gantikan DBNAME dengan nama database:Ini adalah duplikat dari pertanyaan ini Bagaimana cara mengonversi seluruh kumpulan karakter dan susunan database MySQL ke UTF-8?
sumber
Saya mengikuti solusi Javier, tetapi saya menambahkan beberapa baris berbeda di my.cnf:
Saya menemukan ide ini di sini: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html di komentar pengguna pertama / satu-satunya di bagian bawah halaman. Dia menyebutkan bahwa skip-character-set-client-handshake memiliki arti penting.
sumber
skip-character-set-client-handshake
adalah kuncinya.Ini tips tentang MySQL dan UTF-8 dapat membantu. Sayangnya, mereka bukan merupakan solusi lengkap, hanya masalah umum.
sumber
Atur Anda
database collation
untukUTF-8
kemudian menerapkantable collation
ke default database.sumber
Jawaban Anda adalah Anda dapat mengkonfigurasi dengan Pengaturan MySql. In My Answer mungkin ada sesuatu yang keluar dari konteksnya tetapi ini juga tahu itu membantu Anda.
cara mengkonfigurasi
Character Set
danCollation
.utf8
, sedangkan aplikasi yang menggunakan database lain mungkin memerlukan sjis.Contoh yang ditampilkan di sini untuk pertanyaan Anda untuk menyetel himpunan karakter utf8, di sini juga menyetel pemeriksaan agar lebih berguna (
utf8_general_ci
pemeriksaan`).Tentukan pengaturan karakter per database
Tentukan pengaturan karakter saat startup server
Tentukan pengaturan karakter pada waktu konfigurasi MySQL
Untuk melihat nilai dari kumpulan karakter dan variabel sistem pemeriksaan yang berlaku untuk koneksi Anda, gunakan pernyataan berikut:
Ini mungkin jawaban yang panjang tetapi ada banyak cara, Anda dapat menggunakan. Semoga jawaban saya bermanfaat untuk Anda. untuk informasi lebih lanjut http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
sumber
SET NAMES UTF8
Ini adalah triknya
sumber
SET NAMES UTF8
(atauUTF8mb4
) benar, Anda tidak menjelaskan apa fungsinya (kumpulan karakter yang digunakan untuk koneksi ini). "Ini melakukan trik" terdengar seperti itu akan menyelesaikan masalah (membuat MySQL menangani UTF-8 dengan benar), tetapi banyak database MySQL diatur ke latin1 secara default, sehingga itu tidak akan menjadikannya solusi yang tepat. Saya akan mengubah charset default dan charset tabel menjadi utf8mb4. Sungguh, jawaban ini agak kurang lengkap, jadi saya tidak suka.KONEKSI DATABASE KE UTF-8
sumber
Setel koneksi database Anda ke UTF8:
sumber
mysql_*
antarmuka yang tidak digunakan lagi . Beralih kemysqli_*
atauPDO
.Mampu menemukan solusi. Jalankan perintah berikut seperti yang ditentukan di http://technoguider.com/2015/05/utf8-set-up-in-mysql/
sumber
CHARACTER SET utf8
.root
tidak akan menjalankan yang paling pentinginit_connect
.