テーブル作成スクリプトから、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)
何かご意見は?
ビットフィールドを整数にキャストする必要があります。
mysql> select hasMultipleColors+0 from pumps where id = 1;
これはバグが原因です。以下を参照してください http://bugs.mysql.com/bug.php?id=4367 。ステータスは言う:修正されません。
BITフィールドを符号なしにキャストできます。
SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors
FROM pumps
WHERE id = 1
hasMultipleColors
の値に基づいて1または0を返します。
bit 1
は印刷できないため、変換を実行する必要があります。
SELECT hasMultipleColors+0 from pumps where id = 1;
詳細はこちら: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html
あなたが見る効果の実際の理由は、それが正しく、期待通りに行われたということです。
bit
フィールドにはビットがあり、ビットが返されるため、1ビットを文字として出力しようとすると、指定されたビット値を持つ文字が表示されます。この場合は、幅がゼロの制御文字です。
一部のソフトウェアはこれを自動的に処理しますが、コマンドラインMySQLの場合、何らかの方法で(たとえば、ゼロを追加することによって)intとしてキャストする必要があります。
PHPのような言語では、文字の序数値はord()
関数を使用して適切な値を提供します(実際には適切ですが、 10進数から2進数の文字列。1文字より長いビットフィールドで機能します)。
編集:
それが変更されたと言っているかなり古いソースを見つけたので、MySQLアップグレードはすべてが期待どおりに機能するようにするかもしれません: http://gphemsley.wordpress.com/2010/02/08/php-mysql -and-the-bit-field-type /