2016-11-04 2 views
0

문자열을 데이터베이스에 삽입하고 있지만 잘못된 문자열 바이트 시퀀스에 대해 MySQL 1366 오류가 발생합니다. 난 아직도 무엇을 놓치고Golang MySQL 1366 잘못된 문자열 값 오류

db, err = sql.Open("mysql", config.User+":"+config.Password+"@tcp("+config.Host+")/"+config.Database) 
if err != nil { 
    log.Fatal(err) 
} 

db.Exec("SET NAMES 'utf8mb4'; SET CHARACTER SET utf8mb4;") 

:

mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8mb4     | 
| character_set_connection | utf8mb4     | 
| character_set_database | utf8mb4     | 
| character_set_filesystem | binary      | 
| character_set_results | utf8mb4     | 
| character_set_server  | utf8mb4     | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

내 데이터베이스 연결 풀은 다음과 같습니다 : 아래 그림과 같이

2016/11/04 13:33:40 Error 1366: Incorrect string value: '\x89PNG\x0D\x0A...' for column 'text' at row 1 
2016/11/04 13:33:56 Error 1366: Incorrect string value: '\xB6\xEB\xE4\x0B\x92\xEE...' for column 'text' at row 1 
2016/11/04 13:33:56 Error 1366: Incorrect string value: '\xFF\xD8\xFF\xE0\x00\x10...' for column 'text' at row 1 
2016/11/04 13:34:35 Error 1366: Incorrect string value: '\x9C]\x91\xD1k\xC2...' for column 'text' at row 1 

내 MySQL의 설정은 utf8mb4 설정되어?

+0

나는 같은 문제가 있었는데 어떻게 든 제어 문자가 문자열에 도입되었다는 것을 알게되었습니다. (특히 웹 페이지의 입력 필드에 MS-Word의 _formatted_ 텍스트를 복사 할 때). 필자의 경우 해결책은 클라이언트 측에서 제어 문자를 필터링하는 것이 었습니다. – FDavidov

답변

1

이러한 문자는 유효한 UTF-8 문자열이 아닙니다. 그것들은 바이너리 데이터입니다 (첫 번째 파일은 PNG 파일입니다!). MySQL은 대소 문자를 구분하고 언어를 조합하는 것과 같은 UTF-8 관련 작업을 수행하므로 실제 이진 열에 저장해야합니다. (Go는 문자열에 UTF-8 인코딩을 적용하지 않으므로 Go는 불평하지 않습니다. 이동은 UTF-8을 사용하여 문자열 리터럴을 인코딩하지만 \x 이스케이프 시퀀스가이를 무시합니다. 물론 range, []rune 변환 및 다양한 패키지 문자열이 UTF-8이라고 가정합니다.

문자열이 utf8.ValidString() 인 유효한 시퀀스인지 확인할 수 있습니다.

0

이미지가 포함 된 열에 BLOB (아마 MEDIUMBLOB) 데이터 유형을 사용하십시오. TEXT을 사용하면 인코딩을 확인하게됩니다. PNG는 제대로 인코딩 된 utf8 문자를 포함하므로 오류가 발생합니다.

나머지 utf8mb4 사용법은 괜찮습니다.

관련 문제