当前位置: 首页 > 面试题库 >

Python&MySql:Unicode和编码

左劲
2023-03-14
问题内容

我正在解析json数据,并尝试将一些json数据存储到Mysql数据库中。我目前正在关注unicode错误。我的问题是我应该如何处理。

  • 我应该从数据库端处理它吗?如果是,该如何修改我的表呢?
  • 我应该从python端处理它吗?

这是我的表结构

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)
);

通过python代码插入时出错:

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)

Python代码段:

    #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系统定义的charset latin1

当您connect()进入数据库时​​,请传递charset='utf8'参数。这也应该使手册SET NAMESSET character_set_client不必要的。



 类似资料:
  • 问题内容: 我是Python的新手,所以如果问题太简单,请不要发火:) 我已经读过Python是从上到下执行的。 如果是这种情况,为什么程序会如下所示: 因此,从我所看到的来看,主要功能最后出现,其他功能堆叠在其顶部。 我说错了吗?如果不是,为什么不从上到下写主函数或函数定义? 编辑:我问为什么我不能这样做: 这不是自然秩序吗?因为它是从上到下执行的,所以您一直在底部添加内容。 问题答案: 该s的

  • 问题内容: 我试图在Python中将数据编码为JSON,但遇到了很多麻烦。我认为问题仅仅是误解。 我对Python相对较新,并且从未真正熟悉各种Python数据类型,所以这很可能使我感到困惑。 目前,我正在声明一个列表,遍历另一个列表,并将一个列表附加到另一个列表中: 所以我要么: 我不懂JSON语法 我不了解Pythons JSON模块 我使用了不合适的数据类型。 问题答案: Python转换为

  • 本文向大家介绍使用Python xdrlib编码和解码XDR数据,包括了使用Python xdrlib编码和解码XDR数据的使用技巧和注意事项,需要的朋友参考一下 外部数据表示(XDR)的编码器和解码器。当我们在不同的外部源之间传输数据时,这是常用的格式。它对于创建和传输复杂的数据结构很有用。XDR提供与OSI表示层关联的服务。 在下面的程序中,我们看到如何使用xdrlib模块打包和解压缩数据。

  • 本文向大家介绍详解Python当中的字符串和编码,包括了详解Python当中的字符串和编码的使用技巧和注意事项,需要的朋友参考一下 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数

  • 问题内容: 如何在Python中以36为底的整数进行编码,然后再次对其进行解码? 问题答案: 您是否尝试过Wikipedia的示例代码?

  • 问题内容: 我正在用python做一些脚本。我创建一个保存在文件中的字符串。这个字符串有很多数据,来自目录的树状结构和文件名。根据convmv的介绍,我所有的树状结构都是UTF-8。 我想将所有内容都保留在UTF-8中,因为之后我将其保存在MySQL中。现在,在UTF-8的MySQL中,我遇到了一些字符问题(例如é或è-我是法语)。 我希望python始终将字符串用作UTF-8。我在互联网上阅读了