Confluence 에 심각한 보안 취약점이 발견되었으니 사용자분들은 업그레이드 하세요.!
 
1
0
-1

라라벨에서 Mysql 인서트시에 아래와 같은 오류가 발생합니다.

혹시 도움이 될만한 정보가 있을까요?


# 문제상황

트위터에서 크롤링한 데이터를 인서트하는 과정에서 아래와 같은 에러메세지가 출력됩니다.

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE2\x80...' for column..

문제가 발생하는 문자는 브라우저 화면에서 “All  출력되고 라라벨 에러메세지에서는 �...  출력됨.


## mysql 로그

2018-11-21T09:34:01.347057Z 4 Execute insert into `tablename` (`field1`, `field2`, `field3`) values ('value1', 'value2', 'video themed \�...', 
2018-11-21T09:34:01.347680Z 4 Close stmt
2018-11-21T09:34:01.347844Z 4 Query ROLLBACK
2018-11-21T09:34:01.364405Z 4 Quit


## 환경정보1

Mysql 버젼은 5.7이고 VARIABLES 출력해보면 첨부한 이미지의 결과와 같습니다.

(사용한 쿼리: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';) )


# 환경정보2

my.cnf 파일에 설정된 내용은 다음과 같습니다.

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
open-files-limit=2048
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci


# 환경정보3

라라벨 config/database.php 파일에서 mysql 설정 상태는 아래와 같습니다.

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'modes' => [
'ONLY_FULL_GROUP_BY',
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ENGINE_SUBSTITUTION',
],
],
    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      자답 올립니당

      SHOW CREATE TABLE table_name; 쿼리로 테이블을 보니 
      ENGINE=MyISAM DEFAULT CHARSET=utf8

      와 같이 캐릭터셋이 utf8 이였네요, 아래의 쿼리로 테이블 캐릭터셋 변경 후 에러가 잡혔습니다.

      ALTER TABLE
      table_name
      CONVERT TO CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

      원인은 저장하려는 데이터(이모지콘)는 4바이트 인데 mysql utf8 은 3바이트 가변 자료형이라 발생한 문제로 파악되었다. utf8mb4는 4바이트 


        CommentAdd your comment...