我正在使用Mysqldb和Python(2.7)从一个带有字符集latin1的Mysql数据库中返回一堆值。
mysql数据库具有类型为bit(1)的值,当返回这些值时,它们看起来像这样'\x01‘
十进制值返回如下Decimal('0E-8')
其余的值和类型都没问题。
示例数据库结果集:
{'test':'\x01','currency':u‘’bla‘,'balance':Decimal('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’port‘if’port‘in conn else 3306)
我希望位(1)值返回为True或False。我看了看周围,我想可能是做MySQLdb.converters.conversions,但我不确定如何实现它。任何想法都是很棒的。谢谢
并且我没有权限更改数据库中的类型。
发布于 2017-04-07 12:16:23
尝试:
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_convFIELD_TYPE.BIT = bool“返回的所有内容都是真的
发布于 2013-10-09 03:09:41
在与MySQL内部组件的开发人员交谈时,他们都说BIT数据类型被破坏了,并且充满了错误。
例如:《高性能MySQL》的合著者Baron Schwartz的Why you should not use BIT columns in MySQL。
因此,我建议使用TINYINT并存储0或1来表示布尔值。您不会浪费任何空间,因为位列的大小无论如何都会向上舍入到最接近的整字节。
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 ...发布于 2013-10-09 17:37:34
弄清楚了这一点:所以必须在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)可在MySQLdb.constants中找到FIELD_TYPE,并可通过以下方式导入
from MySQLdb.constants import FIELD_TYPEhttps://stackoverflow.com/questions/19256155
复制相似问题