JDBC를 통해 MySQL에 UTF-8을 삽입하려고 할 때 "잘못된 문자열 값"?


228

이것은 내 연결이 설정된 방법입니다.
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

그리고 테이블에 행을 추가하려고 할 때 다음 오류가 발생합니다.
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

수천 개의 레코드를 삽입하고 있는데 텍스트에 \ xF0이 포함 된 경우 항상이 오류가 발생합니다 (즉, 잘못된 문자열 값은 항상 \ xF0으로 시작 함).

열 데이터 정렬은 utf8_general_ci입니다.

무엇이 문제 일 수 있습니까?


물결표가 붙은 라틴어 문자 N이 될 것입니다 (ñ).
andreszs

다른 사용자가이 문제를 겪을 수 있습니다. 데이터베이스에서 : ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - "생성 된 테이블"을 지금부터 해결합니다. EXIST 테이블에는 해당되지 않습니다. ALTER TABLE table_name 문자 세트로 변환 utf8mb4 COLLATE utf8mb4_unicode_ci; 출처 -digitalocean.com/community/questions/…
lingar

답변:


321

MySQL utf8은 UTF-8에서 3 바이트로 표현할 수있는 유니 코드 문자 만 허용합니다. 여기에는 4 바이트가 필요한 문자가 있습니다 : \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOLTIC LETTER SAUIL ).

MySQL 5.5 이상이있는 경우 열 인코딩을에서 utf8로 변경할 수 있습니다 utf8mb4. 이 인코딩을 사용하면 4 바이트를 차지하는 문자를 UTF-8로 저장할 수 있습니다.

MySQL 구성 파일에서 서버 속성 character_set_server을 로 설정해야 할 수도 있습니다 utf8mb4. 그렇지 않으면 Connector / J의 기본값은 3 바이트 유니 코드로 보입니다 .

예를 들어, 커넥터 / J와 4 바이트 UTF-8 문자 세트를 사용하여 MySQL 서버를 구성 character_set_server=utf8mb4하고 떠나 characterEncoding커넥터 / J 연결 문자열 부족합니다. 그러면 Connector / J가 UTF-8 설정을 자동 감지합니다.


151
utf8을 갖는 이상한 선택은 실제로 "3 바이트로 표현 될 수있는 UTF8의 부분 집합"을 의미합니다.
Eric J.

4
character_encoding_server유효한 MySQL 구성 변수 이름이 아닙니다. 나는 세트에 시도 character_set_serverutf8mb4개별 열뿐만 아니라, 대신,하지만 아무것도 변경하지 않았다.
Romain Paulus

20
# 각 데이터베이스마다 : ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # 각 테이블에 대해 : ALTER TABLE table_name CHARACTER SET로 변환 utf8mb4 COLLATE utf8mb4_unicode_ci; # 각 열에 대해 : ALTER TABLE table_name CHANGE column_name column_name VARCHAR (191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing

14
UTF-8이 UTF-8로 업데이트 될 때까지 UTF-8이 UTF-8이 아니라는 기괴한
Klors

3
따라서 3 바이트의 UTF-8이 작은 문자 N을 틸드 (ñ)와 함께 저장할 수 없으며 "España"의 철자를 정확히 입력하려면 4 바이트가 필요합니까? 정말? 이보다 비효율적 일 수 있습니까? AZ와 0-9 외에 3 바이트로 무엇을 저장할 수
있습니까

95

포함 된 문자열은 UTF-8을 사용하여 \xF0단순히 여러 바이트로 인코딩 된 문자 입니다.

데이터 정렬이 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입니다.
Lior

1
귀하의 앱이 Java로되어 있습니까? file-encodingUTF-8을 지정 하는 매개 변수로 Java를 호출 java -Dfile.encoding=UTF-8하거나 예를 들어 Tomcat 등의 구성 파일에 적절한 스위치를 추가하십시오.
Eric J.

1
"데이터베이스, 테이블 또는 열의 문자 인코딩이 다를 수 있습니다"에 중점을 두는 것이 좋습니다 . 그것이 가장 중요한 것입니다.
Gellie Ann

그런 후 열 CHARACTER SET의 utf8mb4 부씩의 utf8mb4_general_ci 변경 문자 집합을 utf8 COLLATE의 utf8_general_ci로뿐만 아니라 테이블을 변경해야합니다
Shobhit 샤르마

68

동일한 문제가 발생하여 데이터를 저장하려면 다음 utf8mb4을 확인해야합니다.

  1. character_set_client, character_set_connection, character_set_resultsare utf8mb4: character_set_clientcharacter_set_connection클라이언트가 명령문을 보내는 character_set_results문자 세트를 나타내며, 서버가 조회 결과를 클라이언트에 리턴하는 문자 세트를 나타냅니다. charset-connection을
    참조하십시오 .

  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. STOP을 지정 characterEncoding=UTF-8하고 characterSetResults=UTF-8JDBC를 커넥터에,이 우선합니다 원인 character_set_client, character_set_connection, character_set_resultsutf8

해결 방법 2 (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_resultsutf8mb4입니다. charset-connection
도 참조하십시오 .


3
포인트 3은 db, 테이블 및 필드 인코딩 변경과 관련하여 클린 처였습니다. 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
kbbucks 2018 년

포인트 3도 나를 위해 트릭을 수행했습니다. 테이블 인코딩은 이미 utf8mb4로 설정되었습니다.
Sir_Faenor

테이블 인코딩은 기본값입니다. 열 인코딩을 utf8mb4로 변경하면 충분합니다.
Rick James

두 번째 접근 방식은 선택적으로 사용해야합니다. 즉 SELECT쿼리에 절대 적용되지 않아야 합니다. set names utf8mb4; select ... from ...절대로 오류를 일으키지 않으며 ResultSet대신 ResultSet is from UPDATE. No Data.오류가 발생합니다.
베이스

솔루션 2, 그냥 파. 1 문의 양식을 통해 키릴 문자를 삽입하려고 할 때 도움이되었습니다.
Vadim Anisimov

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 데이터베이스 데이터베이스 문자 집합과 데이터 정렬 UTF-8로 변환

사용할 모든 DB를 업데이트하십시오. 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

모두 작동합니다


질문 : 마지막 ALTER TABLE 명령은 모든 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로 Base64.encode64(subject) 가져 오기 전후 에 db 변환 문자열을 base64로 저장하기 전에 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 ;

데이터베이스에서 변경하려는 테이블이 많은 경우 어떻게합니까? 모든 스토리지 엔진 (innodb 등)이 다른 경우 어떻게해야합니까?
Yannis Dran

4

phpmyadmin 을 사용 하여이 오류를 해결 한다고 가정하면 다음 단계를 수행하십시오.

  1. phpMyAdmin
  2. your_table
  3. "구조 탭"
  4. 필드의 데이터 정렬을 latin1_swedish_ci(또는 무엇이든)에서utf8_general_ci

5
유효하지 않습니다. phpMyAdmin을 사용한다고 가정합니다.
ShaH

작동하지 않습니다 ...... 그리고 데이터 정렬이 구조가 아닌 '작업'에서 변경되었습니다.
Olorunfemi Ajibulu

@OlorunfemiAjibulu 예, "구조"에서도 변경할 수 있습니다. 여기 어떤 사람들에게는 효과가있었습니다
Teo Mihaila

@TeoMihaila 아마도 버전입니다.
Olorunfemi Ajibulu

3

대부분 유니 코드 문자로 인해 발생합니다. 제 경우에는 루피 통화 기호였습니다.

이 문제를 빠르게 해결하기 위해이 오류를 일으키는 문자를 찾아야했습니다. vi와 같은 텍스트 편집기에서 전체 텍스트를 붙여 넣고 문제를 일으키는 문자를 텍스트로 바꿨습니다.


3
OP는 천 개의 레코드 가 삽입되고 있다고 언급했다 ....
Gellie Ann

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 데이터 정렬로 다시 작성하도록 모든 테이블을 다시 생성하기 위해 play evolution를 적용했습니다.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

한 필드에만 변경 사항을 적용하고 싶습니다. 필드를 직렬화 할 수 있습니다.

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end


2

추천 솔루션은 아닙니다. 그러나 공유 할 가치가 있습니다. 내 프로젝트는 DBMS를 이전 Mysql에서 최신 (8)로 업그레이드하기 때문에. 그러나 DBMS 구성 (mysql) 만 테이블 구조를 변경할 수 없습니다. mysql 서버를위한 솔루션.

에 테스트 윈도우 에는 mysql 8.0.15를 MySQL의에 구성 검색

sql-mode = "....."

주석 처리를 제거하십시오. 또는 제 경우에는 입력 / 추가하십시오.

sql-mode = "NO_ENGINE_SUBSTITUTION"

왜 솔루션을 권장하지 않습니까? latin1 (내 경우)을 사용하면 데이터가 성공적으로 삽입되지만 내용은 삽입되지 않습니다 (mysql이 오류로 응답하지 않습니다 !!). 예를 들어 다음과 같이 정보를 입력하십시오.

쏴 \ x12

그것은 저장

bla [] (상자)

.. 내 문제에 대해 .. 필드를 UTF8로 변경할 수 있습니다. 그러나 작은 문제가 있습니다 .. 2 바이트 (cmiiw) 이상을 포함하기 때문에 단어가 삽입되지 않기 때문에 다른 솔루션에 대한 위의 답변을 볼 수 없습니다. 솔루션은 삽입 데이터를 상자로 만듭니다. 합리적인 것은 얼룩을 사용하는 것입니다 .. 당신은 내 대답을 건너 뛸 수 있습니다.

이와 관련된 또 다른 테스트는 저장하기 전에 코드에서 utf8_encode 를 사용 하는 것입니다. latin1에서 사용하고 성공했습니다 ( sql-mode 사용하지 않습니다 )! base64_encode 사용하여 위의 답변과 동일합니다 .

테이블 요구 사항을 분석하고 다른 형식에서 UTF8로 변경하려고 제안했습니다.


settings.py (Django Project)에서 sql-mode = "NO_ENGINE_SUBSTITUTION"으로 변경했습니다. 작동합니다.
Taciano Morais Silva

1

내 솔루션은 열 유형을 varchar (255)에서 blob으로 변경하는 것입니다.


1

메타 HTML에서 utf8mb4를 설정하고 서버에서 tabel을 변경하고 데이터 정렬을 utf8mb4로 설정해야합니다.


1

힌트 : AWS RDS 에서는 my.cnf를 편집하는 대신 매개 변수가있는 MySQL DB에 대한 새로운 파라미터 그룹 이 필요합니다.

  • 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 내에서 실행되도록 모든 데이터베이스의 저장 프로 시저 (및 함수도)를 삭제하고 다시 만들어야했습니다.

운영:

SHOW PROCEDURE STATUS;

… 서버의 새로운 character_set_client, collation_connection 및 Database Collation 값으로 업데이트되지 않은 절차를 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.