【问题标题】:Non-Unicode characters get changed to "????" when stored to MySQL database非 Unicode 字符更改为“??????”存储到 MySQL 数据库时
【发布时间】:2014-07-31 18:14:08
【问题描述】:

我正在围绕从 Twitter REST API 获取的推文创建一个 Web 应用程序。我面临一个问题,在 python 控制台中打印时,韩语、中文和其他亚洲语言等非 unicode 字符可以正确显示,但是当我将其存储到 SQL 数据库时,字符串值会更改为“????? ???”或类似的东西。

我正在使用 Twython 模块,这是我用于获取推文的代码,它工作正常,当我打印推文时,它会正确显示这些字符

from twython import Twython
import json
APP_KEY= 'abcdfefdags'
APP_SECRET = 'abcdefghdfa'
SEARCH_QUERY='russia'
SEARCH_COUNT= 3
twitter = Twython(APP_KEY, APP_SECRET, oauth_version=2)
ACCESS_TOKEN = twitter.obtain_access_token()
twitter1 = Twython(APP_KEY, access_token=ACCESS_TOKEN)

def getTweetQuery():
    return SEARCH_QUERY

def getTweetTextDict():
    tweetTempList = []
    data = []
    listOfTweets = dict()
    data = twitter1.search(q=SEARCH_QUERY, count=SEARCH_COUNT)  
    for x in range(0,SEARCH_COUNT):
        tweetData = dict()
        s = (data['statuses'][x]['text']) 
        tweetData['text'] = s
        s = (data['statuses'][x]['created_at'])
        tweetData['created_at'] = s
        s = (data['statuses'][x]['user']['name'])
        tweetData['name'] = s
        s = (data['statuses'][x]['user']['profile_image_url'])
        tweetData['profile_image_url'] = s
        listOfTweets[x] = tweetData
    return listOfTweets

这是我将它们存储到 SQL 数据库时的代码

import mysql.connector
from firstsite.website import twit
class SQLDataSystem:
    def insertNewTweets(self):
        cnx = mysql.connector.connect(user='djangouser', password='1234',
                              host='127.0.0.1',
                              database='django_db')

        cursor = cnx.cursor()                                                            
        dataPacket = twit.getTweetTextDict()

        dataPacketLength = len(dataPacket.keys())
        for x in range (0, dataPacketLength):
            tweet = dataPacket[x]['text']
            tweetTime = dataPacket[x]['created_at']
            twitterName = dataPacket[x]['name']
            twitterPicture = dataPacket[x]['profile_image_url']
            add_tweet = ("INSERT INTO website_tweets " +
                         "(tweet, tweetTime, twitterName, twitterPicture) "+
                         "VALUES (%s, %s, %s, %s)")
            arguments = (tweet, tweetTime, twitterName, twitterPicture)
            cursor.execute(add_tweet, arguments)
            cnx.commit()

当我通过

检查数据库时
SELECT * FROM website_tweets;

以及通过 Python 检索和打印它,这是一个可能已经说过的字符串 '@nytvideo @@KOREA:왜 이 테러리스트들은 구속하지 않나요?? 变成 '@nytvideo @@KOREA:? ? ?????? ??? ????? 我该如何解决这个问题?

【问题讨论】:

  • 使用不同的排序规则,支持这些字符的排序规则?
  • 您是否考虑过手动将字符编码为 ASCII,然后保存该字符串?
  • "手动将字符编码为 ASCII"?那句话没有意义。 ASCII 没有韩文字符的表示。这里可能的原因是数据库不支持字符(错误的排序规则,正如@RobertHarvey 已经指出的那样),字符串在 Python 中也没有存储为 unicode,SQL 框架不支持 unicode 字符串,或者这是字符串的输出,以验证其内容是否错误。有很多方法可能会出错。文字不易。
  • @LasseV.Karlsen 字符串在通过 SQL 之前会被正确打印出来

标签: python mysql sql unicode


【解决方案1】:

需要检查的三件事是:

  1. DB 排序规则 - 您需要它是 UTF8 而不是 Latin1 或其他东西。
  2. 在连接本身 - use_unicode=True
  3. 确保您的 unicode 字符串不会意外转换为普通字符串(格式化倾向于这样做)

【讨论】:

    【解决方案2】:

    问题不在于您的脚本,而在于数据库设置。 看看 http://dev.mysql.com/doc/refman/5.1/en/faqs-cjk.html#qandaitem-A-11-1-2

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2019-04-05
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2012-03-04
      • 2015-04-28
      • 2018-03-07
      • 2011-12-17
      相关资源
      最近更新 更多