Otomatik uç üzerindeki uygun uzunlukta dizeleri klibi

3 Cevap php

Ben MySQL çeşitli VARCHAR alanları ile bir tablo var. Ben PHP ile bir formdan bazı kullanıcı veri eklemek istiyorum. Ben PHP alan uzunlukları biliyorsanız Açıkçası, ben substr() orada veri uzunluğunu sınırlayabilirsiniz. Ama bu tür (alan uzunluğu benim PHP komut MySQL ve sürekli olarak depolanır) KURU ihlal ediyor. Otomatik olarak başarısız yerine, aşırı uzun dizeleri off pirzola yüzden bana bir INSERT yapılandırmak için bir yolu var mı?

edit: Ben aşırı uzun dizeleri zaman başarısız (ya da en azından bir özel durum neden) PHP / PDO içinde bulunuyor. PHP / PDO'de yapmak ne emin değil bu yüzden doğru olanı yapar.

edit 2: Ugh. Bu yanlış bir yaklaşımdır; Ben INSERT üzerinde ok işe almak bile ben yinelenen bir dize için kontrol etmek istiyorsanız, düzgün maç olmayacak.

3 Cevap

Aslında, MySQL varsayılan sütun genişliği dizeleri keser. Bu bir uyarı oluşturur, ancak ekleme sağlar.

mysql> create table foo (str varchar(10));
mysql> insert into foo values ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'str' at row 1 | 
+---------+------+------------------------------------------+
mysql> select * from foo;
+------------+
| str        |
+------------+
| abcdefghij | 
+------------+

Eğer sıkı SQL modunu ayarlarsanız, bu bir hata içine uyarı döner ve ekleme reddeder.


Yorumlarınız Re: SQL modu MySQL Server yapılandırma. Muhtemelen ne neden PDO değil, ancak herhangi bir istemci kendi oturum için SQL modunu ayarlayabilirsiniz çünkü diğer taraftan, mümkün.

Sen şu ifadelere mevcut küresel ya da oturum sql_mode değerini alabilirsiniz:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

Varsayılan (yok modları ayarlanabilir) boş bir dize olmalıdır. Sen --sql-mode mysqld için seçenek, ya da bir SET deyimi kullanarak, sizin my.cnf dosyasında SQL modunu ayarlayabilirsiniz.

http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html SQL modları üzerinde tam belgelerine bakın.

Eğer sütunun boyunu almak ve veri ekleme önce kesecek için kullanmak information_schema sorgulayabilir, ama gereğinden fazla havai bulunuyor. Sadece bu beyanı için sıkı SQL modunu kapatın:

select @prev_mode = @@sql_mode;
set sql_mode = '';
insert blah....;
set sql_mode = @@sql_mode;

Sen dize uzunluğunu kontrol etmek için sütun meta kullanabilirsiniz. (PHP Manual on PDOStatement->getColumnMeta)

Bütün tablo için meta veri bu yol almak

$query = $conn->query("SELECT * FROM places");
$numcols = $query->columnCount();

$tablemeta = array();
for ($i = 0; $i < $numcols; $i++) {
    $colmeta = $query->getColumnMeta($i);
    $tablemeta[$colmeta['name']] = $colmeta;
}