Setelah memperhatikan aplikasi yang cenderung membuang email acak karena kesalahan nilai string, saya pergi dan beralih banyak kolom teks untuk menggunakan utf8
charset kolom dan susunan kolom default ( utf8_general_ci
) sehingga akan menerimanya. Ini memperbaiki sebagian besar kesalahan, dan membuat aplikasi berhenti mendapatkan kesalahan sql ketika itu memukul email non-latin juga.
Meskipun demikian, beberapa email masih menyebabkan program mengalami kesalahan nilai string yang salah: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)
Kolom isi adalah MEDIUMTEXT
datatybe yang menggunakan utf8
charset kolom dan susun utf8_general_ci
kolom. Tidak ada bendera yang dapat saya toggle di kolom ini.
Ingatlah bahwa saya tidak ingin menyentuh atau bahkan melihat kode sumber aplikasi kecuali benar-benar diperlukan:
- Apa yang menyebabkan kesalahan itu? (ya, saya tahu emailnya penuh dengan sampah acak, tapi saya pikir utf8 akan sangat permisif)
- Bagaimana saya bisa memperbaikinya?
- Apa kemungkinan dampak dari perbaikan seperti itu?
Satu hal yang saya pertimbangkan adalah beralih ke utf8 varchar ([sejumlah besar]) dengan bendera biner dihidupkan, tapi saya agak tidak terbiasa dengan MySQL, dan tidak tahu apakah perbaikan seperti itu masuk akal.
Jawaban:
"\xE4\xC5\xCC\xC9\xD3\xD8"
tidak valid UTF-8. Diuji menggunakan Python:Jika Anda mencari cara untuk menghindari kesalahan decoding dalam database, pengkodean cp1252 (alias "Windows-1252" alias "Windows Western European") adalah pengkodean yang paling permisif - setiap nilai byte adalah titik kode yang valid.
Tentu saja itu tidak akan memahami UTF-8 asli lagi, atau pengkodean non-cp1252 lainnya, tapi sepertinya Anda tidak terlalu khawatir tentang itu?
sumber
café
, itu akan salah menafsirkan sebagaicafé
. Itu tidak akan crash, tetapi itu akan salah paham karakter bit-tinggi.Saya tidak akan menyarankan jawaban Richies, karena Anda mengacaukan data di dalam database. Anda tidak akan memperbaiki masalah Anda tetapi mencoba untuk "menyembunyikan" itu dan tidak dapat melakukan operasi database penting dengan data yang retak.
Jika Anda menjumpai kesalahan ini, data yang Anda kirimkan tidak disandikan UTF-8, atau koneksi Anda tidak UTF-8. Pertama, verifikasi, bahwa sumber data (file, ...) benar - benar adalah UTF-8.
Kemudian, periksa koneksi database Anda, Anda harus melakukan ini setelah menghubungkan:
Selanjutnya, verifikasi bahwa tabel tempat data disimpan memiliki set karakter utf8:
Terakhir, periksa pengaturan basis data Anda:
Jika sumber, transportasi, dan tujuan UTF-8, masalah Anda hilang;)
sumber
SET CHARACTER SET utf8
(bukan CHARACTER_SET)Tipe MySQL utf-8 sebenarnya tidak tepat utf-8 - ia hanya menggunakan hingga tiga byte per karakter dan hanya mendukung Basic Multilingual Plane (yaitu tanpa Emoji, no astral plane, dll.).
Jika Anda perlu menyimpan nilai dari bidang Unicode yang lebih tinggi, Anda memerlukan pengkodean utf8mb4 .
sumber
Tabel dan bidang memiliki penyandian yang salah; namun, Anda dapat mengubahnya menjadi UTF-8.
sumber
Saya memecahkan masalah ini hari ini dengan mengubah kolom ke tipe 'LONGBLOB' yang menyimpan byte mentah alih-alih karakter UTF-8.
Satu-satunya kelemahan dari melakukan ini adalah Anda harus mengurus pengodean sendiri. Jika satu klien aplikasi Anda menggunakan pengkodean UTF-8 dan yang lain menggunakan CP1252, Anda mungkin mengirim email Anda dengan karakter yang salah. Untuk menghindari hal ini, selalu gunakan pengkodean yang sama (misalnya UTF-8) di semua aplikasi Anda .
Rujuk ke halaman ini http://dev.mysql.com/doc/refman/5.0/en/blob.html untuk perincian lebih lanjut tentang perbedaan antara TEXT / LONGTEXT dan BLOB / LONGBLOB. Ada juga banyak argumen lain di web yang membahas keduanya.
sumber
Pertama periksa apakah default_character_set_name Anda adalah utf8.
Jika hasilnya tidak utf8 Anda harus mengonversi basis data Anda. Pada awalnya Anda harus menyimpan dump.
Untuk mengubah pengkodean set karakter ke UTF-8 untuk semua tabel dalam database yang ditentukan, ketikkan perintah berikut di baris perintah. Ganti DBNAME dengan nama basis data:
Untuk mengubah pengkodean set karakter ke UTF-8 untuk database itu sendiri, ketik perintah berikut ini di prompt mysql >. Ganti DBNAME dengan nama basis data:
Anda sekarang dapat mencoba lagi untuk menulis karakter utf8 ke dalam basis data Anda. Solusi ini membantu saya ketika saya mencoba mengunggah 200000 baris file csv ke dalam database saya.
sumber
Secara umum, ini terjadi ketika Anda memasukkan string ke kolom dengan pengkodean / pengumpulan yang tidak kompatibel.
Saya mendapatkan kesalahan ini ketika saya memiliki TRIGGER, yang mewarisi susunan server untuk beberapa alasan. Dan default mysql adalah (setidaknya pada Ubuntu) latin-1 dengan susunan Swedia. Meskipun saya memiliki database dan semua tabel diatur ke UTF-8, saya belum mengaturnya
my.cnf
:/etc/mysql/my.cnf:
Dan ini harus mencantumkan semua pemicu dengan utf8- *:
Dan beberapa variabel yang terdaftar oleh ini juga harus memiliki utf-8- * (tidak ada latin-1 atau pengkodean lainnya):
sumber
Meskipun susunan Anda diatur ke utf8_general_ci, saya menduga bahwa pengkodean karakter dari basis data, tabel atau bahkan mungkin berbeda.
sumber
Saya mendapat kesalahan serupa (
Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1
). Saya telah mencoba untuk mengubah set karakter kolom keutf8mb4
dan setelah itu kesalahannya berubah menjadi'Data too long for column 'content' at row 1'
.Ternyata mysql menunjukkan kesalahan pada saya. Saya membalikkan set karakter kolom ke
utf8
dan mengubah tipe kolom menjadiMEDIUMTEXT
. Setelah itu kesalahannya hilang.Saya harap ini membantu seseorang.
By the way MariaDB dalam kasus yang sama (saya telah menguji INSERT yang sama di sana) hanya memotong teks tanpa kesalahan.
sumber
Kesalahan itu berarti bahwa Anda memiliki string dengan penyandian yang salah (mis. Anda mencoba memasukkan string yang disandikan ISO-8859-1 ke dalam kolom yang disandikan UTF-8), atau kolom tidak mendukung data yang Anda coba masukkan.
Dalam prakteknya, masalah yang terakhir disebabkan oleh implementasi MySQL UTF-8 yang hanya mendukung karakter UNICODE yang membutuhkan 1-3 byte ketika direpresentasikan dalam UTF-8. Lihat "Nilai string salah" ketika mencoba memasukkan UTF-8 ke MySQL melalui JDBC? untuk detail.
sumber
Solusi bagi saya ketika berlari ke nilai string salah ini: '\ xF8' untuk kesalahan kolom menggunakan scriptcase adalah untuk memastikan bahwa basis data saya diatur untuk utf8 general ci dan demikian juga pengumpulan lapangan saya. Kemudian ketika saya melakukan impor data file csv saya memuat csv ke UE Studio kemudian menyimpannya diformat sebagai utf8 dan Voila! Ini berfungsi seperti pesona, 29.000 catatan di sana tidak ada kesalahan. Sebelumnya saya mencoba untuk mengimpor csv yang dibuat excel.
sumber
Saya telah mencoba semua solusi di atas (yang semuanya membawa poin valid), tetapi tidak ada yang berhasil untuk saya.
Sampai saya menemukan bahwa pemetaan bidang tabel MySQL saya di C # menggunakan tipe yang salah: MySqlDbType.Blob . Saya mengubahnya ke MySqlDbType.Text dan sekarang saya bisa menulis semua simbol UTF8 yang saya inginkan!
ps Bidang tabel MySQL saya adalah tipe "LongText". Namun, ketika saya membuat otomatis pemetaan bidang menggunakan perangkat lunak MyGeneration, secara otomatis mengatur jenis bidang sebagai MySqlDbType.Blob di C #.
Menariknya, saya telah menggunakan tipe MySqlDbType.Blob dengan karakter UTF8 selama berbulan-bulan tanpa kesulitan, sampai suatu hari saya mencoba menulis string dengan beberapa karakter tertentu di dalamnya.
Semoga ini bisa membantu seseorang yang berjuang untuk menemukan alasan kesalahan tersebut.
sumber
Saya menambahkan biner sebelum nama kolom dan menyelesaikan kesalahan charset.
masukkan ke dalam nilai tableA (binary stringcolname1);
sumber
Hai saya juga mendapatkan kesalahan ini ketika saya menggunakan database online saya dari server godaddy saya pikir itu memiliki versi mysql 5.1 atau lebih. tetapi ketika saya lakukan dari server localhost saya (versi 5.7) itu baik-baik saja setelah itu saya membuat tabel dari server lokal dan disalin ke server online menggunakan mysql yog saya pikir masalahnya adalah dengan set karakter
Tangkapan layar Di Sini
sumber
Untuk memperbaiki kesalahan ini, saya memutakhirkan database MySQL saya ke utf8mb4 yang mendukung set karakter Unicode lengkap dengan mengikuti tutorial terperinci ini . Saya sarankan untuk melewatinya dengan hati-hati, karena ada beberapa gotcha (misalnya kunci indeks bisa menjadi terlalu besar karena pengkodean baru setelah itu Anda harus memodifikasi jenis bidang).
sumber
Ada jawaban bagus di sini. Saya hanya menambahkan milik saya karena saya mengalami kesalahan yang sama tetapi ternyata menjadi masalah yang sama sekali berbeda. (Mungkin di permukaan sama, tetapi akar penyebabnya berbeda.)
Bagi saya kesalahan terjadi pada bidang berikut:
Ini akhirnya disimpan dalam database sebagai serialisasi biner
URI
kelas. Ini tidak memunculkan flag dengan pengujian unit (menggunakan H2) atau pengujian CI / integrasi (menggunakan MariaDB4j ), itu meledak dalam pengaturan seperti produksi kami. (Meskipun, begitu masalah dipahami, cukup mudah untuk melihat nilai yang salah dalam contoh MariaDB4j; itu hanya tidak meledakkan tes.) Solusinya adalah membangun mapper tipe khusus:Digunakan sebagai berikut:
Sejauh Hibernate terlibat, tampaknya ia memiliki banyak tipe pemetaan yang disediakan , termasuk untuk
java.net.URL
, tetapi tidak untukjava.net.URI
(yang kami butuhkan di sini).sumber
Dalam kasus saya masalah itu diselesaikan dengan mengubah pengkodean kolom Mysql ke 'biner' (tipe data akan diubah secara otomatis menjadi VARBINARY). Mungkin saya tidak akan bisa memfilter atau mencari dengan kolom itu, tapi saya tidak perlu melakukannya.
sumber
Jika Anda memproses nilai dengan beberapa fungsi string sebelum menyimpan, pastikan fungsi tersebut dapat menangani karakter multibyte dengan benar. Fungsi string yang tidak dapat melakukan itu dan, katakanlah, mencoba untuk memotong mungkin membagi salah satu karakter multibyte tunggal di tengah, dan yang dapat menyebabkan situasi kesalahan string tersebut.
Dalam PHP misalnya, Anda harus beralih dari
substr
kemb_substr
.sumber
Dalam kasus saya, pertama saya bertemu '???' di situs web saya, lalu saya periksa set karakter Mysql yang bahasa latin sekarang, jadi saya mengubahnya menjadi utf-8, lalu saya restart proyek saya, kemudian saya mendapat kesalahan yang sama dengan Anda, kemudian saya menemukan bahwa saya lupa untuk mengubah charset database dan berubah menjadi utf-8, boom, itu berhasil.
sumber
Saya mencoba hampir setiap langkah yang disebutkan di sini. Tidak ada yang berhasil. Mariadb yang diunduh. Itu berhasil. Saya tahu ini bukan solusi namun ini mungkin membantu seseorang untuk mengidentifikasi masalah dengan cepat atau memberikan solusi sementara.
sumber
Dalam kasus saya,
Incorrect string value: '\xCC\x88'...
masalahnya adalah o-umlaut dalam kondisi terurai. Pertanyaan-dan-jawaban ini membantu saya memahami perbedaan antarao¨
danö
. Di PHP, perbaikannya bagi saya adalah dengan menggunakan perpustakaan Normalizer PHP . MisalnyaNormalizer::normalize('o¨', Normalizer::FORM_C)
,.sumber
1 - Anda harus menyatakan dalam koneksi Anda propertie dari enconding UTF8. http://php.net/manual/en/mysqli.set-charset.php .
2 - Jika Anda menggunakan baris commando mysql untuk menjalankan skrip, Anda harus menggunakan flag, seperti:
Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql
sumber