prosource

MySQL에서 잘못된 문자열 값 오류가 발생함

probook 2023. 9. 5. 20:37
반응형

MySQL에서 잘못된 문자열 값 오류가 발생함

다음 트윗을 MyISAM 저장소가 있는 긴 텍스트 열 / utf8 charset / MySQL 5.5. 데이터베이스에 저장하려고 합니다.

우리는 또한 utf8mb4, utf16, utf32 문자 집합을 시도했지만 이 문제를 해결할 수 없습니다.

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)

문제를 일으키는 것은 트윗 끝에 있는 캐릭터입니다.

일본의 웃는 얼굴인 '에모지' 캐릭터처럼 보이지만 크롬이나 사파리에서는 표시되지 않습니다.

MySQL 일부 버전에는 4바이트 UTF 문자를 저장하는 것으로 알려진 문제가 있습니다.일반 utf8 문자 집합은 최대 3바이트의 문자만 나타낼 수 있으므로 기본 다국어 평면 외부에 있는 문자를 저장할 수 없기 때문에 4바이트의 UTF 문자를 나타내려면 utf8mb4를 사용해야 합니다.

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

이것은 기본적으로 MySQL의 utf8 데이터 유형이 실제로는 적절한 utf8이 아니라는 것을 의미하기 때문에 저에게 새로운 소식입니다.

이를 처리하는 방법에 대한 제안이 있습니다. mysql에 utf-8 mb4 문자(ios5에 이모지)를 삽입하는 방법은 무엇입니까?다음을 포함합니다.

"또한 애플리케이션 계층에서 데이터베이스 연결의 문자 집합을 utf8mb4로 설정해야 합니다.선택한 프레임워크의 mysql 클라이언트 라이브러리의 이전 버전을 실행 중인 경우 utf8mb4 지원으로 컴파일되지 않았을 수 있으며 문자 집합이 제대로 설정되지 않을 수 있습니다.그렇지 않은 경우 업데이트하거나 직접 컴파일해야 할 수도 있습니다."

Connector/J를 사용하는 경우 연결 구성에서 character_set_server=utf8mb4를 설정해야 합니다.

모든 문자 집합은 시도했지만 현재 설정되지 않은 utf8mb4여야 합니다.

저는 Danask57의 답을 좋아합니다 - 그것은 정확하고 그것을 하는 '올바른' 방법입니다. (제가 직접 투표했습니다)

그러나 또 다른 빠르고 더러운 해결책은 스키마를 변경하는 것입니다.varbinary 또는 binary를 사용하여 트윗 문자열을 저장합니다.

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

장점은 캐릭터 세트 문제가 발생하지 않는다는 것입니다.

단점은 문자열 비교 및 정렬이 손실되고 열을 전체 텍스트 색인화할 수 없다는 것입니다.

단지 제안일 뿐이지만, 이것은 '올바른' 답이 아닙니다. 단지 일을 진행시키는 빠르고 더러운 해결책일 뿐입니다.

저는 이 정확한 문제를 가지고 있었습니다.문제를 해결하려면 http://mathiasbynens.be/notes/mysql-utf8mb4 의 우수한 안내에 따라 mysql 서버 측의 기본 인코딩을 utf8mb4로 변경합니다.

구성 파일을 변경한 후 mysqld 서비스를 다시 시작해야 합니다.

또한 mysql jdbc 드라이버를 버전 5.1.18(버전 5.1.6)로 업데이트해야 했습니다.utf8mb4 문자 인코딩으로 잘 재생하려면 mysql jdbc 드라이버가 최소한 버전 5.1.14를 사용해야 한다는 것을 어디선가 읽었습니다.이것이 도움이 되길 바랍니다!

예제의 따옴표 밖에 텍스트가 있는 이유는 무엇입니까? - 즉, 'lol yes'입니다.

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

문제가 문자열 "@"에 있습니다. 엔진 데이터베이스는 특수 문자처럼 해석됩니다.합니다:

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

스트레스를 받았어요. #혼자서?" ㅋㅋ 네.

언급URL : https://stackoverflow.com/questions/8709892/mysql-throws-incorrect-string-value-error

반응형