1

我想让我们MySQLdb连接到我的MySQL数据库。当我使用像“fred”这样的有效mysql用户名时,一切都按预期工作,但当我尝试使用有效的mysql unicode用户名,数据库或密码(如“大な”)时失败。如何使用unicode用户名,密码,数据库使用MySQLdb?

谁知道如何使用带有可能的unicode字符的MySQLdb?令人惊讶的是,当我使用mysql.connector而不是MySQLdb时,我可以使用我的数据库,用户和密码中的日语字符进行连接(无法使用日语字符测试主机名)。我会很乐意使用mysql.connector,但我有另一个问题(见mysql.connector bug?

def fix(string): 
    string = unicode(string) # convert qstring from pyqt ui to unicode string 
    string = string.encode('utf-8') 
    return string 

try: 
    db = MySQLdb.connect(host=fix(hostname), user=fix(username), passwd=fix(password), port=int(port), charset="utf8", use_unicode=True) 
except MySQLdb.Error, e: 
    errno = e.args[0] 
    err = e.args[1] 

    reply = QtGui.QMessageBox.critical(self, "MySQL Connect Failed", err.decode("utf8")) 
    return 

编辑:我是能够解决mysql connector bug所以我会用mysql.connector而不是MySQLdb的,但这个问题依然有效。

+0

作为一个侧面说明 - 主机名,顾名思义,不能包含Unicode字符。它们仅限于ASCII字母数字字符和连字符。 – duskwuff

+0

感谢duskwuff ......至少我不必试图创建那个测试用例。 :) – panofish

回答

0

connect方法中的charset选项在连接建立后更改字符集。如果您需要Unicode来建立连接(例如因为用户名和/或密码包含unicode代码点),那么可以使用read_default_file选项。

内容mycnf.cnf的:

[client] 
default-character-set=utf8mb4 

,然后在Python3(最好使用绝对路径mycnf.cnf文件):

#!/bin/python3 

import MySQLdb 

user="some name with unicode codepoints" 
passwd="unicode password" 
db = MySQLdb.connect(
    host="127.0.0.1", 
    user=user, passwd=passwd, 
    charset="utf8mb4", 
    read_default_file="./mycnf.cnf") 

print("db:", db) 

db.close() 
相关问题