Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

Set karakter default untuk MySQL di (mt) Media Temple adalah latin1, dengan susunan default latin1_swedish_ci. Ini adalah jenis pengkodean yang umum untuk karakter Latin. Anda juga dapat mengubah penyandian. utf8 adalah kumpulan karakter umum untuk karakter non-Latin

CATATAN
Harap perhatikan bahwa mengubah susunan basis data Anda tidak tercakup dalam pernyataan dukungan kami. Sumber daya ini diberikan sebagai rasa hormat untuk membantu Anda sejauh kemampuan kami. Untuk informasi lebih lanjut tentang pernyataan dukungan kami, silakan klik di sini

Dukungan Lanjutan dapat membantu
Perlu bantuan lebih lanjut dengan server Anda? . Untuk informasi selengkapnya tentang apa yang dapat dilakukan Dukungan Lanjutan untuk Anda, silakan klik di sini

Mengubah kumpulan karakter dan susunan basis data

Anda dapat mengubah kumpulan karakter dan susunan database dan tabel Anda melalui phpMyAdmin atau dari baris perintah. Anda mungkin ingin mencadangkan database Anda sebelum membuat perubahan. Silakan lihat artikel ini untuk petunjuk. Ekspor dan impor database MySQL

phpMyAdmin

  1. Masuk ke phpMyAdmin
  2. Pilih database Anda dari daftar di sebelah kiri
  3. Klik "Operasi" dari set tab teratas
  4. Di kotak Collation, pilih collation baru Anda dari menu dropdown. utf8_general_ci adalah susunan utf8 yang paling umum
  5. Pilih database Anda dari daftar di sebelah kiri
  6. Klik "Operasi" dari set tab teratas

    Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

  7. Dalam kotak Collation, pilih collation baru Anda dari menu dropdown. utf8_general_ci adalah kumpulan utf8 yang paling umum.

    Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

  8. Klik Mulai
  9. Untuk memperbarui tabel database, pilih dari daftar di sebelah kiri

    Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

  10. Klik "Operasi" dari set tab teratas

    Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

  11. Di "Opsi tabel", di bawah "Pengumpulan", pilih susunan baru Anda dari menu tarik-turun

    Bagaimana cara mengubah set karakter dari latin1 ke utf8 di mysql?

  12. Klik Buka .

Garis komando

  1. Masuk ke MySQL dengan SSH.
    mysql -h internal-db.s00000.gridserver.com -u db00000 -p
  2. Masuk ke MySQL dengan SSH.
    mysql -u admin -p`cat /etc/psa/.psa.shadow`
    _
  3. Masukkan kata sandi basis data Anda saat diminta
  4. Jalankan perintah berikut untuk mengubah kumpulan karakter dan pemeriksaan database Anda.
    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  5. Jalankan perintah berikut untuk mengubah rangkaian karakter dan susunan tabel Anda.
    ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci;

    Untuk salah satu dari contoh ini, harap ganti kumpulan karakter contoh dan susunan dengan nilai yang Anda inginkan

    Saya baru-baru ini menemukan masalah pengkodean karakter utama di salah satu situs web yang saya jalankan. Dengan menyelesaikan masalah ini, saya belajar banyak tentang kerumitan dalam mendukung set karakter internasional di lingkungan LAMP (Linux, Apache, MySQL, PHP). Memperbaiki masalah adalah sebuah tantangan, jadi saya ingin membagikan beberapa pengetahuan yang saya peroleh jika ada orang lain yang menemukan masalah serupa di situs web mereka sendiri

    Posting di bawah ini adalah kisah pengalaman saya yang panjang namun terperinci. Beri tahu saya jika Anda memiliki pengalaman serupa atau menemukan solusi lain untuk jenis masalah ini

    Oh My Münchhausen

    Beberapa hari yang lalu saya diberitahu oleh pengunjung salah satu situs web saya yang mencari istilah dengan karakter non-ASCII di dalamnya (dalam hal ini, “M . nchhausen”) was returning over 500 results, though none of the results actually matched the given search term.

    Saya mulai menyelidiki masalahnya, dan melihat hal yang sama dengannya. Log debug dari halaman pencarian menunjukkan kueri SQL berikut sedang digunakan

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    ...
    (7ms, 532 rows affected)
    _

    Namun, tidak ada hasil yang benar-benar berisi "Münchhausen" untuk kota tersebut

    Saya mengambil kueri yang sama persis dan menjalankannya di klien mysql baris perintah. Anehnya, ini mengembalikan hasil yang berbeda

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)

    Kueri yang sama persis, jalankan dari baris perintah, mengembalikan 0 baris

    Dengan asumsi ini ada hubungannya dengan karakter "ü", saya memulai perjalanan panjang untuk mempelajari kembali apa itu pengkodean karakter, termasuk apa itu UTF-8, latin1 dan Unicode, dan bagaimana mereka digunakan di MySQL

    Apa yang sedang terjadi?

    latin1, AKA ISO 8859-1 adalah set karakter default di MySQL 5. 0. latin1 adalah pengkodean karakter 8-bit-byte tunggal, berbeda dengan UTF-8 yang merupakan pengkodean karakter 8-bit-multi-byte. latin1 dapat mewakili sebagian besar karakter dalam abjad Inggris dan Eropa hanya dengan satu byte (hingga 256 karakter sekaligus). UTF-8, di sisi lain, dapat mewakili setiap karakter dalam kumpulan karakter Unicode (saat ini lebih dari 109.000) dan merupakan cara terbaik untuk berkomunikasi di Internet jika Anda perlu menyimpan atau menampilkan berbagai karakter di dunia

    Anda dapat menentukan set karakter default per server MySQL, database, atau tabel. Default untuk database akan diterapkan ke tabel baru, dan default untuk tabel akan diterapkan ke kolom baru. Anda dapat mengubah default kapan saja (ALTER TABLE, ALTER DATABASE), tetapi default tersebut hanya akan diterapkan ke tabel dan kolom baru

    Anda juga dapat menentukan rangkaian karakter yang Anda gunakan untuk koneksi klien (melalui baris perintah, atau melalui API seperti fungsi mysql PHP)

    Kembali ke Masalah Münchhausen, salah satu hal yang awalnya saya periksa adalah set karakter apa yang digunakan PHP untuk berbicara dengan MySQL

    mysql>  SHOW VARIABLES LIKE 'character_set_client';
    +----------------------+--------+
    | Variable_name        | Value  |
    +----------------------+--------+
    | character_set_client | latin1 |
    +----------------------+--------+
    1 row in set (0.00 sec)
    _

    Mengetahui karakter "ü" direpresentasikan secara berbeda dalam latin1 versus UTF-8 (lihat di bawah), dan mencoba menusuk dalam kegelapan, saya mencoba memaksa aplikasi PHP saya untuk menggunakan UTF-8 saat berbicara dengan database untuk melihat apakah ini

    mysql_set_charset('utf8');

    Voila. Masalahnya sudah diperbaiki. Menelusuri "Münchhausen" di situs menghasilkan 0 hasil ( jumlah kecocokan yang benar)

    Masalah Dengan "ø" Apakah Itu Bukan "ø"

    Atau apakah itu? . Misalnya, laman yang sebelumnya memiliki teks “Graffiti by Dolk and P ø bel” kini menjadi “Graffiti by Dolk and P øbel”. These strange character sequences also looked like an issue I had noticed from time to time in phpMyAdmin with edit fields showing strange characters. As long as I didn’t edit the strange characters, they displayed correctly when PHP spit them back out as HTML, so I hadn’t though much of it until now.

    Melihat urutan karakter aneh ini di mana-mana membuat saya cukup takut untuk menyelidiki masalahnya lebih dalam. Saya menonaktifkan panggilan ke mysql_set_charset() dan situs kembali ke perilaku "benar" sebelumnya untuk berbicara ke server melalui latin1 dan menampilkan "Graffiti by Dolk and Pøbel"

    Kembali ke titik awal

    Ini Semua Sedikit Dari Sudut Pandang MySQL

    Karena istilah “Münchhausen” memberikan hasil yang tidak sesuai, saya mencoba istilah pencarian lain yang berisi karakter non-ASCII. Misalnya, saya menelusuri kota “São Paulo”

    mysql> SELECT city FROM MyTable WHERE city = 'São Paulo';
    +-----------+
    | city      |
    +-----------+
    | Sao Paulo |
    | Sao Paulo |
    | Sao Paulo |
    ...
    | Sao Paulo |
    (2ms, 72 rows affected)
    _

    Seperti yang Anda lihat, istilah pencarian semacam itu berhasil. Ia menemukan kemunculan “S a o Paulo” tetapi tidak “S ão Paulo”. I know there are rows with São in the database, so the query wasn’t working 100% correctly.

    Saya sedikit mengubah kueri menjadi pencocokan wildcard alih-alih karakter non-ASCII

    mysql> SELECT city FROM MyTable WHERE city LIKE 'S%o Paulo';
    +------------+
    | city       |
    +------------+
    | Sao Paulo  |
    | Sao Paulo  |
    | Sao Paulo  |
    ...
    | São Paulo |
    | São Paulo |
    (5ms, 348 rows affected)
    _

    Pencarian ini bekerja sedikit lebih baik — pencarian ini menemukan deretan kota di Sao Paulo dan São Paulo. Namun, itu mengembalikan urutan karakter "ã" untuk São Paulo karena beberapa alasan

    Alasannya adalah, dari sudut pandang MySQL, data yang disimpan di dalam tabelnya hanyalah bit. Jenis kolom dan rangkaian karakter kolom menentukan cara kerja kueri terhadap data dan cara data dikembalikan sebagai hasil kueri SELECT

    Mungkin sekarang sudah cukup jelas bahwa kolom kota saya bukanlah rangkaian karakter yang tepat. Itu diatur ke latin1 saat database dibuat

    Hal yang menarik adalah aplikasi web saya, yang menggunakan PHP, sepertinya tidak terlalu mempermasalahkan hal ini. Menyimpan dan mengambil dari kolom kota aman untuk biner — yaitu, MySQL tidak mengubah data yang dikirimkan PHP melalui ekstensi mysql. Nantinya, MySQL akan mengembalikan data (bit) yang sama persis ke PHP. Masalah hanya terjadi saat Anda meminta MySQL untuk menganalisis sendiri kolom atau mempresentasikannya

    Jadi selama ini, aplikasi web PHP saya telah menyimpan data yang disandikan UTF-8 di kolom kota, dan kemudian mengambil data (biner) yang sama persis dengan yang ditampilkan di situs web. MySQL tidak mengubah data untuk UPDATE dan SELECT sederhana, sehingga semua karakter UTF-8 masih ditampilkan dengan benar di situs web

    Untuk memperbaiki kueri SQL di atas, kita sebenarnya dapat memaksa MySQL untuk menginterpretasikan ulang data sebagai pengkodean karakter tertentu dengan terlebih dahulu mengonversi data ke tipe BINARY lalu mentransmisikannya sebagai UTF-8. Jika Anda mencoba MENGKONVERSI MENGGUNAKAN utf8, MySQL akan membantu mengonversi karakter garbage-latin1 Anda menjadi karakter garbage-utf8. Proses dua langkah konversi sementara ke BINARY memastikan bahwa MySQL tidak mencoba menafsirkan ulang kolom dalam pengkodean karakter lain. Jika kita tidak mengonversi ke BINARY, MySQL pada akhirnya akan menampilkan karakter ã yang sama bahkan dalam output UTF-8

    Jadi kita CAST ke BINARY untuk sementara dulu, lalu CONVERT ini MENGGUNAKAN UTF-8

    mysql> SELECT city, CONVERT(CAST(city as BINARY) USING utf8) FROM MyTable WHERE city = 'São Paulo';
    +------------+-------------+
    | city       | CONVERT..  |
    +------------+-------------+
    | Sao Paulo  | Sao Paulo   |
    | Sao Paulo  | Sao Paulo   |
    ...
    | São Paulo | São Paulo   | ...

    Kesuksesan. Kami telah menipu MySQL untuk memberi kami interpretasi UTF-8 dari kolom latin1 kami dengan cepat, dan kami melihat bahwa São Paulo terwakili dengan benar

    Mengapa mereka berbeda?

    Beberapa latar belakang. Mengapa "ã" direpresentasikan berbeda dalam latin1 vs UTF-8?

    Karakter ã dalam latin1 adalah kode karakter 0xE3 dalam hex, atau 227 dalam desimal. Ini 8 bit akan direpresentasikan sebagai

    1110 0011

    latin1 adalah penyandian byte tunggal, jadi masing-masing dari 256 karakter hanya satu byte

    Pengkodean UTF-8 dirancang agar kompatibel dengan dokumen ASCII, untuk 128 karakter pertama. Untuk karakter di atas #128, urutan multi-byte menjelaskan karakter tersebut

    Karakter kita ã, #227, melewatkan kompatibilitas single-byte dengan 128 karakter pertama ASCII dan harus

    Berikut representasi karakter ã di kedua pengkodean

       0000 0000 1110 0011 ASCII character (latin1) (0x00E3)
    -> 1100 0011 1010 0011 UTF-8 encoding (0xC3A3)

    Encoding UTF-8 mengubah ã kita, direpresentasikan sebagai 0xE3 dalam latin1, menjadi dua byte, 0xC3A3 dalam UTF-8.

    Perhatikan bahwa dua byte ini 0xC3 dan 0xA3 di .

    0xC3 = Ã dalam latin1

    0xA3 = £ dalam latin1

    Jadi pengkodean UTF-8 dari ã menjelaskan dengan tepat mengapa kita melihatnya ditafsirkan ulang sebagai ã dalam bahasa latin1

    Apa yang Harus Dilakukan, Apa yang Harus Dilakukan

    Pada titik ini, jelas bahwa saya mengacau di suatu tempat. Lebih tepatnya, kolom kota harus UTF-8, karena PHP selalu memasukkan data UTF-8 ke dalamnya. Alasan utama saya tidak melihat masalah sampai saat ini adalah bahwa meskipun kolom MySQL adalah latin1, aplikasi PHP saya mendapatkan data ini dan memanggil htmlentities untuk mengonversi karakter UTF-8 menjadi kode HTML sebelum menampilkannya. Pengunjung situs web saya melihat karakter UTF-8 yang sesuai di situs web meskipun kolom MySQL adalah latin1

    Seperti yang telah kita lihat, masalah mulai terjadi saat Anda melakukan kueri terhadap data. SELECT di atas menggunakan karakter UTF-8 "ü" untuk "Münchhausen", dan saat membandingkannya dengan data "latin1" di kolom, MySQL menjadi bingung (dapatkah Anda menyalahkannya?). Masalah tambahan dapat muncul dengan aplikasi yang menampilkan penyandian kolom "alami" (seperti phpMyAdmin). mereka menunjukkan urutan karakter aneh seperti yang terlihat di atas, bukan karakter yang didekode UTF-8

    Inti masalahnya adalah database MySQL dibuat beberapa tahun yang lalu dan susunan default saat itu adalah latin1_swedish_ci. Selama bertahun-tahun, saya mengubah default menjadi utf8_general_ci untuk kolom baru, tetapi tabel dan kolom yang ada tidak diubah. Saya memiliki lebih dari 100 tabel dalam latin1 yang seharusnya UTF-8 dan perlu dikonversi

    Jadi saya mulai menyelidiki apa yang diperlukan untuk mengonversi tabel latin1 saya yang ada ke UTF-8 sebagaimana mestinya. Setelah saya menyetel pengkodean karakter dengan benar, kueri terhadap database akan berfungsi lebih baik dan saya tidak perlu khawatir tentang jenis masalah ini di masa mendatang

    Ada beberapa cara untuk melakukan konversi

    Beberapa orang telah berhasil mengekspor data mereka ke latin1, mengonversi file yang dihasilkan ke UTF-8 melalui iconv atau utilitas serupa, memperbarui definisi kolom mereka, lalu mengimpor kembali data tersebut. Sayangnya, hal ini memerlukan penurunan basis data karena tabel dijatuhkan dan dibuat ulang, dan ini bisa memakan waktu sedikit

    Saya mengharapkan proses yang dapat saya terapkan ke database online, dan untungnya saya menemukan beberapa catatan bagus dari Paul Kortman dan fabio, jadi saya menggabungkan beberapa ide mereka dan mengotomatiskan proses untuk situs saya. Saya menemukan beberapa masalah di sepanjang jalan, jadi saya ingin membagikan langkah-langkah yang berhasil untuk saya

    Proses

    Dengan menggunakan metode yang dijelaskan di blog fabio, kita dapat mengonversi kolom latin1 yang memiliki karakter UTF-8 menjadi kolom UTF-8 yang sesuai dengan melakukan langkah-langkah berikut

    1. Ubah kolom menjadi tipe BINARY terkait (ALTER TABLE MyTable MODIFY MyColumn BINARY)
    2. Ubah kolom kembali ke tipe aslinya dan atur set karakter ke UTF-8 secara bersamaan (ALTER TABLE MyTable MODIFY MyColumn TEXT CHARACTER SET utf8 COLLATE utf8_general_ci)

    Ini adalah pendekatan yang mirip dengan trik SELECT CONVERT(CAST(city as BINARY) USING utf8) kami di atas, di mana kami pada dasarnya menyembunyikan data aktual kolom dari MySQL dengan menutupinya sebagai BINARY untuk sementara

    Jika Anda hanya memaksa kolom ke UTF-8 tanpa konversi BINARY, MySQL melakukan konversi pengubahan data dari karakter "latin1" Anda menjadi "UTF-8" dan Anda berakhir dengan data yang dikonversi secara tidak benar. Mengonversi kolom ke BINARY terlebih dahulu memaksa MySQL untuk tidak menyadari bahwa datanya ada di UTF-8

    Kita perlu mengonversi setiap jenis kolom sumber (CHAR vs. VARCHAR vs. TEXT, dll) ke dalam tipe BINARY terkait (BINARY vs. VARBINER vs. GUMPAL)

    Selain itu, MODIFY ke BINARY dan kembali perlu mempertahankan keseluruhan definisi kolom. Untuk jenis TEXT, konversi TEXT ke BLOB sederhana sudah cukup. Tetapi untuk definisi kolom yang memiliki panjang tertentu, default atau NOT NULL.

    MyColumn VARCHAR(255) DEFAULT '' NOT NULL

    Kita perlu MENGUBAH menjaga atribut yang sama, atau definisi kolom akan berubah secara fundamental (lihat catatan di ALTER TABLE). Dalam hal ini, kami akan menentukan

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    0

    Jika kami tidak menentukan panjang, default dan NOT NULL, kolomnya tidak sama dengan sebelum konversi

    Naskah

    Skrip di bagian bawah posting ini mengotomatiskan konversi data UTF-8 apa pun yang disimpan dalam kolom latin1 ke kolom UTF-8 yang tepat

    Saya memodifikasi skrip fabio untuk mengotomatiskan konversi untuk semua kolom latin1 untuk database apa pun yang Anda konfigurasikan untuk melihatnya. Itu mengubah kolom terlebih dahulu menjadi sepupu BINARY yang tepat, lalu ke utf8_general_ci, sambil mempertahankan panjang kolom, default, dan atribut NULL

    Peringatan. Skrip ini menganggap Anda tahu Anda memiliki karakter UTF-8 di kolom latin1. Harap uji perubahan Anda sebelum menjalankan skrip secara membabi buta.

    Berikut adalah langkah-langkah yang harus Anda ambil untuk menggunakan skrip

    Langkah 1. Tentukan Kolom Yang Perlu Diperbarui

    Jika Anda seperti saya, Anda mungkin memiliki campuran kolom latin1 dan UTF-8 di database Anda. Tidak semua kolom di database saya perlu diperbarui dari latin1 ke UTF-8. Misalnya, beberapa tabel milik aplikasi PHP lain di server, dan saya hanya ingin memperbarui kolom yang saya tahu harus diperbaiki. Skrip saat ini akan mengonversi semua tabel untuk database yang ditentukan – Anda dapat memodifikasi skrip untuk mengubah tabel atau kolom tertentu jika perlu

    Selain itu, skrip hanya akan memperbarui kolom berbasis teks yang sesuai. Kumpulan karakter hanya sesuai untuk beberapa jenis data. CHAR, VARCHAR, TINYTEXT, TEKS, MEDIUMTEXT dan LONGTEXT. Jenis kolom lain seperti numerik (INT) dan BLOB tidak memiliki "rangkaian karakter"

    Anda dapat melihat set karakter apa yang digunakan kolom Anda melalui alat Administrasi MySQL, phpMyAdmin, atau bahkan menggunakan kueri SQL terhadap skema_informasi

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    1

    Langkah 2. Uji Konversi Kolom

    Anda harus menguji semua perubahan sebelum memasukkannya ke database Anda

    Hal pertama yang harus diuji adalah bahwa SQL yang dihasilkan dari skrip konversi sudah benar. Untuk melakukan ini, Anda dapat membuang struktur database Anda

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    2

    Dan impor struktur ini ke database MySQL pengujian lainnya

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _3

    Selanjutnya, jalankan skrip konversi (di bawah) terhadap basis data sementara Anda

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _4

    Script akan memuntahkan “. ERROR” pernyataan jika perubahan gagal. Jika Anda mengalami ERROR, modifikasi mungkin diperlukan berdasarkan kebutuhan Anda. Beberapa masalah umum tercantum di Langkah 3

    Setelah Anda menjalankan skrip terhadap database sementara Anda, periksa tabel information_schema untuk memastikan konversi berhasil

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    5

    Selama Anda melihat semua kolom Anda di UTF8, Anda harus siap

    Langkah 3. Masalah yang Mungkin Anda Hadapi

    Jika hanya sesederhana itu. Saya menemukan beberapa masalah di sepanjang jalan

    Langkah 3. 1. indeks FULLTEXT

    Saya memiliki beberapa kolom dengan indeks FULLTEXT. Perintah ALTER TABLE to BINARY untuk kolom yang memiliki indeks FULLTEXT akan menyebabkan kesalahan

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _6

    Solusi sederhana yang saya temukan adalah memodifikasi skrip untuk menghapus indeks sebelum konversi, dan mengembalikannya setelah itu

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _7

    Ada TODO yang tercantum dalam skrip tempat Anda harus melakukan perubahan ini

    Langkah 3. 2. Data UTF-8 tidak valid

    Karena basis data saya berusia lebih dari 5 tahun, basis data itu telah memperoleh beberapa kerusakan dari waktu ke waktu. Saya tidak yakin persis bagaimana ini terjadi, tetapi beberapa kolom memiliki data yang bukan pengkodean UTF-8 yang valid, meskipun itu adalah karakter latin1 yang valid. Saya yakin ini terjadi sebelum saya mengeraskan aplikasi PHP saya untuk menolak data non-UTF-8, tetapi saya tidak yakin. Saya menemukan ini ketika pertama kali mencoba melakukan konversi

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _8

    Apa yang sedang terjadi?

    Di beberapa titik, urutan karakter yang berisi karakter UTF-8 yang tidak valid dimasukkan ke dalam database, dan sekarang MySQL menolak untuk memanggil kolom VARCHAR (sebagai UTF-8) karena memiliki urutan karakter yang tidak valid ini

    Saya memeriksa representasi HTML dari kolom ini di situs web PHP saya, dan benar saja, sampah juga muncul di sana

    … �?

    � adalah karakter sebenarnya yang ditampilkan browser Anda. Bukan pengalaman pengguna terbaik, dan jelas bukan karakter yang benar

    Saya memperbaiki satu baris itu (melalui phpMyAdmin), dan menjalankan perintah ALTER TABLE MODIFY lagi — masalah yang sama, baris lain. Sepertinya ada lebih dari satu baris korup

    Saya menemukan cara yang baik untuk membasmi semua kolom yang akan menyebabkan konversi gagal. Jika Anda PILIH CONVERT (MyColumn USING utf8) sebagai kolom baru, setiap kolom NULL yang dikembalikan adalah kolom yang akan menyebabkan ALTER TABLE gagal

    Misalnya

    mysql> SELECT * FROM MyTable WHERE city = 'Münchhausen';
    (0ms, 0 rows affected)
    _9

    Ini menunjukkan kepada saya baris spesifik yang berisi UTF-8 yang tidak valid, jadi saya mengeditnya sendiri untuk memperbaikinya. Anda dapat secara manual NULL menggunakan UPDATE jika Anda tidak takut kehilangan data. Saya harus melakukan ini untuk 6 kolom dari 115 kolom yang dikonversi. Total hanya 30 baris yang rusak

    Langkah 4. Laba?

    Pada titik ini, mungkin Anda perlu nyali untuk menekan tombol go pada database langsung Anda

    Secara pribadi, saya menjalankan skrip terhadap database pengujian (kosong), lalu salinan data langsung saya, lalu server pementasan sebelum akhirnya menjalankannya pada data langsung

    Peringatan. Harap berhati-hati saat menggunakan skrip dan uji, uji, uji sebelum melakukannya.

    Naskah

    Script dapat ditemukan di Github. https. //github. com/nicjansma/mysql-convert-latin1-to-utf8. Jika Anda menemukan bug atau ingin berkontribusi perubahan, silakan menuju ke sana

    Bagaimana mengubah set karakter ke UTF

    Untuk mengubah pengkodean set karakter ke UTF-8 untuk database itu sendiri, ketikkan perintah berikut di prompt mysql>. Ganti dbname dengan nama database. Salin ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci ; .

    Bagaimana cara mengubah set karakter di MySQL?

    Untuk mengonversi set karakter dan susunan string, gunakan CONVERT() untuk mengubah set karakter , dan terapkan operator COLLATE . mysql> SET @s1 = 'string saya'; .

    Apa perbedaan antara latin1 dan UTF

    apa perbedaan antara utf8 dan latin1? . g. karakter ASCII dan banyak huruf beraksen). UTF-8 adalah salah satu penyandian Unicode dengan semua titik kodenya; . .

    Apa itu charset latin1 di MySQL?

    Set karakter MySQL latin1 adalah set karakter satu byte untuk Eropa Barat, dan ini adalah set karakter default MySQL hingga dan termasuk 5. 7 . Terlepas dari namanya, rangkaian karakter sebenarnya sesuai dengan Windows-1252, yang merupakan superset dari ISO-8859-1, juga dikenal sebagai Latin-1.