2012-02-06 108 views
4

我有後續的python腳本(tes.py):蟒蛇編碼的mysql :(

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

import MySQLdb 

query = "INSERT INTO test(test) VALUES ('ñ')" 
print query + "\n" 

conn = MySQLdb.connect (host = "localhost", user = "ibrick", passwd = "x", db = "ibrick", charset="utf8") 
conn.names="utf8" 
cursor = conn.cursor() 
cursor.execute (query); 
cursor.close() 
conn.commit() 

文件編碼UTF-8:

$ file -i tes.py 
tes.py: text/x-java charset=utf-8 

系統編碼UTF:

#locale 
LANG=es_AR.UTF-8 
LC_CTYPE="es_AR.UTF-8" 
LC_NUMERIC="es_AR.UTF-8" 
LC_TIME="es_AR.UTF-8" 
LC_COLLATE="es_AR.UTF-8" 
LC_MONETARY="es_AR.UTF-8" 
LC_MESSAGES="es_AR.UTF-8" 
LC_PAPER="es_AR.UTF-8" 
LC_NAME="es_AR.UTF-8" 
LC_ADDRESS="es_AR.UTF-8" 
LC_TELEPHONE="es_AR.UTF-8" 
LC_MEASUREMENT="es_AR.UTF-8" 
LC_IDENTIFICATION="es_AR.UTF-8" 
LC_ALL= 
echo "ñññ" > /tmp/test.txt 

file /tmp/test.txt 
/tmp/test.txt: UTF-8 Unicode text 

MYsql表編碼UTF8:

mysql> show create table test; 
+-------+----------------------------------------------------------------------------------------------+ 
| Table | Create Table                     | 
+-------+----------------------------------------------------------------------------------------------+ 
| test | CREATE TABLE `test` (
    `test` varchar(10) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 | 
+-------+----------------------------------------------------------------------------------------------+ 

控制檯outupt是OK:

#./tes.py 
INSERT INTO test(test) VALUES ('ñ') 

問題:

腳本不會插入表中的ñ..它插入一個人品不好:

select * from test; 
+------+ 
| test | 
+------+ 
| � | 
| � | 
| � | 
| � | 
| � | 
| � | 
| � | 
+------+ 
7 rows in set (0.00 sec) 

有人幫幫我嗎? ?

提前致謝!

+3

您是否試過用python進行SELECT?它可能被正確存儲,但會在MySQL的控制檯輸出中混亂。 – 2012-02-06 02:32:03

+3

笑臉和腳註不會幫助你獲得答案,我將在未來離開它們。 – richo 2012-02-06 04:12:20

回答

7

嘗試添加'use_unicode'。

的祕訣是一個charset =」 utf-8「添加到您的連接 參數,並use_unicode =真。 Source

db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME, charset="utf8", use_unicode=True) 
+0

感謝Latty!但是,通過添加「use_unicode = True」繼續同樣的問題:( – 2012-02-06 02:37:56

+0

@HalNuevemil Hrm,恐怕我不知道那麼我會檢查你的控制檯支持unicode,以防萬一它在數據庫很好,但沒有' t顯示正確 – 2012-02-06 02:40:50

+0

extyly Latty,我用PhpMyAdmin Tool查看了表格,數據正確..它可能是mysql控制檯中的一個可視化問題,這很瘋狂,因爲我的語言環境在我的系統中是UTF-8 .. – 2012-02-06 02:49:42

0

嘗試:

query = u"INSERT INTO test(test) VALUES ('ñ')" 

隨着use_unicode = True

+0

我試過了,但繼續同樣的問題,我認爲數據被作爲ISO字符集插入,因爲當y通過php獲取數據時,我使用ISO而不是UTF。 – 2012-02-06 04:27:57

+0

更多的數據: 如果我試試這個: 的mysql -u ibrick -pxx -h本地主機ibrick -N -B -e 「INSERT INTO測試(測試)VALUES( 'N')」 是OK,Y見 :| | ñ| + ------ 但如果我嘗試: #在/ usr /斌/包膜蟒蛇 # - * - 編碼:UTF-8 - * - 進口MySQLdb的 查詢= U」 「\ n」 conn = MySQLdb.connect(host =「localhost」,user =「ibrick」,passwd =「ibrick」,db =「) ibrick「,charset =」utf8「,use_unicode = True) conn.names =」utf8「 cursor = conn.cursor() cursor.execute(query); cursor.close() conn.commit() I see | | – 2012-02-06 04:42:46

+0

那麼,如果你要保存文件在ISO-8859中,不要告訴Python它是UTF-8;將'# - coding:'設置爲您保存的實際文件編碼。 – geoffspear 2012-02-06 12:39:39

3
import MySQLdb 

# connect to the database 
db = MySQLdb.connect("****","****","****","****") #don't use charset here 

# setup a cursor object using cursor() method 
cursor = db.cursor() 

cursor.execute("SET NAMES utf8mb4;") #or utf8 or any other charset you want to handle 

cursor.execute("SET CHARACTER SET utf8mb4;") #same as above 

cursor.execute("SET character_set_connection=utf8mb4;") #same as above 

# run a sql question 
cursor.execute("****") 

... 

#and make sure the mysql settings are correct, data too 
+1

+1不明白爲什麼這是早些時候被低估。有用的信息。 – mkoistinen 2014-08-21 10:37:02

+0

唯一爲我工作的 – 2014-09-05 22:20:11