7

Python(2.7)でMysqldbを使用して、文字セットlatin1を持つMysqlデータベースから一連の値を返します。

mysql データベースには bit(1) 型の値が返されますが、これらの値は '\x01' のようになります。

Decimal('0E-8') のような Decimal 値が返されます

残りの値と型は問題ありません。

サンプル データベースの結果セット:

{'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' in conn else 3306)

bit(1) の値が True または False として返されるようにしたいと考えています。私は周りを見回しましたが、MySQLdb.converters.conversions を実行する必要があると思いますが、これを実装する方法がわかりません。どんなアイデアでも素晴らしいでしょう。ありがとう

また、DB のタイプを変更するアクセス権がありません。

4

4 に答える 4

5

MySQL 内部の開発者と話すと、BIT データ型は壊れていて、バグだらけだと言われています。

例: High Performance MySQLの共著者である Baron Schwartz による、MySQL で BIT 列を使用すべきでない理由

したがって、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 ...
于 2013-10-08T19:09:41.023 に答える
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
于 2013-10-09T09:37:33.973 に答える
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)
于 2020-11-09T03:18:33.963 に答える