MySQL-null sütununda boş bir dize?

7 Cevap php

Ben standart mysql_connect () mysql_query (), vb PHP MySQL şeyler yapmak için ifadeleri kullanmak için kullanılır. Son zamanlarda ben harika MDB2 sınıfını kullanarak üzerinden geçiş oldum. Bununla birlikte, ben hazırlanmış deyimleri kullanıyorum, bu yüzden benim giriş ve SQL enjeksiyon saldırıları kaçan konusunda endişelenmenize gerek yok.

Ancak, ben çalıştırıyorum bir sorun var. Ben (yani, null değerlere izin vermez)-null olarak belirtilen bir kaç VARCHAR sütunları olan bir tablo var. Eski MySQL PHP komutlarını kullanarak, herhangi bir sorun olmadan bu gibi şeyler yapabilirsiniz:

INSERT INTO mytable SET somevarchar = '';

Şimdi, ancak, ben bir sorgu varsa şöyle:

INSERT INTO mytable SET somevarchar = ?;

Ve sonra PHP var:

$value = "";
$prepared = $db->prepare($query, array('text'));
$result = $prepared->execute($value);

Bu "null value violates not-null constraint" hata atmak olacaktır

$value boş ise geçici bir çözüm olarak, ben kontrol ve " " (tek bir boşluk) değiştirin, ama bu korkunç kesmek ve başka sorunlara neden olabilir.

Nasıl yerine NULL eklemek çalışıyorum olmadan hazırlanıp boş dizeler eklemek gerekiyor?

EDIT: Bu, benim tüm kod temeli geçmesi boş bir dize "" kullandığı her yerde bulmak ve yerine NULL kullanmak değiştirmek için bir proje çok büyük. Standart bir MySQL Sorgular "tedavi" ile iki ayrı şeyler için (ben doğru olduğunu düşünüyorum) NULL, ancak hazırlanan ifadeleri dönüştürür "," NULL'A içine neden nedir bilmem lazım olduğunu.

"" Ve null not aynı şey olduğunu unutmayın. Örneğin, SELECT NULL = ""; beklediğiniz gibi döner NULL yerine 1.

7 Cevap

Bu MDB2 API PHP'nin yazarak ördek semantik beceriksiz bir sorun gibi geliyor. PHP boş dize NULL eşdeğer olduğundan, MDB2 muhtemelen bu tür olarak yanlış tedavi olduğunu. İdeal çözüm, en API içerisinde, bunun için geçici bir çözüm bulmak için olurdu, ama ben onunla aşırı aşina değilim.

Düşünmelisiniz bir şey olsa da, SQL boş bir dize bir NULL değeri olmadığıdır. Sen gayet iyi 'NULL' ilan satır içine ekleyebilirsiniz:

mysql> CREATE TABLE tbl( row CHAR(128) NOT NULL );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tbl VALUES( 'not empty' ), ( '' );
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT row, row IS NULL FROM tbl;
+-----------+-------------+
| row       | row IS NULL |
+-----------+-------------+
| not empty |           0 | 
|           |           0 | 
+-----------+-------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO tbl VALUES( NULL );
ERROR 1048 (23000): Column 'row' cannot be null

Bulmak (veya uygulamaya) MDB2 API bir çözüm yapamıyorsanız, bir hackish çözüm (şu anda kullanmakta olduğunuz olandan olsa biraz daha iyi) boş dize için bir user variable tanımlamak olabilir -

SET @EMPTY_STRING = "";
UPDATE tbl SET row=@EMPTY_STRING;

Eğer INSERT deyimi boş dize kullanmak ancak kendinizi bulmak mümkün gerekiyorsa Son olarak, MySQL dize türleri için varsayılan değer boş bir dizedir. Yani sadece INSERT deyimi sütun ihmal olabilir ve otomatik olarak (sütun NULL kısıtı koşuluyla) boş bir dizeye ayarlayın olacaktı.

Bazı yanıtları sayesinde, ben sorun MDB2 API olması değil, PHP veya MySQL kendilerini komutları olabileceğini fark etti. Tabii ki, ben MDB2 SSS buldum:

  • Why do empty strings end up as NULL in the database? Why do I get an NULL not allowed in NOT NULL text fields eventhough the default value is ""?
    • The problem is that for some RDBMS (most noteably Oracle) an empty string is NULL. Therefore MDB2 provides a portability option to enforce the same behaviour on all RDBMS.
    • Since all portability options are enabled by default you will have to disable the feature if you dont want to have this behaviour: $mdb2->setOption('portability', MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL);

Düşünceli cevaplar sağlanan herkese teşekkürler.

Bu soru hemen hemen yanıtladı ve emekli olduğunu fark, ancak benzer bir durumla cevap ararken buldum ve ben ringde şapkamı atma duramazlar.

NULL / "" sütunu ile ilgilidir bilmeden, boş bir dize nasıl gerçek önemini bilemez. Bana sadece bir şey benim adını değiştirmek izin için bir yargıç ikna ederse benim adım NULL olarak benim Ehliyet geldi eğer boş dize kendi başına bir şey ifade ediyor mu (gibi, ben gerçekten rahatsız olurdu. Benim adım olurdu!

Ancak, boş bir dize (veya boş, ya da bir şey değil, NULL gibi bir şey basitçe eksikliği () olan hiçlik) ayrıca sadece sadece "NOT NULL" ya da "Hiçbir şey, ama yine de boş değil" anlamına gelebilir. Hatta diğer yöne gidin ve en azından null yüksek sesle söyleyebilen bir adı vardır çünkü değeri null olmaması, null dışında bir şey bile DAHA yapar hatırlatıyoruz!

Benim açımdan boş dize (bir isim, ya da ne benim telefon numarası, vb sayılar arasına eklenebilir tercih gibi) bazı verilerin doğrudan temsil ise, o zaman seçenekler boğaz olana kadar iddia ya vardır yani, boş dize meşru kullanımı için veya bir ASCII kontrol karakteri veya bazı unicode eşdeğeri, bir tür regex değeri, ya da daha kötüsü, bir keyfi henüz tamamen kullanılmamış belirteci gibi (NULL olmayan boş bir dize temsil eden bir şey kullanmak için , gibi: ◘

Boş hücre gerçekten sadece NOT NULL demekse, o zaman bunu ifade etmenin bir başka yolu düşünebiliriz. Bir aptal ve belirgin şekilde ifade "Değil NULL" dir. Ama boş bir dize "bu adam serin, o henüz çetesi dövme kazanılmış değildir" gibi bir şey gelir ise NULL "tüm bu grubun değil bir parçası" gibi bir şey demek olduğunu bir his var. Bu durumda ben "varsayılan" veya "çaylak" veya "Beklemede" gibi, bu durum için bir terim / isim / fikir gelirdi.

Bazı çılgın tesadüfen aslında NULL bile layık olanı temsil etmek boş bir dize istiyorsanız Şimdi, yine, bu tür "-1" veya "SUPERNULL" ya da "çirkin" olarak, bunun için daha önemli bir sembolü ile geldi.

Çiftçiler ve Emekçiler: Hint Kast Sistemi, düşük Kast Shudra vardır. "Untouchables": bu kast altında Dalit vardır. Düşük kast olarak ayarlayarak tüm sistemin bir kirlenme olarak düşünülebilir, çünkü bir alt kast olarak kabul edilmez.

Yani boş dizeler düşündüğüm için bana deli deme NULL'A daha kötü olabilir!

'Til dahaki sefere.

Ben çözüm bulundu!

Taşınabilirlik seçenek MDB2_PORTABILITY_EMPTY_TO_NULL varsayılan olarak çünkü MDB2 NULL'A (boş dizeleri null düşündüğü Oracle sayesinde) boş dizeleri dönüştürür.

Eğer veritabanına bağlanırken bu seçeneği kapatın:

$options = array(
    'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL
);
$res= & MDB2::connect("mysql://user:password@server/dbase", $options);

0 ve boş şeritler değişkenleri birlikte NULL veri yokluğudur. Ve inan bana, bunun için bir sorgu yazmak çok daha kolay

SELECT * from table where mything IS NULL boş dizeler sorgulamak için denemek için daha :/

"" Bu tırnak değil, bir boş küme yapmak mı?

Kafam karıştı. Eğer (etiketleri ve stil) mysqli Ö.Ö. kullanıyorsunuz gibi görünüyor, ancak sözdizimi manual yerine bunu diyor php.net, üzerinde daha farklıdır:

$query = "INSERT INTO mytable SET somevarchar = ?";
$value = "";
$prepared = $db->prepare($query);
$prepared->bind_param("s", $value);
$result = $prepared->execute();