2012-04-23 52 views
0

我目前正在處理CSV文件和mySQL數據庫之間的數據格式。我正在使用MySQLdb庫來管理連接,但它似乎與格式有關的一些問題。我不得不承認,我在mySQL或者Python方面都不是很有經驗,但是在實踐中,大多數人一直在努力工作,直到現在。MySQL和Python字符集錯誤

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import MySQLdb 

QUERY = "SELECT * FROM searches WHERE searchdate BETWEEN '2011-08-08' AND '2011-08-14';" 
conn = MySQLdb.connect (unix_socket = '/opt/local/var/run/mysql5/mysqld.sock',host =  "localhost", user = "username", passwd= "passwd", db="db") 
c = conn.cursor() 
c.execute(QUERY) 
for row in c.fetchall(): 
    print row 

這是從數據庫中提取記錄的腳本。在稍後的過程中,我想從各行中提取數據,並格式化爲CSV這一點,但目前我的問題是,打印到屏幕上的數據是這樣的:

('\xc3\xa6nima', ' 1', ' 12782027', ' 35', datetime.date(2011, 8, 13)) 
('\xc3\xa6nima', ' 1', ' 12823616', ' 59', datetime.date(2011, 8, 10)) 
('\xc3\xa6oc', ' 1', ' 13078573', ' 55', datetime.date(2011, 8, 14)) 
('\xc3\xa6re', ' 1', ' 12516300', ' 35', datetime.date(2011, 8, 8)) 
('\xc3\xa6re v\xc3\xa6re deg', ' 1', ' 13145801', ' 59', datetime.date(2011, 8, 13)) 
('\xc3\xa6re v\xc3\xa6re deg og lammet', ' 1', ' 13145801', ' 59', datetime.date(2011, 8, 13)) 
('\xc3\xa6re v\xc3\xa6re jesu navn', ' 1', ' 13136667', ' 59', datetime.date(2011, 8, 11)) 
('\xc3\xa6rlig vuggevise', ' 1', ' 12386933', ' 35', datetime.date(2011, 8, 12)) 
('\xc3\xa6ror aleina', ' 1', ' 12867037', ' 35', datetime.date(2011, 8, 12)) 
('\xc3\xa6sj', ' 1', ' 13130891', ' 59', datetime.date(2011, 8, 8)) 
('\xc3\xa6thenor', ' 1', ' 12555673', ' 35', datetime.date(2011, 8, 10)) 

我是什麼現在有一些問題需要了解,我應該如何以兼容的格式獲取數據。所以我想我想知道如何才能訪問和更改數據庫中的字符集爲UTF-8,以及是否需要重建所有數據或是否有自動處理此問題的方法。如果有人能夠指出我如何使用內置函數格式化datatime.date(我知道我可以使用regex和rebuild,但可能有更優雅的解決方案),我也會感到非常高興。

提前感謝您的幫助!

+0

什麼是你的搜索表的第一列的數據類型? – thavan 2012-04-23 13:16:20

+0

這只是一個正常的varchar。有些人物雖然是挪威人,可能會導致一些問題呢? – olovholm 2012-04-23 19:17:33

回答

1

在您的第一列中,某些字符不可打印,因此它會轉換爲十六進制字符。日期時間對象中的最後一列。 Python提供strftime函數將其轉換爲字符串。

for row in c.fetchall(): 
    print row[0], row[1], row[2], row[3], row[4].strftime('%Y-%m-%d') 

將工作。

此外,您可以編寫使用

file.write(",".join((row[0], row[1], row[2], row[3], row[4].strftime('%Y-%m-%d')))) 

其中一個文件,文件是文件對象。它會寫爲逗號分隔列。在這裏,您可以在打開文件時看到文件中的原始字符。

1

我不熟悉MySQLdb的 但它應該是這樣的

康恩= MySQLdb.connect(unix_socket =「/opt/local/var/run/mysql5/mysqld.sock',host = 「localhost」,則用戶= 「用戶名」,passwd文件= 「passwd文件」,DB = 「DB」,的charset = 「UTF-8」

確保您的數據庫也使用UTF-8工作

使用pypdbc這看起來像

import pyodbc 
con = pyodbc.connect('DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=db;UID=user;PWD=blabla',charset='utf8', init_command='SET NAMES UTF8') 
cursor = con.cursor() 
str=u'''INSERT INTO migdal_hist VALUES("","2011/03/01","0","בלהבלה","0",","0","0")''' 
cursor.execute(str.encode('utf-8')) 
con.commit() 
0

也許你需要的東西是這樣的:

mysql = MySQLdb.connect(host = '...', [...] use_unicode = True) 
cursor = mysql.cursor() 
cursor.execute("SET NAMES 'utf8'") 

讓我們試試吧:)