JDBC के माध्यम से MySQL में UTF-8 डालने की कोशिश करते समय "गलत स्ट्रिंग मान"?


228

इस तरह मेरा कनेक्शन सेट है:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

और एक तालिका में एक पंक्ति जोड़ने के लिए tyring करते समय मुझे निम्न त्रुटि मिल रही है:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

मैं हजारों रिकॉर्ड सम्मिलित कर रहा हूं, और मुझे यह त्रुटि तब मिलती है जब पाठ में \ xF0 होता है (यानी गलत स्ट्रिंग मान हमेशा \ xF0 से शुरू होता है)।

स्तंभ का टकराव utf8_general_ci है।

क्या समस्या हो सकती है?


यह TILDE (ñ) के साथ LATIN SMALL LETTER N होगा।
andreszs

अन्य लोगों के लिए इस समस्या का सामना करने के लिए, आप कोशिश कर सकते हैं: डेटाबेस पर: डेटाबेस पर जाएं डेटाबेस_नाम चार्टर सेट करें utf8mb4 COLLATE utf8mb4_unicode_ci; - यह "बनाया टेबल पर अब से" हल हो जाएगा। परीक्षा तालिका के लिए नहीं। उनके लिए आपको करने की आवश्यकता है: सारणी तालिका सारणी_नाम बदलने के लिए सेट करें सेट utf8mb4 COLLATE utf8mb4_unicode_ci; स्रोत - digitalocean.com/community/questions/…
lingar

जवाबों:


321

MySQL के utf8केवल यूनिकोड वर्णों की अनुमति है जिन्हें UTF-8 में 3 बाइट्स के साथ दर्शाया जा सकता है। यहां आपके पास एक चरित्र है जिसे 4 बाइट्स की आवश्यकता है: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 गोथिक पत्र सेल )।

आप MySQL 5.5 है या तो बाद में आप स्तंभ से एन्कोडिंग को बदल सकते हैं utf8करने के लिए utf8mb4। यह एन्कोडिंग उन वर्णों के भंडारण की अनुमति देता है जो UTF-8 में 4 बाइट्स पर कब्जा कर लेते हैं।

तुम भी सर्वर गुण सेट करना पड़ सकता है character_set_serverके लिए utf8mb4MySQL विन्यास फाइल में। ऐसा लगता है कि कनेक्टर / J ने 3-बाइट यूनिकोड को अन्यथा चूक दिया है :

उदाहरण के लिए, कनेक्टर / J के साथ 4-बाइट UTF-8 वर्ण सेट का उपयोग करने के लिए, MySQL सर्वर को कॉन्फ़िगर करें character_set_server=utf8mb4, और characterEncodingकनेक्टर / J कनेक्शन स्ट्रिंग से बाहर निकलें। कनेक्टर / J उसके बाद UTF-8 सेटिंग को ऑटोडेट करेगा।


151
Utf8 होने का एक अजीब विकल्प वास्तव में "UTF8 का सबसेट है जिसे 3 बाइट्स में दर्शाया जा सकता है"।
एरिक जे।

4
character_encoding_serverनोटा मान्य MySQL विन्यास चर नाम है। मैंने व्यक्तिगत कॉलम के अलावा, इसके बजाय सेट character_set_serverकरने की कोशिश की है utf8mb4, लेकिन यह कुछ भी नहीं बदला।
रोमेन पॉलस

20
# प्रत्येक डेटाबेस के लिए: DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # प्रत्येक तालिका के लिए: सारणी तालिका सारणी_नाम बदलने के लिए बदल दें सेट utf8mb4 COLLATE utf8mb4_unicode_ci; # प्रत्येक कॉलम के लिए: ALTER TABLE table_name CHANGE column_name column_name VARCHAR (191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
जिंग

14
विचित्र है कि UTF-8 UTF-8 नहीं है, जब तक कि इसे UTF-8 अपडेट नहीं किया जाता है
Clors

3
तो आप यह सुझाव दे रहे हैं कि UTF-8 3 (तीन) बाइट्स के साथ LATIN SMALL LETTER N को TILDE (ñ) के साथ स्टोर करने में असमर्थ है, और हमें "España" को सही ढंग से वर्तनी के लिए 4 (चार) बाइट्स की आवश्यकता है? वास्तव में? क्या यह इससे अधिक अक्षम हो सकता है? हम 3 बाइट्स के साथ AZ और 0-9 के अलावा क्या स्टोर कर सकते हैं ..
andreszs

94

इसमें जो तार होते \xF0हैं वे बस वर्ण हैं जो UTF-8 का उपयोग करके कई बाइट्स के रूप में एन्कोड किए गए हैं

हालाँकि, आपका कोलाज utf8_general_ci पर सेट है, मुझे संदेह है कि डेटाबेस, टेबल या कॉलम के वर्ण एन्कोडिंग भिन्न हो सकते हैं। वे स्वतंत्र सेटिंग्स हैं । प्रयत्न:

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

VARCHAR (255) के लिए आपका वास्तविक डेटा प्रकार जो भी है उसे प्रतिस्थापित करें


4
वास्तव में कोशिश की है कि, काम नहीं किया। यदि यह मायने रखता है तो कॉलम का डेटा प्रकार LONGTEXT btw है।
लीनियर

1
आपका ऐप जावा में है मैं इसे लेता हूं? file-encodingUTF-8 निर्दिष्ट करने वाले पैरामीटर के साथ जावा को लागू करने का प्रयास करें , उदाहरण के लिए java -Dfile.encoding=UTF-8या अपनी टॉमकैट (आदि) कॉन्फ़िगरेशन फ़ाइल में एक उपयुक्त स्विच जोड़ें।
एरिक जे।

1
मेरा सुझाव है कि आप "डेटाबेस के डेटाबेस एन्कोडिंग, टेबल या यहां तक ​​कि कॉलम अलग हो सकते हैं" पर जोर देते हैं । वह सबसे महत्वपूर्ण बात है।
गेल्ली एन

आपको CHARACTER SET utf8 COLLATE utf8_general_ci के साथ तालिका को बदलना होगा और फिर कॉलम CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma

68

utf8mb4यह सुनिश्चित करने के लिए डेटा को सहेजने के लिए एक ही समस्या है:

  1. character_set_client, character_set_connection, character_set_resultsहैं utf8mb4: character_set_clientऔर character_set_connectionग्राहक द्वारा दिए character_set_resultsगए वर्ण सेट को दर्शाते हैं , जो उस चरित्र सेट को इंगित करता है जिसमें सर्वर ग्राहक को क्वेरी परिणाम देता है।
    देखें चारसेट-कनेक्शन

  2. तालिका और स्तंभ एन्कोडिंग है utf8mb4

JDBC के लिए, दो समाधान हैं:

समाधान 1 (MySQL पुनः आरंभ करने की आवश्यकता है):

  1. my.cnfनिम्नलिखित की तरह संशोधित करें और MySQL पुनः आरंभ करें:

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

इस यकीन है कि डेटाबेस बनाने के लिए और कर सकते हैं character_set_client, character_set_connection, character_set_resultsकर रहे हैं utf8mb4डिफ़ॉल्ट रूप से।

  1. MySQL पुनः आरंभ करें

  2. तालिका और कॉलम एन्कोडिंग को बदलें utf8mb4

  3. बंद को निर्दिष्ट characterEncoding=UTF-8और characterSetResults=UTF-8JDBC कनेक्टर में, कारण इस स्थान पर आ जाएगी character_set_client, character_set_connection, character_set_resultsकरने के लिएutf8

समाधान दो (MySQL को पुनरारंभ करने की आवश्यकता नहीं है):

  1. तालिका और कॉलम एन्कोडिंग को बदलें utf8mb4

  2. characterEncoding=UTF-8jdbc कनेक्टर में निर्दिष्ट करने के कारण, jdbc कनेक्टर सुपरपोर्ट नहीं करता है utf8mb4

  3. इस तरह अपनी sql क़ानून लिखें ( allowMultiQueries=truejdbc कनेक्टर में जोड़ने की आवश्यकता ):

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

यह सुनिश्चित करेगा कि सर्वर से प्रत्येक कनेक्शन, character_set_client,character_set_connection,character_set_resultsहैं utf8mb4
इसके अलावा चारसेट-कनेक्शन देखें ।


3
बिंदु 3 डीबी, टेबल और फील्ड एन्कोडिंग को बदलने के साथ मेरे लिए क्लिनिक था: 'सेट नेम्स यूएफएफ 8 एमबी; INSERT INTO Mytable ...';
kbbucks

प्वाइंट 3 ने मेरे लिए भी चाल चली, मेरी टेबल एन्कोडिंग पहले से ही utf8mb4 पर सेट थी।
सर_फेनर

तालिका एन्कोडिंग केवल एक डिफ़ॉल्ट है। यह कॉलम एन्कोडिंग को utf8mb4 में बदलने के लिए पर्याप्त है।
रिक जेम्स

दूसरे दृष्टिकोण को चुनिंदा रूप से उपयोग किया जाना चाहिए, अर्थात SELECTप्रश्नों पर कभी लागू नहीं किया जाना चाहिए , क्योंकि set names utf8mb4; select ... from ...कभी भी ResultSetपरिणाम नहीं होगा और इसके परिणामस्वरूप ResultSet is from UPDATE. No Data.त्रुटि होगी।
बास

समाधान 2, बस बराबर। 1 ने मेरी मदद की जब मैं अपने संपर्क फ़ॉर्म के माध्यम से सिरिलिक पाठ सम्मिलित करने का प्रयास कर रहा था।
वादिम अनीसिमोव

15

मैं इसका पूरा उत्तर देने के लिए कुछ पोस्ट जोड़ना चाहता था क्योंकि यह कुछ चरणों में दिखाई देता है।

  1. @Madtracey द्वारा उपरोक्त सलाह

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

फिर से सभी jdbc कनेक्शन के ऊपर सलाह से characterEncoding=UTF-8और characterSetResults=UTF-8उनसे हटा दिया गया था

इस सेट के साथ -Dfile.encoding=UTF-8कोई फर्क नहीं दिखाई दिया।

मैं अभी भी db में अंतरराष्ट्रीय पाठ नहीं लिख सका जैसा कि ऊपर बताया गया है

अब इसका उपयोग कैसे करें-कैसे-करें-संपूर्ण-mysql-database-characterset-and-collation-to-utf-8

उपयोग करने के लिए अपने सभी डीबी को अपडेट करें utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

इस क्वेरी को चलाएं जो आपको देती है कि किस चीज की जरूरत है

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

संपादक में कॉपी पेस्ट आउटपुट सभी को बदलें | सही db से जुड़े होने पर mysql में वापस कुछ भी नहीं।

वह सब कुछ किया जाना था और सब मेरे लिए काम करने लगता है। नहीं - Dfile.encoding=UTF-8सक्षम नहीं है और यह उम्मीद के मुताबिक काम करता है

E2A अभी भी एक मुद्दा है? मैं निश्चित रूप से उत्पादन में हूं इसलिए यह पता चलता है कि आपको ऊपर की जाँच करने की आवश्यकता है, क्योंकि यह कभी-कभी काम नहीं करता है, इस कारण और इस परिदृश्य में ठीक है:

show create table user

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

आप देख सकते हैं कि कुछ लोग अभी भी रिकॉर्ड को मैन्युअल रूप से अपडेट करने का प्रयास कर रहे हैं:

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

तो आइए इसे संकीर्ण करें:

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)

संक्षेप में मुझे काम करने के लिए अद्यतन प्राप्त करने के लिए उस क्षेत्र का आकार कम करना पड़ा।

अब जब मैं चला:

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

यह सब काम करता है


प्रश्न: अंतिम परिवर्तन सारणी सभी VARCHAR क्षेत्रों की सामग्री को मान्य, वास्तविक UTF8 एन्कोडेड स्ट्रिंग में बदल देगी? मैं पूछता हूं क्योंकि मुझे अपने LATIN1 फ़ील्ड को UTF8 में परिवर्तित करने में समस्या हो रही है, विशेष रूप से जब ñ वर्ण पाया जाता है, तो गलत स्ट्रिंग मान (त्रुटि 1366) के कारण रूपांतरण सीधे विफल हो जाता है।
andreszs

अगर आप ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;अजीब तरह से मतलब है जब मैं यह अंतिम बार भाग गया सभी क्षेत्रों में अब एक चरित्र सेट परिभाषित नहीं था। तो ऊपर से पासवर्ड passwordvarchar (255) NOT NULL, (एन्कोडिंग के बारे में कुछ भी नहीं) बन गया । इसका मतलब यह है कि अंतिम कमांड ने निश्चित रूप से mysql लुकअप किया होगा कि वास्तविक टेबल परिभाषा क्या थी और क्योंकि अब टेबल डिफ़ॉल्ट रूप से इस क्षेत्र की आवश्यकता नहीं है - मुझे लगता है कि वे चरित्र सेट के साथ बने रहे क्योंकि पूरी टेबल अपडेट के डंप के दौरान यह इसे अपडेट नहीं कर सका और इसलिए इसे उस अवस्था में
VH

7

मेरे मामले में, मैंने ऊपर सब कुछ करने की कोशिश की, कुछ भी काम नहीं किया। मुझे पूरा यकीन है, मेरा डेटाबेस नीचे की तरह दिखता है।

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

इसलिए, मैं हर तालिका में कॉलम चारसेट को देखता हूं

show create table company;

यह कॉलम चारसेट लैटिन है। इसीलिए, मैं डेटाबेस में चीनी नहीं डाल सकता।

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

वह आपकी मदद कर सकता है। :)


7

मुझे अपनी रेल परियोजना में भी यही समस्या थी:

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

समाधान 1: db को सेव करने से पहले स्ट्रिंग को बेस 64 में Base64.encode64(subject) और उसके बाद db के उपयोग से लाने के लिएBase64.decode64(subject)

समाधान 2:

चरण 1: विषय कॉलम के लिए वर्ण सेट (और टकराव) बदलें

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

चरण 2: database.yml में उपयोग करें

encoding :utf8mb4

4

बस करो

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 ;

क्या होगा यदि मेरे पास टेबलों का एक गुच्छा है जो मैं डेटाबेस में बदलना चाहता हूं? और क्या होगा अगर सभी के पास अलग-अलग स्टोरेज इंजन (निर्दोष, आदि) हैं?
यनीस ड्रान

4

मान लें कि आप इस त्रुटि को हल करने के लिए phpmyadmin का उपयोग कर रहे हैं , इन चरणों का पालन करें:

  1. phpMyAdmin
  2. आपकी टेबल
  3. "संरचना टैब"
  4. अपने क्षेत्र के Collation को latin1_swedish_ci(या जो भी हो) से बदल देंutf8_general_ci

5
मान्य नहीं है, आप मान रहे हैं कि वह phpMyAdmin का उपयोग करता है।
शा।

काम नहीं करता है ...... और
टकराव

@OlorunfemiAjibulu हाँ, आप इसे "संरचना" में भी बदल सकते हैं। यहाँ कुछ लोगों के लिए, यह काम किया
तेओ मिहिला

@TeoMihaila शायद, यह संस्करण है।
ओलरुन्फेमी अजिबुलु

3

यह ज्यादातर कुछ यूनिकोड वर्णों के कारण होता है। मेरे मामले में यह रुपया मुद्रा प्रतीक था।

इसे जल्दी ठीक करने के लिए, मुझे इस त्रुटि के कारण चरित्र को स्पॉट करना पड़ा। मैंने vi जैसे पाठ संपादक में पूरे पाठ को कॉपी किया और एक पाठ के साथ परेशान चरित्र को बदल दिया।


3
ओपी ने उल्लेख किया कि एक हजार रिकॉर्ड डाले जा रहे हैं ....
गेलि एन

3

मुझे अपने PLAY Java एप्लिकेशन के साथ यह समस्या थी। यह उस अपवाद के लिए मेरा स्टैक ट्रेस है:

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

मैं io.Ebean का उपयोग करके एक रिकॉर्ड सहेजने की कोशिश कर रहा था। मैंने utf8mb4 कोलेशन के साथ अपना डेटाबेस बनाकर इसे फिर से निर्धारित किया, और सभी टेबल बनाने के लिए फिर से प्ले इवोल्यूशन लागू किया ताकि सभी टेबल्स को utf-8 कॉलेशन के साथ फिर से बनाया जाए।

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

मैं केवल परिवर्तन केवल एक क्षेत्र के लिए लागू करना चाहता हूं, आप क्षेत्र को क्रमबद्ध करने का प्रयास कर सकते हैं

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end

2

यदि आप एक नया MySQL टेबल बना रहे हैं, तो आप निर्माण पर सभी कॉलमों के चारसेट को निर्दिष्ट कर सकते हैं, और इसने मेरे लिए समस्या को ठीक कर दिया है।

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

आप अधिक विवरण पढ़ सकते हैं: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html


2

यह सिफारिश समाधान नहीं है .. लेकिन साझा करने के लिए लायक है। चूंकि मेरा प्रोजेक्ट पुराने मैसूर से DBMS को नए (8) में अपग्रेड कर रहा है। लेकिन मैं तालिका संरचना को बदल नहीं सकता, केवल DBMS कॉन्फिगर (mysql)। Mysql सर्वर के लिए समाधान।

mysql config खोज के लिए Windows mysql 8.0.15 पर परीक्षण करें

एसक्यूएल मोड = "....."

इसे अनफॉलो करें। या मेरे मामले में सिर्फ टाइप करें / जोड़ें

एसक्यूएल मोड = "NO_ENGINE_SUBSTITUTION"

अनुशंसित समाधान क्यों नहीं। क्योंकि अगर आप latin1 (मेरा मामला) का उपयोग करते हैं .. डेटा क्रमिक रूप से सम्मिलित करता है, लेकिन सामग्री नहीं (mysql त्रुटि के साथ प्रतिक्रिया नहीं करता है !!)। उदाहरण के लिए आप इस तरह की जानकारी टाइप करते हैं

bla \ x12

इसे बचाओ

bla [] (बॉक्स)

ठीक है .. मेरी समस्या के लिए .. मैं फ़ील्ड को UTF8 में बदल सकता हूँ .. लेकिन छोटी समस्या है .. अन्य समाधान के बारे में उपरोक्त उत्तर देखें क्योंकि शब्द डाला नहीं गया है क्योंकि इसमें 2 से अधिक बाइट्स (cmiiw) हैं .. यह समाधान आपके सम्मिलित डेटा को बॉक्स बनाते हैं। उचित ब्लॉब का उपयोग करना है .. और आप मेरे उत्तर को छोड़ सकते हैं।

इससे संबंधित एक और परीक्षण था .. बचाने से पहले अपने कोड पर utf8_encode का उपयोग करना । मैं latin1 पर उपयोग करता हूं और यह सफलता थी (मैं sql-mode का उपयोग नहीं कर रहा हूं )! base64_encode का उपयोग करके उपरोक्त उत्तर के समान ।

मेरा सुझाव आपकी तालिका की आवश्यकता को पूरा करने और अन्य प्रारूप से UTF8 में बदलने का प्रयास किया


मेरी सेटिंग में (Oracle परियोजना), मैं बदलकर sql-mode = "NO_ENGINE_SUBSTITUTION" हो गया। यह काम कर रहा है।
तासीनो मोरिस सिल्वा


1

आपको मेटा html में utf8mb4 सेट करने की आवश्यकता है और अपने सर्वर में भी tabel को बदलें और utf8mb4 को कोलाज सेट करें


1

संकेत: AWS RDS पर आपको अपने MySQL DB के लिए एक नए पैरामीटर समूह की आवश्यकता है जिसमें params (एक my.cf संपादन के बजाय) है

  • 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
  • character_set_results: utf8mb4
  • character_set_server: utf8mb4

नोट: character_set_system रहता है "utf8"

ये SQL कमांड्स नियमित रूप से काम नहीं करते हैं - केवल एक सत्र में:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

मुझे डेटाबेस के सभी संग्रहीत कार्यविधियों (और फ़ंक्शंस) को भी ड्रॉप और री-क्रिएट करना पड़ा, ताकि वे utf8mb4 के नए कैरेक्टर सेट के भीतर निष्पादित हों।

Daud:

SHOW PROCEDURE STATUS;

... यह देखने के लिए कि कौन सी प्रक्रियाएँ सर्वर के नए character_set_client, collation_connection और डेटाबेस Collation मानों में अपडेट नहीं की गई हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.