UTF-8'i JDBC aracılığıyla MySQL'e eklemeye çalışırken “hatalı dize değeri”?


228

Bağlantım şöyle yapılır:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

Tabloya satır eklemek için yazarken aşağıdaki hatayı alıyorum:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

Binlerce kayıt ekliyorum ve metin \ xF0 (yani yanlış dize değeri her zaman \ xF0 ile başlar) içerdiğinde ben her zaman bu hatayı alıyorum.

Sütunun harmanlaması utf8_general_ci'dir.

Sorun ne olabilir?


Bu TILDE İLE KÜÇÜK MEKTUP N olacaktır (ñ).
andreszs

Diğerleri için bu sorunla karşılaşabilirsiniz: Veritabanında: ALTER DATABASE veritabanı_adı CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - "Oluşturulan tablolar" artık çözecektir. VAR tablolar için DEĞİL. Onlar için yapmanız gerekenler: ALTER TABLE table_name KARAKTER SETİNE DÖNÜŞ utf8mb4 COLLATE utf8mb4_unicode_ci; Kaynak - digitalocean.com/community/questions/…
lingar

Yanıtlar:


321

MySQL utf8, yalnızca UTF-8'de 3 bayt ile temsil edilebilecek Unicode karakterlere izin verir. Burada 4 bayta ihtiyaç duyan bir karakteriniz var: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTİK MEKTUP SAUIL ).

MySQL 5.5 veya sonraki bir sürümüne sahipseniz, sütun kodlamasını olarak utf8değiştirebilirsiniz utf8mb4. Bu kodlama, UTF-8'de 4 bayt kaplayan karakterlerin depolanmasına izin verir.

Ayrıca sunucu özelliğini ayarlamak gerekebilir character_set_serveriçin utf8mb4MySQL yapılandırma dosyasında. Bağlayıcı / J varsayılan olarak 3 bayt Unicode'u kullanıyor gibi görünüyor :

Örneğin, 4 bayt UTF-8 karakter kümelerini Connector / J ile kullanmak için character_set_server=utf8mb4, MySQL sunucusunu yapılandırın characterEncodingve Connector / J bağlantı dizgisinin dışında bırakın . Bağlayıcı / J daha sonra UTF-8 ayarını otomatik olarak algılar.


151
Utf8 için ne garip bir seçim gerçekten "3 bayt olarak temsil edilebilir UTF8 alt kümesi" anlamına gelir.
Eric

4
character_encoding_servernota geçerli MySQL yapılandırma değişkeni adıdır. Sette çalıştık character_set_serveriçin utf8mb4bireysel sütunlara ek olarak, bunun yerine, ama bir şey değişmedi.
Romain Paulus

20
# Her veritabanı için: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Her tablo için: ALTER TABLE tablo_adı KARAKTER SETİNE DÖNÜŞ utf8mb4 COLLATE utf8mb4_unicode_ci; # Her sütun için: ALTER TABLE tablo_adı DEĞİŞTİR sütun_adı sütun_adı VARCHAR (191) KARAKTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing

14
UTF-8, UTF-8 olarak güncellenene kadar UTF-8 olmadığını tuhaf
Klors

3
Yani 3 (üç) byte ile UTF-8'in TILDE İLE LATIN KÜÇÜK MEKTUP N (ñ) depolayamadığını ve "España" yı doğru şekilde yazabilmek için 4 (dört) bayta ihtiyaç duyduğunuzu mu söylüyorsunuz? Gerçekten mi? Bundan daha yetersiz olabilir mi? AZ ve 0-9 dışında 3 bayt ile ne saklayabiliriz ..
andreszs

95

İhtiva dizeleri \xF0sade birden bayt olarak kodlanmış karakterler UTF-8 kullanarak.

Harmanlamanız utf8_general_ci olarak ayarlanmış olsa da, veritabanı, tablo veya hatta sütunun karakter kodlamasının farklı olabileceğinden şüpheleniyorum. Bunlar bağımsız ortamlardır . Deneyin:

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

Gerçek veri türünüz VARCHAR için olanı değiştirin (255)


4
Aslında bunu denedim, işe yaramadı. Önemli olursa, sütunun veri türü LONGTEXT btw'dir.
Lior

1
Uygulamanız Java'da mı alıyorum? Java'yı file-encodingUTF-8 belirten parametreyle çağırmayı deneyin , örn java -Dfile.encoding=UTF-8. Tomcat (vb.) Yapılandırma dosyanıza uygun bir anahtar ekleyin.
Eric J.

1
Ben vurgulamak öneririz "veritabanı kodlama veritabanı, tablo veya hatta sütun farklı olabilir" . Bu en önemli şey.
Gellie Ann

CHARACTER SET utf8 COLLATE utf8_general_ci ile tabloyu da değiştirmeniz gerekecektir, sonra CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma

68

Aşağıdakilerden utf8mb4emin olmak için verileri kaydetmek için aynı sorunu var :

  1. character_set_client, character_set_connection, character_set_resultsşunlardır utf8mb4: character_set_clientve character_set_connectionifadeleri istemci tarafından gönderilen edildiği karakter kümesi belirtmek, character_set_resultssunucu döndürür istemciye sonuçları sorgulamak hangi karakter kümesini belirtir.
    Bkz. Karakter seti bağlantısı .

  2. tablo ve sütun kodlaması utf8mb4

JDBC için iki çözüm vardır:

Çözüm 1 (MySQL'i yeniden başlatmanız gerekiyor):

  1. my.cnfaşağıdaki gibi değiştirin ve MySQL'i yeniden başlatın:

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

Bu emin veritabanını yapabilir ve character_set_client, character_set_connection, character_set_resultsvardır utf8mb4varsayılan olarak.

  1. MySQL'i yeniden başlat

  2. tablo ve sütun kodlamasını şu şekilde değiştirin: utf8mb4

  3. DUR belirterek characterEncoding=UTF-8ve characterSetResults=UTF-8jdbc bağlayıcı içinde, bu geçersiz kılar neden character_set_client, character_set_connection, character_set_resultsiçinutf8

İkinci çözüm (MySQL'i yeniden başlatmanız gerekmez):

  1. tablo ve sütun kodlamasını şu şekilde değiştirin: utf8mb4

  2. characterEncoding=UTF-8jdbc bağlayıcısında belirtmek , jdbc bağlayıcısının desteklememesine neden olur utf8mb4.

  3. sql ifadenizi şöyle yazın ( allowMultiQueries=truejdbc bağlayıcısına eklemeniz gerekir ):

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

bu sunucuya emin her bağlantıyı yapacak character_set_client,character_set_connection,character_set_resultsolan utf8mb4.
Ayrıca bkz. Karakter seti bağlantısı .


3
Nokta 3, db, tablo ve alan kodlamalarını değiştirmeyle birlikte benim için kattığıydı: 'SET NAMES utf8mb4; Mytable içine yerleştirin ...';
kbbucks

3. nokta benim için hile yaptı, benim tablo kodlama zaten utf8mb4 olarak ayarlanmış.
Sir_Faenor

Tablo kodlaması yalnızca bir varsayılan değerdir. Sütun kodlamasını utf8mb4 olarak değiştirmek yeterlidir.
Rick James

İkinci yaklaşım seçici olarak kullanılmalıdır, yani asla SELECTsorgulara uygulanmamalıdır , çünkü set names utf8mb4; select ... from ...asla bir üretmeyecek ResultSetve bunun yerine bir ResultSet is from UPDATE. No Data.hata ile sonuçlanacaktır .
Bass

çözüm 2, sadece par. İletişim formumdan Kiril metni eklemeye çalışırken 1 bana yardımcı oldu.
Vadim Anisimov

15

Birkaç adım gibi göründüğünden, bunun tam bir cevabını vermek için birkaç gönderiyi birleştirmek istedim.

  1. @Madtracey tarafından tavsiye yukarıda

/etc/mysql/my.cnf veya /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

Yine yukarıdaki tüm jdbc bağlantıları tavsiye characterEncoding=UTF-8ve characterSetResults=UTF-8onlardan kaldırıldı

Bu set ile -Dfile.encoding=UTF-8hiçbir fark yaratmadı.

Hala yukarıdaki gibi aynı başarısızlık db içine uluslararası metin yazamadı

Şimdi bu nasıl-tüm-mysql-veritabanı-karakter kümesi-ve-harmanlama-to-utf-8 dönüştürmek

Kullanmak için tüm db'nizi güncelleyin utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Bastırılması gerekeni size veren bu sorguyu çalıştırın

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%')

Editördeki kopya yapıştırma çıktısı hepsini değiştir | db doğru bağlı hiçbir şey geri mysql içine sonrası.

Yapılması gereken tek şey bu ve her şey benim için çalışıyor gibi görünüyor. - Dfile.encoding=UTF-8etkin değil ve beklendiği gibi çalışıyor

E2A Hala sorun mu yaşıyorsunuz? Kesinlikle üretimdeyim, bu yüzden yukarıda ne yapıldığını kontrol etmeniz gerekiyor, çünkü bazen çalışmıyor, işte bu senaryoda sebep ve düzeltme:

show create table user

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

Bazılarının hala kaydı manuel olarak güncellemeye çalıştığını görebilirsiniz:

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

Öyleyse onu daraltalım:

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)

Kısacası güncellemenin çalışması için o alanın boyutunu küçültmek zorunda kaldım.

Şimdi koştuğumda:

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

Hepsi işe yarıyor


Soru: Son ALTER TABLE komutu tüm VARCHAR alanlarının içeriğini geçerli, gerçek UTF8 kodlu dizeye dönüştürecek mi? Ben soruyorum çünkü LATIN1 alanları UTF8, özellikle ñ karakteri bulunduğunda dönüştürme yanlış bir dize değeri (hata 1366) nedeniyle doğrudan başarısız olur.
andreszs

bunu ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;son kez çalıştırdığımda garip bir şekilde kastediyorsanız , tüm alanların artık tanımlanmış bir karakter seti yoktu. bu yüzden yukarıdan şifre passwordvarchar (255) DEĞİL DEĞİL, (kodlama hakkında hiçbir şey). Bu, son komutun sadece gerçek tablo tanımının ne olduğunu mysql araması yapmış olması gerektiği anlamına gelir ve şimdi tablo varsayılan olarak bu alanlara artık ihtiyaç duymadığından - karakter kümesinde kaldıklarını varsayıyorum çünkü tüm tablo güncellemelerinin dökümü sırasında güncelleyemedi ve dolayısıyla bu durumda kaldı
VH

7

Benim durumumda, yukarıdaki her şeyi denedim, hiçbir şey işe yaramadı. Eminim, veritabanım aşağıdaki gibi görünüyor.

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

bu yüzden her tabloda sütun karakter kümesine bakıyorum

show create table company;

Sütun karakter kümesinin latin olduğu ortaya çıkıyor. Bu yüzden veritabanına Çince ekleyemiyorum.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Bu size yardımcı olabilir. :)


7

Aynı problemi raylar projemde de yaşadım:

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

Çözüm 1: db'ye kaydetmeden önce Base64.encode64(subject) , db kullanımından ve db kullanımından sonra dizeyi base64'e dönüştürün Base64.decode64(subject)

Çözüm 2:

Adım 1: Konu sütununun karakter kümesini (ve harmanlamasını) şu şekilde değiştirin:

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

Adım 2: database.yml dosyasında

encoding :utf8mb4

4

sadece yap

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 ;

veritabanında değiştirmek istediğim bir sürü tablo varsa ne olur? ve hepsinin farklı depolama motoru (innodb, vb.) varsa?
Yannis Dran

4

Bu hatayı çözmek için phpmyadmin kullandığınızı varsayarsak , aşağıdaki adımları izleyin:

  1. phpMyAdmin
  2. senin masan
  3. "Yapı sekmesi"
  4. alanınızın Harmanlamasını latin1_swedish_ci(veya her neyse) olarak değiştirinutf8_general_ci

5
Geçerli değil, phpMyAdmin kullandığını varsayıyorsunuz.
ShaH

çalışmıyor ...... ve harmanlama yapıda değil, 'operasyon' değiştirilir
Olorunfemi Ajibulu

@OlorunfemiAjibulu evet, bunu "yapı" da değiştirebilirsiniz. Buradaki bazı insanlar için işe yaradı
Teo Mihaila

@TeoMihaila Belki de sürüm alıyor.
Olorunfemi Ajibulu

3

Çoğunlukla bazı unicode karakterlerden kaynaklanır. Benim durumumda Rupi para birimi sembolü idi.

Bunu hızlı bir şekilde düzeltmek için, bu hataya neden olan karakteri tespit etmek zorunda kaldım. Metnin tamamını vi gibi bir metin düzenleyicisine yapıştırdım ve rahatsız edici karakteri bir metinle değiştirdim.


3
OP bin bin kayıt olduğunu söyledi ....
Gellie Ann

3

PLAY Java uygulamamla bu sorunu yaşadım. Bu istisna için yığın izlemem:

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

İo.Ebean kullanarak bir kayıt kaydetmeye çalışıyordum. Ben benim utf8mb4 harmanlama ile veritabanımı yeniden oluşturarak düzeltildi ve tüm tabloları utf-8 harmanlama ile yeniden oluşturulması gerekir böylece tüm tabloları yeniden oluşturmak için oyun evrim uyguladı.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

Değişikliği yalnızca bir alan için uygulamak istiyorum, alanı serileştirmeyi deneyebilirsiniz

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end


2

bu öneri çözümü değil .. Ama paylaşmaya değer. Projem DBMS'yi eski Mysql'den yenisine yükselttiği için (8). Ancak tablo yapısını, sadece DBMS yapılandırma (mysql) değiştiremiyorum. MySQL sunucusu için çözüm.

mysql yapılandırması için Windows mysql 8.0.15 üzerinde test

sql modu = "....."

onu uncomment. Ya da benim durumumda yaz / ekle

sql modu = "NO_ENGINE_SUBSTITUTION"

neden tavsiye edilmez çözüm. çünkü latin1 (benim durumum) kullanıyorsanız .. veri başarıyla eklemek ama içerik (mysql hata ile cevap değil !!). örneğin böyle bir bilgi yazarsınız

bla \ x12

kurtardı

bla [] (kutu)

tamam .. benim sorunum için .. UTF8 alanı değiştirebilirim .. Ama küçük bir sorun var .. yukarıdaki diğer çözüm hakkında cevap başarısız çünkü kelime eklenmedi çünkü 2 bayt (cmiiw) içerdiği için .. bu çözüm eklemek veri kutusu haline. Makul damla kullanmaktır .. ve benim cevap atlayabilirsiniz.

Bununla ilgili bir başka test ise, kaydetmeden önce kodunuzda utf8_encode kullanılmasıydı . Ben latin1 üzerinde kullanın ve başarılı oldu ( sql modu kullanmıyorum )! base64_encode kullanarak yukarıdaki yanıtla aynı .

Tablo gereksiniminizi analiz etme önerim ve diğer biçimden UTF8'e geçmeye çalıştım


Settings.py (Django Project) içinde sql-mode = "NO_ENGINE_SUBSTITUTION" olarak değiştirdim. İşe yarıyor.
Taciano Morais Silva


1

Meta html'de ve ayrıca sunucunuzda utf8mb4'ü ayarlamanız ve tablo değiştirme ve harmanlamayı utf8mb4 olarak ayarlamanız gerekir


1

İpucu: AWS RDS'de MySQL DB'niz için parametrelerle yeni bir Parameter Group'a ihtiyacınız var (my.cnf'yi düzenlemek yerine)

  • harmanlama_bağlantısı: 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
  • character_set_results: utf8mb4
  • character_set_server: utf8mb4

Not: character_set_system "utf8" olarak kalır

Bunlar SQL komutları yapmak DEĞİL KALICI İŞ - sadece bir oturumda:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

Ben de utf8mb4 yeni karakter kümesi içinde yürütmek amacıyla tüm veritabanının saklı yordamları (ve işlevleri de) bırakmak ve yeniden oluşturmak zorunda kaldı.

Çalıştırmak:

SHOW PROCEDURE STATUS;

… Hangi yordamların sunucunun yeni character_set_client, collation_connection ve Database Collation değerlerine güncellenmediğini görmek için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.