web-dev-qa-db-ja.com

MySQLは常に空白としてBIT値を返します

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

hasMultipleColors BIT NOT NULL,

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

コマンドラインからこれらのレコードを手動で更新しようとすると、奇妙な効果が得られます。レコードが一致し、変更された(適切な場合)ことを示しますが、常に空白のままです。

サーバーのバージョン: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)

何かご意見は?

38
CdrXndr

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

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

これはバグが原因です。以下を参照してください http://bugs.mysql.com/bug.php?id=4367 。ステータスは言う:修正されません。

55
RTB

BITフィールドを符号なしにキャストできます。

  SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors 
  FROM pumps 
  WHERE id = 1

hasMultipleColorsの値に基づいて1または0を返します。

7
A J 9

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

SELECT hasMultipleColors+0 from pumps where id = 1;

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

6
mihaisimi

あなたが見る効果の実際の理由は、それが正しく、期待通りに行われたということです。

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

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

PHPのような言語では、文字の序数値はord()関数を使用して適切な値を提供します(実際には適切ですが、 10進数から2進数の文字列。1文字より長いビットフィールドで機能します)。

編集:
それが変更されたと言っているかなり古いソースを見つけたので、MySQLアップグレードはすべてが期待どおりに機能するようにするかもしれません: http://gphemsley.wordpress.com/2010/02/08/php-mysql -and-the-bit-field-type /

0
Flygenring