Pemrogram kami sebelumnya mengatur susunan yang salah dalam sebuah tabel (Mysql). Dia mengaturnya dengan susunan Latin, padahal seharusnya UTF8, dan sekarang saya punya masalah. Setiap rekaman dengan karakter Cina dan Jepang beralih ke ??? karakter.
Apakah mungkin untuk mengubah susunan dan mendapatkan kembali detail karakter?
Jawaban:
ubah susunan basis data:
ubah susunan tabel:
ubah susunan kolom:
Apa arti bagian-bagian
utf8mb4_0900_ai_ci
itu?Info lebih lanjut:
sumber
CHARACTER SET utf8
akan defaultutf8_general_ci
tetapi Anda juga dapat menentukan susunan seperti iniALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
jika diperlukancreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; jika Anda ingin mengubahnya keutf8_unicode_ci
, Anda dapat menentukan pemeriksaan:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Ini bekerja pada tabel persis sama dengan bekerja pada database, seperti yang ditunjukkan oleh @KCD.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Anda harus melakukan hal yang sama untuk dua pernyataan lainnya.Inilah cara mengubah semua database / tabel / kolom. Jalankan query ini dan mereka akan menampilkan semua pertanyaan selanjutnya yang diperlukan untuk mengonversi seluruh skema Anda menjadi utf8. Semoga ini membantu!
- Ubah DATABASE Default Collation
- Ubah TABLE Collation / Char Set
- Ubah COLUMN Collation / Char Set
sumber
Hati-hati dengan Mysql,
utf8
set karakter hanya sebagian dari set karakter UTF8 yang asli. Untuk menghemat satu byte penyimpanan, tim Mysql memutuskan untuk menyimpan hanya tiga byte dari karakter UTF8 daripada empat-byte penuh. Itu berarti bahwa beberapa bahasa asia timur dan emoji tidak sepenuhnya didukung. Untuk memastikan Anda dapat menyimpan semua karakter UTF8, gunakanutf8mb4
tipe data, danutf8mb4_bin
atauutf8mb4_general_ci
dalam Mysql.sumber
utf8mb4_unicode_ci
bukanutf8mb4_general_ci
. Lihat stackoverflow.com/questions/766809/… dan drupal.stackexchange.com/questions/166405/…Menambah apa yang diposkan David Whittaker, saya telah membuat kueri yang menghasilkan tabel lengkap dan kolom mengubah pernyataan yang akan mengonversi setiap tabel. Mungkin ide yang bagus untuk dijalankan
SET SESSION group_concat_max_len = 100000;
pertama-tama untuk memastikan bahwa concat grup Anda tidak melewati batas yang sangat kecil seperti yang terlihat di sini .
Perbedaan di sini antara jawaban sebelumnya adalah menggunakan utf8 bukan ut8mb4 dan menggunakan t1.data_type dengan t1.CHARACTER_MAXIMUM_LENGTH tidak berfungsi untuk enum. Selain itu, kueri saya mengecualikan tampilan karena harus diubah secara terpisah.
Saya hanya menggunakan skrip Perl untuk mengembalikan semua perubahan ini sebagai array dan mengulanginya, memperbaiki kolom yang terlalu panjang (umumnya varchar (256) ketika data umumnya hanya memiliki 20 karakter di dalamnya sehingga mudah diperbaiki ).
Saya menemukan beberapa data rusak ketika mengubah dari latin1 -> utf8mb4. Tampaknya ut1 disandikan karakter latin1 dalam kolom akan melakukan kesalahan dalam konversi. Saya hanya memegang data dari kolom yang saya tahu akan menjadi masalah dalam memori dari sebelum dan sesudah perubahan dan membandingkannya dan menghasilkan laporan pembaruan untuk memperbaiki data.
sumber
disini jelaskan prosesnya dengan baik. Namun, beberapa karakter yang tidak cocok dengan ruang latin hilang selamanya. UTF-8 adalah SUPERSET dari latin1. Bukan sebaliknya. Sebagian besar akan muat dalam ruang byte tunggal, tetapi yang tidak terdefinisi tidak akan (periksa daftar latin1 - tidak semua 256 karakter didefinisikan, tergantung pada definisi mysql's latin1)
sumber