2012-01-03 21 views
35

फेंकता है मैं निम्न ट्वीट को एक लंबे टेक्स्ट कॉलम/utf8 charset/MySQL 5.5 में संग्रहीत करने का प्रयास कर रहा हूं। MyISAM स्टोरेज के साथ डेटाबेस।MySQL गलत स्ट्रिंग मान त्रुटि

हमने utf8mb4, utf16, utf32 charsets भी कोशिश की लेकिन इस समस्या को दूर करने में असमर्थ हैं।

tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting dep 
ressed. #foreveralone ?" lol yes 

mysql> ALTER DATABASE foo CHARACTER SET utf8 COLLATE utf8_bin; 

mysql> show variables like 'char%'; 
+--------------------------+-------------------------------------------+ 
| Variable_name | Value | 
+--------------------------+-------------------------------------------+ 
| character_set_client | utf8 | 
| character_set_connection | utf8 | 
| character_set_database | utf8 | 
| character_set_filesystem | binary | 
| character_set_results | utf8 | 
| character_set_server | latin1 | 
| character_set_system | utf8 | 
| character_sets_dir | /rdsdbbin/mysql-5.5.12.R1/share/charsets/ | 

Incorrect string value: '\xF0\x9F\x98\x94\xE2\x80...' for column 'tweet' at row 1 

Unable to store tweet "@Dorable_Dimples: Okay enough of those #IfYouWereM 
ines I'm getting depressed. #foreveralone ?" lol yes 
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCExcept 
ion: could not insert 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana 
gerImpl.java:1387) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana 
gerImpl.java:1315) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana 
gerImpl.java:1321) 
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityMana 
gerImpl.java:843) 
at java.util.TimerThread.mainLoop(Timer.java:512) 
at java.util.TimerThread.run(Timer.java:462) 

at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(
SQLStateConverter.java:140) 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.ja 
va:128) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelpe 
r.java:66) 
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(Abstra 
ctReturningDelegate.java:64) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(Abstract 
EntityPersister.java:2345) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(Abstract 
EntityPersister.java:2852) 
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentity 
InsertAction.java:71) 
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplica 
te(AbstractSaveEventListener.java:320) 
at org.hibernate.event.def.AbstractSaveEventListener.performSave(Abstract 
SaveEventListener.java:203) 
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(
AbstractSaveEventListener.java:129) 
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(E 
JB3PersistEventListener.java:69) 
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(
DefaultPersistEventListener.java:179) 
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultP 
ersistEventListener.java:135) 
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultP 
ersistEventListener.java:61) 
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) 
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) 
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) 
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityMana 
gerImpl.java:837) 
... 5 more 
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x94\xE2\x 
80...' for column 'tweet' at row 1 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.jav 
a:2127) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 
2427) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 
2345) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 
2330) 
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAnd 
Extract(IdentityGenerator.java:94) 
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(Abstra 
ctReturningDelegate.java:57) 
+4

क्या आप अपनी प्रश्नोत्तरी को कम कर सकते हैं कृपया प्रासंगिक जानकारी के लिए estion? –

+4

मुझे लगता है कि समस्या प्रदान करने वाली जानकारी प्रदान की गई है, यह सुनिश्चित नहीं है कि मैं क्या कम कर सकता हूं। क्या यह जानकारी प्रदान करने के लिए समझदारी नहीं है जो इस मुद्दे को हल करने के लिए आवश्यक हो सकता है। यदि नहीं, तो दूसरों वापस आते हैं और पूरी जानकारी मांगते हैं। – priya

+1

सम्मिलित कथन कैसे दिखता है? क्या आप इसे सामान्य mysql लॉग से प्राप्त कर सकते हैं? –

उत्तर

1

क्यों आप अपने उदाहरण में उद्धरण के बाहर पाठ की क्या ज़रूरत है - यानी 'lol हाँ'

tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting depressed. #foreveralone ?" lol yes 
+1

उपरोक्त संदेश इस ट्वीट से मेल खाता है - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya

+0

अजीब हिस्सा है कि हम अपने ब्राउज़र में संदेश के अंत में एक स्क्वायर बॉक्स देखते हैं और हम twitter4j API का उपयोग करके इन मानों को प्राप्त करते हैं – priya

56

यह ट्वीट जिससे समस्या हो रही के अंत में चरित्र है।

ऐसा लगता है कि यह 'इमोजी' चरित्र उर्फ ​​जापानी स्माइली चेहरे जैसा दिखता है लेकिन यह क्रोम या सफारी में मेरे लिए प्रदर्शित नहीं हो रहा है।

MySQL के कुछ संस्करणों में 4byte utf वर्णों को संग्रहीत करने वाले ज्ञात समस्याएं हैं। जाहिर है आप, 4 बाइट UTF केरेक्टर को अभिव्यक्त करने के रूप में सामान्य UTF8 वर्ण सेट केवल लंबाई में 3 बाइट तक केरेक्टर को अभिव्यक्त कर सकते हैं utf8mb4 का उपयोग करना चाहिए और इतने चरित्र जो Basic Multilingual Plane

http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

के बाहर हैं संग्रहीत नहीं कर सकता जो मेरे लिए ख़बर है क्योंकि इसका मूल रूप से मतलब है कि MySQL में utf8 डेटाटाइप वास्तव में उचित utf8 नहीं है। । - अगर आप

"यह भी सुनिश्चित करें अपने अनुप्रयोग परत अपने डेटाबेस कनेक्शन 'चरित्र utf8mb4 करने के लिए सेट सेट बनाने की अच्छी तरह जांच यह वास्तव में क्या हो रहा है:

यह कैसे यहाँ How to insert utf-8 mb4 character(emoji in ios5) in mysql? सहित संभाल करने के सुझाव हैं आपके चुने हुए फ्रेमवर्क की mysql क्लाइंट लाइब्रेरी का पुराना संस्करण चला रहा है, हो सकता है कि इसे utf8mb4 समर्थन से संकलित नहीं किया गया हो और यह वर्णमाला को ठीक से सेट नहीं करेगा। यदि नहीं, तो आपको इसे अपडेट करना होगा या इसे स्वयं संकलित करना पड़ सकता है "

यदि आप कनेक्टर/जे का उपयोग कर रहे हैं आपको कनेक्शन कॉन्फ़िगरेशन में character_set_server = utf8mb4 सेट करने की आवश्यकता है।

आपके सभी वर्ण सेट utf8mb4 होना चाहिए, जिसे आपने आजमाया है लेकिन वर्तमान में सेट नहीं है।

7

मुझे दानस्क 57 के उत्तर पसंद हैं - यह सही है और इसे करने का 'सही' तरीका है। (मैंने इसे स्वयं वोट दिया)

हालांकि, एक और त्वरित और गंदा समाधान स्कीमा को बदलना है। ट्वीट स्ट्रिंग स्टोर करने के लिए एक varbinary या बाइनरी का उपयोग करें:

http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html

उल्टा कि आप किसी भी वर्ण सेट समस्याओं नहीं मिलेगा है।

नकारात्मकता यह है कि आपकी स्ट्रिंग तुलना और सॉर्टिंग खो जाएगी, और आप कॉलम को पूर्ण पाठ अनुक्रमणिका में सक्षम नहीं होंगे।

बस एक सुझाव है, लेकिन यह 'सही' उत्तर नहीं है, केवल एक त्वरित और गंदे समाधान है जो चीजों को काम करता है।

-1

समस्या स्ट्रिंग "@" में है। एक विशेष चरित्र की तरह इंजन डेटाबेस दुभाषिया। मैं करता हूँ:

tweet="Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting dep 

ressed। ? #foreveralone "lol हाँ

5

मैं इस सटीक मुद्दा था हल करने के लिए, mysql सर्वर साइड पर डिफ़ॉल्ट एन्कोडिंग को बदलने इस उत्कृष्ट गाइड निम्नलिखित utf8mb4 रहे हैं:।। http://mathiasbynens.be/notes/mysql-utf8mb4

परिवर्तन करने के बाद अपने mysqld सेवा को पुनः आरंभ करने याद रखें विन्यास फाइल करने के लिए।

मेरे लिए, मैं भी संस्करण 5.1.18 (संस्करण 5.1.6 से) के लिए mysql JDBC ड्राइवर को अपडेट करने की जरूरत है। मैंने कहीं पढ़ा है कि आप के लिए कम से कम संस्करण 5.1.14 का उपयोग करना चाहिए mysql jdbc ड्राइवर utf8mb4 वर्ण एन्कोडिंग के साथ अच्छी तरह से खेलने के लिए। उम्मीद है कि यह मदद करता है!

संबंधित मुद्दे