Python Mysqldb为位值返回'\ x01'

时间:2013-10-08 19:05:28

标签: python mysql python-2.7 mysql-python

我使用Mysqldb和Python(2.7)从一个带有charset latin1的Mysql数据库返回一堆值。

mysql数据库具有类型为bit(1)的值,当它们返回时,它们看起来像'\ x01'

十进制值返回如此十进制('0E-8')

其余的值和类型都很好。

示例数据库结果集:

{'test':'\ x01','currency':u'bla','balance':十进制('0E-8'),'first':u'John'}

这就是我连接到数据库的方式: self.con = MySQLdb.connect(host = conn ['host'],user = conn ['user'],passwd = conn ['passwd'],db = conn ['db'],charset = conn ['charset '],port = int(conn ['port'])if conn else 3306中的'port')

我希望bit(1)值返回True或False。 我环顾四周,我认为可能是MySQLdb.converters.conversions,但我不知道如何实现这一点。任何想法都会很棒。 感谢

我无权更改数据库中的类型。

4 个答案:

答案 0 :(得分:8)

尝试:

orig_conv = MySQLdb.converters.conversions
#Adding support for bit data type
orig_conv[FIELD_TYPE.BIT] = lambda data: data == '\x01'

passing this into my connection.
MySQLdb.connect(conv=orig_conv)

使用" orig_conv [FIELD_TYPE.BIT] = bool"刚刚把一切都归还给我了

答案 1 :(得分:3)

与MySQL内部开发人员交谈时,他们都说BIT数据类型已被破坏,并且存在漏洞。

示例:Why you should not use BIT columns in MySQL作者:Baron Schwartz,高性能MySQL 的合着者。

所以我建议使用TINYINT并存储0或1来表示布尔值。你不会浪费任何空间,因为BIT列的大小无论如何都会向上舍入到最接近的整个字节。

MySQL甚至还有一个数据类型别名BOOL。当你使用它时,它被映射到TINYINT(1)(虽然1不会影响任何东西)。


如果无法更改数据类型,则可以将其映射到SQL查询中的整数:

MySQL使用1或0作为布尔值,因此您可以这样做:

SELECT (test=B'1') AS test, currency, balance, first FROM ...

或者你可以更详细:

SELECT IF(test=B'1', 1, 0) AS test, currency, balance, first FROM ...

或者您可以完全符合SQL:

SELECT CASE test=B'1' WHEN true THEN 1 ELSE 0 END AS test, currency, balance, first FROM ...

答案 2 :(得分:1)

想出来: 所以不得不在Mysqldb软件包中挖一点。

orig_conv = MySQLdb.converters.conversions
#Adding support for bit data type
orig_conv[FIELD_TYPE.BIT] = bool

passing this into my connection.
MySQLdb.connect(conv=orig_conv)

可以在FIELD_TYPE中找到MySQLdb.constants,可以这样导入

from MySQLdb.constants import FIELD_TYPE

答案 3 :(得分:0)

from pymysql import converters
converions = converters.conversions
converions[pymysql.FIELD_TYPE.BIT] = lambda x: '0' if x == '\x00' else '1'
db = pymysql.connect(mysql_host, mysql_user, mysql_password, mysql_db, 3306,charset='utf8',conv=converions)