2017-10-18 6 views
0

파이썬 mysql 연결 모듈을 사용하여 유니 코드 문자 점 128049 (U + 1F431)를 mariaDB sql 테이블에 삽입하고 있습니다.잘못된 문자열 값 오류 - Python + mariaDB

은 내 SQL 테이블은 다음과 같이 정의된다 :

show create table t1; 

CREATE TABLE `t1` (
`c1` varchar(20) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 

그리고 파이썬 코드는 다음과 같습니다이 이후

import mysql.connector as db 
conn = db.connect(sql_mode = 'STRICT_ALL_TABLES') 
curs = conn.cursor(prepared = True) 
curs.execute('insert into t1 (c1) values(%)', chr(128049)) 

는 4 바이트를 필요로하는 plane 1 unicode value이지만, 테이블 및 열을 변경하면 as suggested here을 utf8mb4하기 작동하지 않았다.

내가 갖는 오류 : 삽입되는

Incorrect string value: '\xF0\x9F\x90\xB1' for column 'c1' at row 1 

문자열이 올바른 모습에 비해 :

chr(128049).encode('utf-8') 

mariadb이 버전의 sql_mode는 기본적으로 엄격한되지 않습니다. 엄격 모드를 지정하지 않으면 삽입이 작동하는 동안 문자는 기본값 '?'으로 변환됩니다. 캐릭터.

SQL이 잘못된 문자열이라고 생각하는 이유를 알 수 없습니다.

파이썬 3.6.1에서 mysql-connector 2.1.4를 통해 mariadb 10.1.9에 연결 중입니다.

답변

1

연결에 utf8mb4를 지정해야합니다. 또는 SET NAMES utf8mb4. 이것은 클라이언트 바이트의 인코딩을 지정하는 것입니다.

은 4 바이트 이모티콘입니다.

더 파이썬 팁 : http://mysql.rjweb.org/doc.php/charcoll#python

0

릭 제임스의 대답은 올바른 것입니다. 그로부터 저를 위해 일한 솔루션을 만들 수있었습니다.

SET NAMES 'utf8mb4'; 

3 개의 전역 변수를 seen here으로 설정합니다. 유일한 문제는 세션 변수 만 설정하므로 모든 연결에 대해이 명령을 실행해야합니다.

my.cnf 파일의 mysqld 그룹에 3 가지 변수를 설정할 수있는 것으로 보이지 않습니다. (이것은 명령 행에서 설정할 수 없기 때문에 가능합니다.) 정의에 누락 된 명령 행 세부 사항을 기록하십시오 here)

대신 my.cnf 옵션 파일의 mysqld 그룹에 init_file 옵션을 설정합니다. 이 전 세계적으로 같은 값으로 세션 변수를 강제로 설정

set @@global.character_set_client='utf8mb4'; 
set @@global.character_set_connection='utf8mb4'; 
set @@global.character_set_results='utf8mb4'; 

: 해당 파일 내에서

[mysqld] 
init_file=/path/to/file.sql 

나는 3 개 변수를 설정합니다. 문제 해결됨.