2012-01-03 42 views
35

Tôi đang cố gắng lưu trữ tweet sau vào một cột dài/utf8 charset/MySQL 5.5. cơ sở dữ liệu với lưu trữ MyISAM trên.MySQL ném lỗi giá trị chuỗi không chính xác

Chúng tôi cũng đã thử các bộ ký tự utf8mb4, utf16, utf32 nhưng không thể vượt qua vấn đề này.

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

Bạn có thể giảm số lượng qu estion cho các thông tin liên quan, xin vui lòng? –

+4

Tôi đoán đã cung cấp thông tin phù hợp với vấn đề, không chắc chắn những gì tôi có thể giảm. Không thận trọng khi cung cấp thông tin có thể cần thiết để giải quyết vấn đề. Nếu không, những người khác quay lại và yêu cầu toàn bộ thông tin. – priya

+1

Câu lệnh chèn trông như thế nào? Bạn có thể lấy nó từ nhật ký mysql chung không? –

Trả lời

1

Tại sao bạn có văn bản bên ngoài của dấu ngoặc kép trong ví dụ của bạn - ví dụ: 'lol yes'

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

Thông báo trên tương ứng với tweet này - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya

+0

Phần lạ là chúng ta thấy một ô vuông ở cuối thư trong trình duyệt của chúng tôi và chúng tôi tìm nạp các giá trị này bằng cách sử dụng API twitter4j – priya

56

Đó là nhân vật ở phần cuối của tweet đó là gây ra vấn đề.

Có vẻ như một ký tự 'biểu tượng cảm xúc' có tên là mặt cười Nhật Bản nhưng nó không hiển thị cho tôi trong Chrome hoặc Safari.

Có các sự cố đã biết lưu trữ các ký tự utby 4 byte trong một số phiên bản của MySQL. Rõ ràng bạn phải sử dụng utf8mb4 để đại diện cho 4 ký tự UTF byte, như bình thường bộ ký tự utf8 chỉ có thể đại diện cho nhân vật lên đến 3 byte chiều dài và do đó không thể lưu trữ nhân vật đó nằm ngoài Basic Multilingual Plane

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

Đó là tin tức đối với tôi vì nó về cơ bản có nghĩa là kiểu dữ liệu utf8 trong MySQL không thực sự đúng utf8.

Có ý kiến ​​cho về cách xử lý này đây How to insert utf-8 mb4 character(emoji in ios5) in mysql? bao gồm:

"Ngoài ra hãy chắc chắn lớp ứng dụng của bạn đặt nhân vật kết nối cơ sở dữ liệu của nó thiết lập để utf8mb4 đúp kiểm tra điều này thực sự xảy ra - nếu bạn. chạy một phiên bản cũ hơn của thư viện khách hàng mysql của khung công tác đã chọn của bạn, nó có thể chưa được biên dịch với hỗ trợ utf8mb4 và nó sẽ không đặt bộ ký tự đúng cách. Nếu không, bạn có thể phải tự cập nhật hoặc biên dịch nó "

Nếu bạn đang sử dụng Connector/J bạn cần phải đặt character_set_server = utf8mb4 trong cấu hình kết nối.

Tất cả các bộ ký tự của bạn phải là utf8mb4, có thể bạn đã thử nhưng hiện chưa được đặt.

7

Tôi thích câu trả lời của Danask57 - đó là chính xác và cách 'đúng' để thực hiện. (Tôi tự mình bình chọn)

Tuy nhiên, một giải pháp nhanh chóng và bẩn khác là thay đổi lược đồ. sử dụng một varbinary hoặc nhị phân để lưu trữ các chuỗi tweet:

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

Ngược ở đây là bạn sẽ không nhận được bất kỳ vấn đề bộ ký tự.

Nhược điểm là việc so sánh chuỗi và sắp xếp chuỗi của bạn sẽ bị mất và bạn sẽ không thể lập chỉ mục toàn văn cho cột.

Chỉ là một gợi ý, nhưng đây không phải là câu trả lời 'đúng', chỉ là một giải pháp nhanh chóng và bẩn thỉu giúp mọi thứ hoạt động.

-1

sự cố nằm trong chuỗi "@". cơ sở dữ liệu động cơ diễn giải như một ký tự đặc biệt. i do:

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

may mắn. ? #foreveralone" lol vâng

5

Tôi có vấn đề này chính xác Để giải quyết, thay đổi mã hóa mặc định trên phía máy chủ mysql để utf8mb4 theo hướng dẫn tuyệt vời này:.. http://mathiasbynens.be/notes/mysql-utf8mb4

Hãy nhớ khởi động lại dịch vụ mysqld của bạn sau khi thực hiện những thay đổi vào tập tin cấu hình

Đối với tôi, tôi cũng cần cập nhật trình điều khiển jdbc mysql lên phiên bản 5.1.18 (từ phiên bản 5.1.6) Tôi đã đọc ở đâu đó rằng bạn phải sử dụng ít nhất phiên bản 5.1.14 cho Trình điều khiển jdbc mysql để phát độc đáo với mã hóa ký tự utf8mb4. Hy vọng điều này sẽ giúp!

Các vấn đề liên quan