web-gelistirme-sc.com

MySQL her zaman BIT değerlerini boş olarak döndürüyor

Create table betiğimden, hasMultipleColors alanını BIT olarak tanımladım:

hasMultipleColors BIT NOT NULL,

Bir INSERT çalıştırırken, bu veya diğer BIT alanları için atılan hiçbir uyarı yoktur, ancak satırları seçmek tüm BIT değerlerinin boş olduğunu gösterir.

Bu kayıtları komut satırından manuel olarak güncellemeye çalışmak garip bir etki yaratır - kaydın eşleştiğini ve değiştiğini gösterir (uygunsa), ancak yine de her zaman boş gösterir.

Sunucu sürümü: 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)

Düşüncesi olan var mı?

32
CdrXndr

Bit alanını bir tamsayıya dönüştürmeniz gerekir.

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

Bu bir hata nedeniyle, bakınız: http://bugs.mysql.com/bug.php?id=43670 . Durum diyor ki: Düzeltmeyecek. 

50
RTB

bit 1 basılabilir olmadığı için bir dönüşüm yapmanız gerekir.

SELECT hasMultipleColors+0 from pumps where id = 1;

Buradan daha fazlasını görün: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html

6
mihaisimi

BIT alanını imzasız olarak atayabilirsiniz.

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

hasMultipleColors değerine bağlı olarak 1 veya 0 döndürür.

5
A J

Gördüğünüz etkinin gerçek nedeni, doğru ve beklendiği gibi yapılmasıdır.

bit alanı bitlere ve böylece bitlere sahiptir ve karakter olarak tek bir bit çıktılamaya çalışmak karakteri verilen bit-değeri ile gösterecektir - bu durumda sıfır genişlikli bir kontrol karakteri.

Bazı yazılımlar bunu otomatik olarak halledebilir, ancak MySQL komut satırı için bir şekilde int olarak kullanmanız gerekir (örneğin, sıfır ekleyerek).

PHP gibi dillerde, karakterin sıra değeri ord() işlevini kullanarak size doğru değeri verir (gerçekten uygun olsa da, bit için çalışmak için ondalıktan ikili dizgeye dönüştürülmesi gerekir. bir karakterden daha uzun alanlar.

EDIT:
Değiştirildiğini söyleyen çok eski bir kaynak bulundu, bu yüzden bir MySQL yükseltmesi her şeyin beklendiği gibi çalışmasını sağlayabilir: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and -bit alanı tipi/

0
Flygenring