Jos*_*shP 6 python mysql encoding select
感谢您抽时间阅读.这将是一个很长的职位来解释这个问题.我无法在所有常见来源中找到答案.
问题:我在使用带有python的select语句从mysql数据库中的表中调用数据时遇到问题.
系统和版本:
Linux ubuntu 2.6.38-14-generic #58-Ubuntu SMP Tue Mar 27 20:04:55 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Python: 2.7.1+
MySql: Server version: 5.1.62-0ubuntu0.11.04.1 (Ubuntu)
Run Code Online (Sandbox Code Playgroud)
这是表格:
mysql> describe hashes;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | varchar(20) | NO | PRI | NULL | |
| hash | varbinary(4) | NO | MUL | NULL | |
+-------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
以下是通过普通的mysql查询我想要的响应:
mysql> SELECT id FROM hashes WHERE hash='f';
+------+
| id |
+------+
| 0x67 |
+------+
mysql> SELECT id FROM hashes WHERE hash='ff';
+--------+
| id |
+--------+
| 0x6700 |
+--------+
Run Code Online (Sandbox Code Playgroud)
和以前一样,这些是预期的响应以及我如何设计数据库.
我的代码:
import mysql.connector
from database import login_info
import sys
db = mysql.connector.Connect(**login_info)
cursor = db.cursor()
data = 'ff'
cursor.execute("""SELECT
* FROM hashes
WHERE hash=%s""",
(data))
rows = cursor.fetchall()
print rows
for row in rows:
print row[0]
Run Code Online (Sandbox Code Playgroud)
这将返回我期望的结果:
[(u'0x67', 'f')]
0x67
Run Code Online (Sandbox Code Playgroud)
如果我将数据更改为:data ='ff',则会收到以下错误:
Traceback (most recent call last):
File "test.py", line 11, in <module>
(data))
File "/usr/local/lib/python2.7/dist-packages/mysql_connector_python-0.3.2_devel- py2.7.egg/mysql/connector/cursor.py", line 310, in execute
"Wrong number of arguments during string formatting")
mysql.connector.errors.ProgrammingError: Wrong number of arguments during string formatting
Run Code Online (Sandbox Code Playgroud)
好.所以,我将一个字符串格式化字符添加到我的SQL语句中,如下所示:
cursor.execute("""SELECT
* FROM hashes
WHERE hash=%s%s""",
(data))
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
[(u'0x665aa6', "f'f")]
0x665aa6
Run Code Online (Sandbox Code Playgroud)
它应该是0x6700.
我知道我应该用%s字符传递数据.这就是我构建数据库表的方法,每个变量使用一个%s:
cursor.execute("""
INSERT INTO hashes (id, hash)
VALUES (%s, %s)""", (k, hash))
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这一问题?
谢谢.
Aur*_*ora 23
你的执行语句似乎不太正确.我的理解是它应该遵循模式, cursor.execute( <select statement string>, <tuple>)
并且只在元组位置放置一个值,它实际上只是一个字符串.要使第二个参数成为正确的数据类型,您需要在其中放置逗号,因此您的语句将如下所示:
cursor.execute("""SELECT
* FROM hashes
WHERE hash=%s""",
(data, ))
Run Code Online (Sandbox Code Playgroud)