Beginilah koneksi saya diatur:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
Dan saya mendapatkan kesalahan berikut ketika mencoba menambahkan baris ke tabel:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Saya menyisipkan ribuan catatan, dan saya selalu mendapatkan kesalahan ini ketika teks berisi \ xF0 (yaitu nilai string yang salah selalu dimulai dengan \ xF0).
Susunan kolom adalah utf8_general_ci.
Apa yang bisa menjadi masalah?
Jawaban:
MySQL
utf8
hanya mengizinkan karakter Unicode yang dapat direpresentasikan dengan 3 byte di UTF-8. Di sini Anda memiliki karakter yang membutuhkan 4 byte: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Jika Anda memiliki MySQL 5.5 atau yang lebih baru, Anda dapat mengubah pengkodean kolom dari
utf8
menjadiutf8mb4
. Pengkodean ini memungkinkan penyimpanan karakter yang menempati 4 byte di UTF-8.Anda mungkin juga harus mengatur properti server
character_set_server
keutf8mb4
dalam file konfigurasi MySQL. Tampaknya Connector / J default ke Unicode 3-byte sebaliknya :sumber
character_encoding_server
bukan nama variabel konfigurasi MySQL yang valid. Saya telah mencoba untuk setcharacter_set_server
keutf8mb4
gantinya, selain kolom individu, tetapi itu tidak mengubah apa pun.String yang berisi
\xF0
hanya karakter yang dikodekan sebagai beberapa byte menggunakan UTF-8.Meskipun susunan Anda diatur ke utf8_general_ci, saya menduga bahwa pengkodean karakter dari database, tabel atau bahkan kolom mungkin berbeda. Mereka adalah pengaturan independen . Mencoba:
Ganti apa pun tipe data Anda yang sebenarnya untuk VARCHAR (255)
sumber
file-encoding
parameter yang menentukan UTF-8, mis.java -Dfile.encoding=UTF-8
Atau tambahkan sakelar yang sesuai di file konfigurasi Tomcat Anda (dll.).Punya masalah yang sama, untuk menyimpan data dengan
utf8mb4
kebutuhan untuk memastikan:character_set_client, character_set_connection, character_set_results
adalahutf8mb4
:character_set_client
dancharacter_set_connection
menunjukkan set karakter di mana pernyataan dikirim oleh klien,character_set_results
menunjukkan set karakter di mana server mengembalikan hasil permintaan kepada klien.Lihat koneksi charset .
pengkodean tabel dan kolom adalah
utf8mb4
Untuk JDBC, ada dua solusi:
Solusi 1 (perlu me-restart MySQL):
ubah
my.cnf
seperti berikut dan mulai ulang MySQL:ini dapat memastikan database dan
character_set_client, character_set_connection, character_set_results
secarautf8mb4
default.restart MySQL
ubah pengkodean tabel dan kolom menjadi
utf8mb4
BERHENTI menentukan
characterEncoding=UTF-8
dancharacterSetResults=UTF-8
dalam konektor jdbc, menyebabkan ini akan menimpacharacter_set_client
,character_set_connection
,character_set_results
untukutf8
Solusi dua (tidak perlu me-restart MySQL):
ubah pengkodean tabel dan kolom menjadi
utf8mb4
menentukan
characterEncoding=UTF-8
pada konektor jdbc, menyebabkan konektor jdbc tidak mendukungutf8mb4
.tulis statment sql Anda seperti ini (perlu menambahkan
allowMultiQueries=true
ke konektor jdbc):ini akan memastikan setiap koneksi ke server,
character_set_client,character_set_connection,character_set_results
yangutf8mb4
.Juga lihat koneksi charset .
sumber
SELECT
permintaan, karenaset names utf8mb4; select ... from ...
tidak akan pernah menghasilkanResultSet
dan malah menghasilkanResultSet is from UPDATE. No Data.
kesalahan.Saya ingin menggabungkan beberapa posting untuk membuat jawaban yang lengkap karena ini sepertinya beberapa langkah.
/etc/mysql/my.cnf
atau/etc/mysql/mysql.conf.d/mysqld.cnf
Lagi dari saran di atas semua koneksi jdbc telah
characterEncoding=UTF-8
dancharacterSetResults=UTF-8
dihapus dari merekaDengan set ini
-Dfile.encoding=UTF-8
tampaknya tidak ada bedanya.Saya masih tidak bisa menulis teks internasional ke db mendapatkan kegagalan yang sama seperti di atas
Sekarang menggunakan cara-mengkonversi-seluruh-mysql-database-karakteret-dan-collation-ke-utf-8
Perbarui semua db Anda untuk digunakan
utf8mb4
Jalankan kueri ini yang memberi Anda apa yang perlu dibunyikan
Salin hasil tempel di editor, ganti semua | dengan tidak ada yang mengirim kembali ke mysql ketika terhubung ke memperbaiki db.
Hanya itu yang harus dilakukan dan semuanya sepertinya bekerja untuk saya. Bukan -
Dfile.encoding=UTF-8
tidak diaktifkan dan tampaknya berfungsi seperti yang diharapkanE2A Masih memiliki masalah? Saya pasti dalam produksi sehingga ternyata Anda perlu memeriksa apa yang telah dilakukan oleh di atas, karena kadang-kadang tidak bekerja, berikut adalah alasan dan perbaiki dalam skenario ini:
Anda dapat melihat beberapa masih latin mencoba memperbarui catatan secara manual:
Jadi mari kita persempit:
Singkatnya saya harus mengurangi ukuran bidang itu untuk mendapatkan pembaruan agar berfungsi.
Sekarang ketika saya menjalankan:
Semuanya bekerja
sumber
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
cukup aneh ketika saya menjalankan ini terakhir kali semua bidang tidak lagi ditetapkan karakter. jadi kata sandi dari atas menjadipassword
varchar (255) BUKAN NULL, (tidak ada tentang penyandian). Ini berarti perintah terakhir hanya harus membuat lookup mysql apa definisi tabel sebenarnya dan karena sekarang tabel secara default ini bidang tidak lagi membutuhkannya - Saya kira mereka tetap dengan set karakter hanya karena selama dump seluruh pembaruan tabel itu tidak dapat memperbaruinya dan karenanya dibiarkan dalam keadaan ituDalam kasus saya, saya mencoba semuanya di atas, tidak ada yang berhasil. Saya cukup yakin, database saya terlihat seperti di bawah ini.
jadi, saya mencari charset kolom di setiap tabel
Ternyata charset kolom adalah latin. Itu sebabnya, saya tidak bisa memasukkan bahasa Mandarin ke dalam basis data.
Itu mungkin bisa membantu Anda. :)
sumber
Saya memiliki masalah yang sama dalam proyek rel saya:
Solusi 1: sebelum menyimpan ke db, konversi string ke base64 dengan
Base64.encode64(subject)
dan setelah mengambil dari penggunaan dbBase64.decode64(subject)
Solusi 2:
Langkah 1: Ubah set karakter (dan susunan) untuk kolom subjek dengan
Langkah 2: Dalam penggunaan database.yml
sumber
kerjakan saja
sumber
Dengan asumsi Anda menggunakan phpmyadmin untuk mengatasi kesalahan ini, ikuti langkah-langkah ini:
latin1_swedish_ci
(atau apa pun itu) keutf8_general_ci
sumber
Sebagian besar disebabkan karena beberapa karakter unicode. Dalam kasus saya itu adalah simbol mata uang Rupee.
Untuk segera memperbaiki ini, saya harus mengenali karakter yang menyebabkan kesalahan ini. Saya salin menempelkan seluruh teks dalam editor teks seperti vi dan mengganti karakter yang bermasalah dengan teks.
sumber
Saya punya masalah dengan aplikasi PLAY Java saya. Ini adalah jejak tumpukan saya untuk pengecualian itu:
Saya mencoba menyimpan catatan menggunakan io.Ebean. Saya memperbaikinya dengan membuat ulang basis data saya dengan collation utf8mb4, dan menerapkan play evolution untuk membuat kembali semua tabel sehingga semua tabel harus dibuat ulang dengan collation utf-8.
sumber
Jika Anda hanya ingin menerapkan perubahan hanya untuk satu bidang, Anda bisa mencoba membuat serialisasi bidang tersebut
sumber
Jika Anda membuat tabel MySQL baru, Anda bisa menentukan charset dari semua kolom saat membuat, dan itu memperbaiki masalah untuk saya.
Anda dapat membaca detail lebih lanjut: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
sumber
ini bukan solusi rekomendasi .. Tapi layak untuk dibagikan. Karena proyek saya memutakhirkan DBMS dari Mysql lama ke yang terbaru (8). Tapi aku tidak bisa mengubah struktur tabel, hanya konfigurasi DBMS (mysql). Solusi untuk server mysql.
uji pada Windows mysql 8.0.15 pada pencarian konfigurasi mysql
batalkan komentar itu. Atau dalam kasus saya cukup ketik / tambahkan
mengapa tidak disarankan solusi. karena jika Anda menggunakan latin1 (kasus saya) .. memasukkan data berhasil tetapi bukan konten (mysql tidak merespons dengan kesalahan !!). misalnya Anda mengetikkan info seperti ini
itu menghemat
oke .. untuk masalah saya .. saya bisa mengganti bidang ke UTF8 .. Tapi ada masalah kecil .. lihat jawaban di atas tentang solusi lain gagal karena kata tidak dimasukkan karena mengandung lebih dari 2 byte (cmiiw) .. ini solusi membuat data masukkan Anda menjadi kotak. Yang masuk akal adalah dengan menggunakan gumpalan .. dan Anda dapat melewatkan jawaban saya.
Pengujian lain yang terkait dengan ini adalah .. menggunakan utf8_encode pada kode Anda sebelum menyimpan. Saya menggunakan latin1 dan berhasil (saya tidak menggunakan sql-mode )! sama seperti jawaban di atas menggunakan base64_encode .
Saran saya untuk menganalisis kebutuhan tabel Anda dan mencoba mengubah dari format lain ke UTF8
sumber
solusi saya adalah mengubah jenis kolom dari varchar (255) menjadi gumpalan
sumber
Anda perlu mengatur utf8mb4 di meta html dan juga di server Anda mengubah tabel dan mengatur collation ke utf8mb4
sumber
Petunjuk: Pada AWS RDS Anda memerlukan Grup Parameter baru untuk DB MySQL Anda dengan params (alih-alih mengedit my.cnf)
Catatan: character_set_system tetap "utf8"
Perintah SQL ini TIDAK BEKERJA SECARA PERMANEN - hanya dalam satu sesi:
sumber
Saya juga harus menghapus dan membuat kembali semua prosedur yang tersimpan di database (dan fungsinya juga) agar dapat dieksekusi di dalam rangkaian karakter baru utf8mb4.
Lari:
... untuk melihat prosedur mana yang belum diperbarui ke nilai character_set_client baru server, collation_connection dan nilai Collation Database.
sumber