具有特殊字符和UTF-8字符的Python参数化查询

时间:2014-09-04 23:35:04

标签: python python-2.7 unicode-string parameterized-query

我是Python的新手,但是还没有找到关于如何做的好参考。我想我可能会对如何使用Unicode字符/字符串感到困惑。

我尝试创建参数化查询以使用Unicode字符,插入并从MySQL数据库中选择以下值:

valueUTF8 = u"Программирование - プログラミング"
valueSpecialCharacters = u"`~!@#$%^&*()_+[]\\;',./{}|:\"<>?"
valueSpecialCharacters2 = u"¢¥¦§©«¬®æƸɅɆɜʘɷɸӒӔӥӺӾسشصضطّ٦۝۞۩ᴚᴇᴈᵺḈᵯἃἮᾝᾸ₨₸∑∏∆∂℮ⅎ₲∩∫≈≠≡≤≥⌂℗⅝⅞⅓⅔⅛⅜⅍"
valueSpecialCharacters3 = u"░▒▓■□▪▫▬▲►▼◄◊○◌●◘◙◦☺☻☼♀♂♠♣♥♦♪♫♯ⱠⱡⱢⱣⱤⱥⱦⱧﭮצּרּﭓךּﺹﻏ﷼ﻪﻯﻴﻹ  ﻼ"

一旦我完成这些工作,我打算将它们用作某些单元测试的一部分。

1 个答案:

答案 0 :(得分:0)

所以我的主要问题是我错过了我的数据库连接字符串中的charset="utf8"。在我拥有之后,其他一切都很简单。

下面是我的一些测试代码,作为参考,以防其他人遇到同样的问题。它会将特殊值插入到一个db中,然后从该db读取它们并将其插入到不同的db中。我使用第三方工具查询数据库并验证结果。我做的最后一次测试是基于名称的删除:

#!/usr/bin/python    
# -*- coding: UTF-8 -*-
import MySQLdb

db1 = MySQLdb.connect(host="10.100.10.2",
                     user="root",
                     passwd="",
                     db="db1",
                     charset="utf8"
                     )
db1.autocommit(True)
cur1 = db1.cursor()

db2 = MySQLdb.connect(host="10.100.10.2",
                     user="root",
                     passwd="",
                     db="db2",
                     charset="utf8"
                     )
db2.autocommit(True)
cur2 = db2.cursor()

valueSpecialCharacters = u"`~!@#$%^&*()_+[]\\;',./{}|:\"<>?"
valueSpecialCharacters2 = u"¢¥¦§©«¬®æƸɅɆɜʘɷɸӒӔӥӺӾسشصضطّ٦۝۞"
valueSpecialCharacters3 = u"۩ᴚᴇᴈᵺḈᵯἃἮᾝᾸ₨₸∑∏∆∂℮ⅎ₲∩∫≈≠≡≤≥⌂℗⅝⅞"
valueSpecialCharacters4 = u"⅓⅔⅛⅜⅍░▒▓■□▪▫▬▲►▼◄◊○◌●◘◙◦☺☻☼♀♂♠♣"
valueSpecialCharacters5 = u"♥♦♪♫♯ⱠⱡⱢⱣⱤⱥⱦⱧﭮצּרּﭓךּﺹﻏ﷼ﻪﻯﻴﻹ  ﻼ"

sqlInsert = "INSERT INTO table (tableID, Name) VALUES (%s, %s);"

# Clean tables to make easier to see updates.
cur1.execute("DELETE FROM table")
cur2.execute("DELETE FROM table")

print "1: " + valueSpecialCharacters
args = "1", valueSpecialCharacters 
cur1.execute(sqlInsert, args)

print "2: " + valueSpecialCharacters2
args = "2", valueSpecialCharacters2 
cur1.execute(sqlInsert, args)

print "3: " + valueSpecialCharacters3
args = "3", valueSpecialCharacters3 
cur1.execute(sqlInsert, args)

print "4: " + valueSpecialCharacters4
args = "4", valueSpecialCharacters4 
cur1.execute(sqlInsert, args)

print "5: " + valueSpecialCharacters5
args = "5", valueSpecialCharacters5 
cur1.execute(sqlInsert, args)

sqlSelect = "SELECT tableID, Name FROM table;"
cur1.execute(sqlSelect)
results = cur1.fetchall()
for row in results:
    args = row[0], row[1]
    print "args: %s", args
    cur2.execute(sqlInsert, args)

# Test of deleting with utf-8
sqlDelete = "DELETE FROM table2 WHERE Name = %s;"
cur1.execute(sqlDelete, valueSpecialCharacters2)

db1.close()
db2.close()