42

テーブル作成スクリプトから、hasMultipleColors フィールドを BIT として定義しました。

hasMultipleColors BIT NOT NULL,

INSERT を実行すると、この BIT フィールドまたは他の BIT フィールドに対してスローされる警告はありませんが、行を選択すると、すべての BIT 値が空白であることが示されます。

コマンド ラインからこれらのレコードを手動で UPDATE しようとすると、奇妙な結果が生じます。レコードが一致して変更された (該当する場合) ことを示しますが、常に空白が表示されます。

サーバーのバージョン: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)

mysql> update pumps set hasMultipleColors = 1 where id = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> select hasMultipleColors from pumps where id = 1;
+-------------------+
| hasMultipleColors |
+-------------------+
|                  |
+-------------------+
1 row in set (0.00 sec)

mysql> update pumps set hasMultipleColors = b'0' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select hasMultipleColors from pumps where id = 1;
+-------------------+
| hasMultipleColors |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)

何かご意見は?

4

4 に答える 4

64

ビットフィールドを整数にキャストする必要があります。

mysql> select hasMultipleColors+0 from pumps where id = 1;

これはバグによるものです。 http://bugs.mysql.com/bug.php?id=43670を参照してください。ステータスは次のとおりです。修正されません。

于 2012-07-23T09:17:21.227 に答える
6

bit 1は印刷できないため、変換を実行する必要があります。

SELECT hasMultipleColors+0 from pumps where id = 1;

詳細はこちら: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

于 2012-07-23T09:11:52.020 に答える
0

目に見える効果の実際の理由は、それが正しく、期待どおりに行われたからです。

フィールドにはビットがあり、したがってビットが返されます。bit単一のビットを文字として出力しようとすると、指定されたビット値を持つ文字が表示されます。この場合はゼロ幅の制御文字です。

一部のソフトウェアはこれを自動的に処理する場合がありますが、コマンド ライン MySQL の場合は、何らかの方法で (ゼロを追加するなどして) int としてキャストする必要があります。

PHP のような言語では、関数を使用して、文字の序数値から正しい値が得られますord()(実際には、1 文字より長いビット フィールドを処理するには、10 進数からバイナリ文字列に変換する必要があります)。

編集:
変更されたと言っているかなり古いソースを見つけたので、MySQL のアップグレードにより、すべてが期待どおりに機能する可能性があります: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-フィールド型/

于 2014-10-07T06:16:34.280 に答える