Python & MySql: 유니코드 및 인코딩
json data를 파싱하고 json data의 일부를 mysql database에 저장하려고 합니다.현재 유니코드 오류가 발생하고 있습니다.제 질문은 제가 이 일을 어떻게 처리해야 하느냐 입니다.
- 데이터베이스 측면에서 처리해야 하며, 그렇다면 테이블을 어떻게 수정해야 합니까?
- 파이썬 쪽에서 처리해야 하나요?
여기 제 테이블 구조가 있습니다.
CREATE TABLE yahoo_questions (
question_id varchar(40) NOT NULL,
question_subj varbinary(255),
question_content varbinary(255),
question_userId varchar(40) NOT NULL,
question_timestamp varchar(40),
category_id varbinary(20) NOT NULL,
category_name varchar(40) NOT NULL,
choosen_answer varbinary(255),
choosen_userId varchar(40),
choosen_usernick varchar(40),
choosen_ans_timestamp varchar(40),
UNIQUE (question_id)
);
파이썬 코드를 통해 삽입하는 중 오류 발생:
Traceback (most recent call last):
File "YahooQueryData.py", line 78, in <module>
+"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (row[2], row[5], row[6], quserId, questionTime, categoryId, categoryName, qChosenAnswer, choosenUserId, choosenNickName, choosenTimeStamp))
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/connections.py", line 264, in literal
return self.escape(o, self.encoders)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/connections.py", line 202, in unicode_literal
return db.literal(u.encode(unicode_literal.charset))
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 204-230: ordinal not in range(256)
파이썬 코드 세그먼트:
#pushing user id to the url to get full json stack
urlobject = urllib.urlopen(base_url.format(row[2]))
qnadatajson = urlobject.read()
data = json.loads(qnadatajson)
cur.execute("INSERT INTO yahoo_questions (question_id, question_subj, question_content, question_userId, question_timestamp,"
+"category_id, category_name, choosen_answer, choosen_userId, choosen_usernick, choosen_ans_timestamp)"
+"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (row[2], row[5], row[6], quserId, questionTime, categoryId, categoryName, qChosenAnswer, choosenUserId, choosenNickName, choosenTimeStamp))
json 구조
questions: [
{
Id: "20111201185322AA5HTDc",
Subject: "what are the new pokemon call?",
Content: "I used to know them I stop at dialga and palkia version and I heard there's new ones what's it call
",
Date: "2011-12-01 18:53:22",
Timestamp: "1322794402",
쿼리를 실행하기 전에 수행한 작업을 다음과 같이 실행합니다.mysql SET character_set_client = utf8
그리고 mysql 변수는 다음과 같습니다.
mysql> SHOW variables LIKE '%character_set%';
+--------------------------+--------------------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.5.10-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)
당신의 MYSQLdb python 라이브러리는 utf8로 인코딩해야 한다는 것을 모르고 기본 python system 정의 charset으로 인코딩하고 있다고 생각합니다.latin1
.
당신이connect()
데이터베이스에 전달합니다.charset='utf8'
매개 변수.이것은 또한 매뉴얼을 만들어야 합니다.SET NAMES
아니면SET character_set_client
불요불급의
먼저 MySQL을 연결할 때 와 매개변수를 할당하는지 확인합니다.
conn = mysql.connect(host='127.0.0.1',
user='user',
passwd='passwd',
db='db',
charset='utf8',
use_unicode=True)
둘째, 데이터베이스를 실제로 조회할 때 준비된 문을 사용합니다.아래는 유니코드 문자를 포함하는 문자열의 INSERT 쿼리 예입니다.
cursor.execute('INSERT INTO mytable VALUES (null, %s)',
('Some string that contains unicode: ' + unichr(300),))
여전히 같은 문제에 직면해 있지만,
당신의 mysql-python-connector 버전을 다운그레이드 해보세요. 이것은 저를 위한 일입니다.
mysql-connector-python==8.0.30을 mysql-connector-python==8.0.28로 변경합니다.
알았어요,
pip uninstall mysql-connector-python==8.0.30
pip install mysql-connector-python==8.0.28
언급URL : https://stackoverflow.com/questions/8365660/python-mysql-unicode-and-encoding
'programing' 카테고리의 다른 글
Mysql MariaDB가 원격 연결에서 작동하지 않습니다. (0) | 2023.10.14 |
---|---|
mysql, alter column remove primary key and auto increment (0) | 2023.10.14 |
문서에 대한 요소의 위치 찾기 (0) | 2023.10.14 |
자바스크립트를 이용하여 서버에 이미지가 존재하는지 확인? (0) | 2023.10.09 |
부동 소수점의 가변 수를 인쇄 (0) | 2023.10.09 |