programing

Python & MySql: 유니코드 및 인코딩

bestprogram 2023. 10. 14. 10:22

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