Python MySQL UTF-8编码因执行顺序而异

时间:2012-11-12 20:57:29

标签: python mysql

我最近继承了一个python项目,我有一些我很难解释的行为。

代码有两个部分,它可以将文件导入数据库,也可以将数据库转储到输出文件。导入看起来像这样:

def importStuff(self):
    mysqlimport_args = ['mysqlimport', '--host='+self.host, '--user='+self.username, '--password='+self.password, '--fields-terminated-by=|', '--lines-terminated-by=\n', '--replace', '--local', self.database, filename, '-v']
    output = check_output(mysqlimport_args)

转储看起来像这样:

def getStuff(self):
    db = MySQLdb.connect(self.host, self.username, self.password, self.database)
    cursor = db.cursor()
    sql = 'SELECT somestuff'
    cursor.execute(sql)
    records = cursor.fetchall()
    cursor.close()
    db.close()
    return records

def toCsv(self, records, csvfile):
    f = open(csvfile, 'wb')
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerow(['StuffId'])
    count = 1
    for record in records:
        writer.writerow([record[0]])

    f.close()

好吧,不是你见过的最漂亮的蟒蛇(风格评论欢迎,因为我喜欢了解更多),但这似乎是合理的。

但是,我收到消费者的抱怨,我的输出不是UTF-8(mysql表顺便使用utf8编码)。这是我迷路的地方,如果程序执行如下:

importStuff(...)

getStuff(...)

toCsv(...)

然后输出文件看起来不是有效的utf-8。当我将执行分为两个不同的步骤时

importStuff(...)

然后在另一个文件

getStuff(...)

toCsv(...)

突然我的输出显示为有效的utf-8。除了我有一个解决方案的事实,我似乎无法解释这种行为。任何人都可以解释我在这里做错了什么吗?或者是否有更多我可以提供的信息可以澄清正在发生的事情?

感谢。

(如果是因素,则为python 2.7)

编辑:根据要求提供更多代码。我做了一些小调整来保护像我公司这样的无辜者,但这或多或少都在这里:

def main():

    dbutil = DbUtil(config.DB_HOST, config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD)
    if(args.import):
        logger.info('Option: --import')

        try:
            dbutil.mysqlimport(AcConfig.DB_FUND_TABLE)
        except Exception, e:
            logger.warn("Error occured at mysqlimport. Error is %s" % (e.message))

    if(args.db2csv):
        try:
            logger.info('Option: --db2csv')
            records = dbutil.getStuff()
            fileutil.toCsv(records, csvfile)
        except Exception, e:
            logger.warn("Error Occured at db2csv. Message:%s" %(e.message))

main()

就是这样。它真的很短,这使得这个不太明显。

输出我不确定如何忠实地表示,它看起来像这样:

"F0NR006F8F"

它们看起来像或多或少的ASCII字符给我,所以我不确定他们可以创建什么问题。也许我正在从错误的角度接近这个,我目前依赖于我的文本编辑器对文件编码的最佳猜测。我不知道如何最好地检测哪个字符导致它停止读取我的文件as utf-8。

1 个答案:

答案 0 :(得分:0)

有史以来最愚蠢的回答。输入数据不是UTF-8。有人通过编写另一个将定期调用以将非utf-8字符转换为utf-8的sproc来解决这个问题。在我将代码分成两个文件并单独运行的时候,工作就开始了。它碰巧以这种方式运行4-5次我试过它导致我的错误结论。我现在正在改变读取过程以适应非utf-8输入源,因此我没有隐藏在系统中的怪异竞争条件。很抱歉带领大家一起来这个goosechase。