“Nilai string salah” ketika mencoba memasukkan UTF-8 ke MySQL melalui JDBC?

228

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?

Lior
sumber
Itu akan menjadi SURAT KECIL LATIN N DENGAN TILDE (ñ).
andreszs
Untuk yang lain mengalami masalah ini, Anda dapat mencoba: Pada database: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - Ini akan memecahkan "mulai sekarang" menciptakan tabel. BUKAN untuk tabel yang ada. Bagi mereka yang perlu Anda lakukan: ALTER TABLE table_name CONVERT KE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Sumber - digitalocean.com/community/questions/…
lingar

Jawaban:

321

MySQL utf8hanya 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 utf8menjadi utf8mb4. Pengkodean ini memungkinkan penyimpanan karakter yang menempati 4 byte di UTF-8.

Anda mungkin juga harus mengatur properti server character_set_serverke utf8mb4dalam file konfigurasi MySQL. Tampaknya Connector / J default ke Unicode 3-byte sebaliknya :

Misalnya, untuk menggunakan set karakter UTF-8 4-byte dengan Connector / J, konfigurasikan server MySQL dengan character_set_server=utf8mb4, dan tinggalkan characterEncodingstring koneksi Connector / J. Connector / J kemudian akan mendeteksi secara otomatis pengaturan UTF-8.

Joni
sumber
151
Apa pilihan aneh untuk memiliki utf8 benar-benar berarti "bagian dari UTF8 yang dapat direpresentasikan dalam 3 byte".
Eric J.
4
character_encoding_serverbukan nama variabel konfigurasi MySQL yang valid. Saya telah mencoba untuk set character_set_serverke utf8mb4gantinya, selain kolom individu, tetapi itu tidak mengubah apa pun.
Romain Paulus
20
# Untuk setiap database: ALTER DATABASE database_name, CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Untuk setiap tabel: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Untuk setiap kolom: ALTER TABLE table_name CHANGE column_name column_name VARCHAR (191) SET CHARACTER utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing
14
Aneh bahwa UTF-8 bukan UTF-8 hingga diperbarui menjadi UTF-8
Klors
3
Jadi Anda menyarankan bahwa UTF-8 dengan 3 (tiga) byte tidak dapat menyimpan LATIN SMALL LETTER N WITH TILDE (ñ), dan kami membutuhkan 4 (empat) byte untuk mengeja "España" dengan benar? Betulkah? Mungkinkah ini lebih tidak efisien dari ini? Apa yang bisa kita simpan selain AZ dan 0-9 dengan 3 byte lalu ..
andreszs
95

String yang berisi \xF0hanya 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:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  
    CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

Ganti apa pun tipe data Anda yang sebenarnya untuk VARCHAR (255)

Eric J.
sumber
4
Sebenarnya mencobanya, tidak berhasil. Tipe data kolom adalah LONGTEXT btw, jika ini penting.
Lior
1
Aplikasi Anda di Jawa saya ambil? Coba gunakan Java dengan file-encodingparameter yang menentukan UTF-8, mis. java -Dfile.encoding=UTF-8Atau tambahkan sakelar yang sesuai di file konfigurasi Tomcat Anda (dll.).
Eric J.
1
Saya sarankan Anda memberi penekanan pada "pengkodean karakter dari database, tabel atau bahkan kolom mungkin berbeda" . Itu adalah hal yang paling penting.
Gellie Ann
Anda harus mengubah tabel juga dengan CHARACTER SET utf8 COLLATE utf8_general_ci kemudian setelah mengubah kolom CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma
68

Punya masalah yang sama, untuk menyimpan data dengan utf8mb4kebutuhan untuk memastikan:

  1. character_set_client, character_set_connection, character_set_resultsadalah utf8mb4: character_set_clientdan character_set_connectionmenunjukkan set karakter di mana pernyataan dikirim oleh klien, character_set_resultsmenunjukkan set karakter di mana server mengembalikan hasil permintaan kepada klien.
    Lihat koneksi charset .

  2. pengkodean tabel dan kolom adalah utf8mb4

Untuk JDBC, ada dua solusi:

Solusi 1 (perlu me-restart MySQL):

  1. ubah my.cnfseperti berikut dan mulai ulang MySQL:

    [mysql]
    default-character-set=utf8mb4
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    

ini dapat memastikan database dan character_set_client, character_set_connection, character_set_resultssecara utf8mb4default.

  1. restart MySQL

  2. ubah pengkodean tabel dan kolom menjadi utf8mb4

  3. BERHENTI menentukan characterEncoding=UTF-8dan characterSetResults=UTF-8dalam konektor jdbc, menyebabkan ini akan menimpa character_set_client, character_set_connection, character_set_resultsuntukutf8

Solusi dua (tidak perlu me-restart MySQL):

  1. ubah pengkodean tabel dan kolom menjadi utf8mb4

  2. menentukan characterEncoding=UTF-8pada konektor jdbc, menyebabkan konektor jdbc tidak mendukung utf8mb4.

  3. tulis statment sql Anda seperti ini (perlu menambahkan allowMultiQueries=trueke konektor jdbc):

    'SET NAMES utf8mb4;INSERT INTO Mytable ...';

ini akan memastikan setiap koneksi ke server, character_set_client,character_set_connection,character_set_resultsyang utf8mb4.
Juga lihat koneksi charset .

madtracy
sumber
3
Poin 3 adalah penentu bagi saya bersamaan dengan mengubah pengkodean db, tabel & bidang: 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
kbbucks
Poin 3 melakukan trik untuk saya juga, pengkodean tabel saya sudah diatur ke utf8mb4.
Sir_Faenor
Pengkodean tabel hanyalah default. Cukup untuk mengubah pengkodean kolom ke utf8mb4.
Rick James
Pendekatan kedua harus digunakan secara selektif, yaitu tidak pernah diterapkan pada SELECTpermintaan, karena set names utf8mb4; select ... from ...tidak akan pernah menghasilkan ResultSetdan malah menghasilkan ResultSet is from UPDATE. No Data.kesalahan.
Bass
solusi 2, cukup par. Saya membantu saya ketika saya mencoba untuk memasukkan teks Sirilik melalui formulir kontak saya.
Vadim Anisimov
15

Saya ingin menggabungkan beberapa posting untuk membuat jawaban yang lengkap karena ini sepertinya beberapa langkah.

  1. Saran di atas oleh @madtracey

/etc/mysql/my.cnf atau /etc/mysql/mysql.conf.d/mysqld.cnf

[mysql]
default-character-set=utf8mb4

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
##
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Lagi dari saran di atas semua koneksi jdbc telah characterEncoding=UTF-8dan characterSetResults=UTF-8dihapus dari mereka

Dengan set ini -Dfile.encoding=UTF-8tampaknya 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

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Jalankan kueri ini yang memberi Anda apa yang perlu dibunyikan

SELECT CONCAT(
'ALTER TABLE ',  table_name, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ', 
'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'YOURDB'
AND
(C.CHARACTER_SET_NAME != 'utf8mb4'
    OR
 C.COLLATION_NAME not like 'utf8mb4%')

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-8tidak diaktifkan dan tampaknya berfungsi seperti yang diharapkan

E2A 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:

show create table user

  `password` varchar(255) CHARACTER SET latin1 NOT NULL,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,

Anda dapat melihat beberapa masih latin mencoba memperbarui catatan secara manual:

ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Jadi mari kita persempit:

mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL;
Query OK, 5 rows affected (0.01 sec)

Singkatnya saya harus mengurangi ukuran bidang itu untuk mendapatkan pembaruan agar berfungsi.

Sekarang ketika saya menjalankan:

mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

Semuanya bekerja

VH
sumber
Pertanyaan: perintah ALTER TABLE terakhir akan mengubah konten semua bidang VARCHAR menjadi string yang disandikan UTF8 yang asli? Saya bertanya karena saya mengalami masalah dalam mengonversi bidang LATIN1 saya ke UTF8, khususnya ketika karakter ñ ditemukan, konversi langsung gagal karena nilai string yang salah (kesalahan 1366).
andreszs
jika maksud Anda 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 menjadi passwordvarchar (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 itu
VH
7

Dalam kasus saya, saya mencoba semuanya di atas, tidak ada yang berhasil. Saya cukup yakin, database saya terlihat seperti di bawah ini.

mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using  EditLine wrapper

Connection id:      12
Current database:   xxx
Current user:       yo@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.17-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         42 min 49 sec

Threads: 1  Questions: 372  Slow queries: 0  Opens: 166  Flush tables: 1  Open tables: 30  Queries per second avg: 0.144

jadi, saya mencari charset kolom di setiap tabel

show create table company;

Ternyata charset kolom adalah latin. Itu sebabnya, saya tidak bisa memasukkan bahasa Mandarin ke dalam basis data.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Itu mungkin bisa membantu Anda. :)

crazy_phage
sumber
7

Saya memiliki masalah yang sama dalam proyek rel saya:

Incorrect string value: '\xF0\xA9\xB8\xBDs ...' for column 'subject' at row1

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

ALTER TABLE t1 MODIFY
subject VARCHAR(255)
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

Langkah 2: Dalam penggunaan database.yml

encoding :utf8mb4
ravi
sumber
4

kerjakan saja

ALTER TABLE `some_table` 
CHARACTER SET = utf8 , COLLATE = utf8_general_ci ;

ALTER TABLE `some_table` 
CHANGE COLUMN `description_with_latin_or_something` `description` TEXT CHARACTER SET 'utf8' NOT NULL ;
shareef
sumber
bagaimana jika saya memiliki banyak tabel yang ingin saya ubah dalam basis data? dan bagaimana jika semua memiliki mesin penyimpanan yang berbeda (innodb, dll)?
Yannis Dran
4

Dengan asumsi Anda menggunakan phpmyadmin untuk mengatasi kesalahan ini, ikuti langkah-langkah ini:

  1. phpMyAdmin
  2. your_table
  3. "Tab struktur"
  4. ubah susunan bidang Anda dari latin1_swedish_ci(atau apa pun itu) keutf8_general_ci
Teo Mihaila
sumber
5
Tidak valid, Anda mengira dia menggunakan phpMyAdmin.
ShaH
tidak berfungsi ...... dan susunan diubah dalam 'operasi' dan bukan dalam struktur
Olorunfemi Ajibulu
@OlorunfemiAjibulu ya, Anda dapat mengubahnya di "struktur" juga. Bagi sebagian orang di sini, itu berhasil
Teo Mihaila
@TeoMihaila Mungkin, ini versi.
Olorunfemi Ajibulu
3

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.

BTR Naidu
sumber
3
OP menyebutkan bahwa ada ribuan catatan yang dimasukkan ....
Gellie Ann
3

Saya punya masalah dengan aplikasi PLAY Java saya. Ini adalah jejak tumpukan saya untuk pengecualian itu:

javax.persistence.PersistenceException: Error[Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1]
  at io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:52)
  at io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:192)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:83)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:49)
  at io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1136)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:723)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:778)
  at io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:769)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:456)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:406)
  at io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:393)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1602)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1594)
  at io.ebean.Model.save(Model.java:190)
  at models.Product.create(Product.java:147)
  at controllers.PushData.xlsupload(PushData.java:67)
  at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$40(Routes.scala:690)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133)
  at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108)
  at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:88)
  at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31)
  at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:138)
  at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:655)
  at scala.util.Success.$anonfun$map$1(Try.scala:251)
  at scala.util.Success.map(Try.scala:209)
  at scala.concurrent.Future.$anonfun$map$1(Future.scala:289)
  at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29)
  at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56)
  at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
  at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48)
  at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375)
  at scala.concurrent.impl.Promise.transform(Promise.scala:29)
  at scala.concurrent.impl.Promise.transform$(Promise.scala:27)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375)
  at scala.concurrent.Future.map(Future.scala:289)
  at scala.concurrent.Future.map$(Future.scala:289)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375)
  at scala.concurrent.Future$.apply(Future.scala:655)
  at play.core.j.JavaAction.apply(JavaAction.scala:138)
  at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96)
  at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:304)
  at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
  at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
  at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
  at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81)
  at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91)
  at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
  at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43)
  at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
  at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
  at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
  at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.sql.SQLException: Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
  at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
  at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
  at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
  at io.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:82)
  at io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:122)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:73)
  ... 59 more

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.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Md Ashfak Chowdhury
sumber
2

Jika Anda hanya ingin menerapkan perubahan hanya untuk satu bidang, Anda bisa mencoba membuat serialisasi bidang tersebut

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end
Paul Marclay
sumber
2

Jika Anda membuat tabel MySQL baru, Anda bisa menentukan charset dari semua kolom saat membuat, dan itu memperbaiki masalah untuk saya.

CREATE TABLE tablename (
<list-of-columns>
)
CHARSET SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Anda dapat membaca detail lebih lanjut: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html

amucunguzi
sumber
2

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

sql-mode = "....."

batalkan komentar itu. Atau dalam kasus saya cukup ketik / tambahkan

sql-mode = "NO_ENGINE_SUBSTITUTION"

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

bla \ x12

itu menghemat

bla [] (kotak)

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

pengguna2905554
sumber
Di settings.py saya (Proyek Django), saya berubah menjadi sql-mode = "NO_ENGINE_SUBSTITUTION". Bekerja.
Taciano Morais Silva
1

solusi saya adalah mengubah jenis kolom dari varchar (255) menjadi gumpalan

zhuochen shen
sumber
1

Anda perlu mengatur utf8mb4 di meta html dan juga di server Anda mengubah tabel dan mengatur collation ke utf8mb4

Sona Israyelyan
sumber
1

Petunjuk: Pada AWS RDS Anda memerlukan Grup Parameter baru untuk DB MySQL Anda dengan params (alih-alih mengedit my.cnf)

  • collation_connection: utf8mb4_unicode_ci
  • collation_database: utf8mb4_unicode_ci
  • collation_server: utf8mb4_unicode_ci
  • character_set_client: utf8mb4
  • character_set_connection: utf8mb4
  • character_set_database: utf8mb4
  • karakter_set_hasil: utf8mb4
  • character_set_server: utf8mb4

Catatan: character_set_system tetap "utf8"

Perintah SQL ini TIDAK BEKERJA SECARA PERMANEN - hanya dalam satu sesi:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;
electrobabe
sumber
0

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:

SHOW PROCEDURE STATUS;

... untuk melihat prosedur mana yang belum diperbarui ke nilai character_set_client baru server, collation_connection dan nilai Collation Database.

Ethan Allen
sumber