2011-02-07 15 views
5

MySQL 5'te bir sorguda kullanabileceğim bağlama değişkenlerinin sayısı için bir sınır var mı? Var olduğunu varsayalım, ancak referans kılavuzunda veya Googling tarafından herhangi bir bilgi bulamıyorum. Bunu hiç bir bilgi sağlar bulabildiğimMySQL 5'te bir SQL sorgusunda kaç bağlama değişkenini kullanabilirim?

tek şey C API alakalı: http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-bind-result.html

Bu, o bellek tek limit ima görünüyor, ama bu biraz şüpheliyi görünüyor.

Güncelleştirme: bir sınırlama var!

runner.rb:47: data_replicator.rb:312:in `prepare': Prepared statement contains too many placeholders (Mysql::Error) 
     from data_replicator.rb:312:in `set_statement_handle_for' 
     from data_replicator.rb:287:in `log_query' 
     from data_replicator.rb:221:in `replicate_table' 
     from data_replicator.rb:93:in `replicate' 
     from data_replicator.rb:20:in `run' 

Bu, arama yapmak için bana daha iyi bir şey verir! http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html itibaren

+1

Sadece merak, kaçını geçmek istersiniz? ;-) – zerkms

+0

Mümkün olduğunca çok. :) Yapmaya çalıştığım şey, belirli verileri bir sunucudaki bir veritabanından diğerine veri ambarı tarzı veritabanına taşımaktır. Basamaklı bir dizi sorgum var, yani bir tablodan başka bir tablodaki kayıtlar için kimlikleri olan kayıtları seçiyorum, böylece ID ile seçebiliyorum. Gruplarımın olabildiğince geniş olmasını istiyorum, ama daha büyük değil (Einstein'ın tavsiyelerini bükmek). –

+0

Muhtemelen istemci tarafında hazırlanmış ifadeleri simüle eden bir istemci API'sini istersiniz - genellikle daha etkilidir ve bu tür sınırlardan kaçınır. Ancak, toplu ekler için, büyük INSERT deyimlerini veya LOAD DATA (LOCAL) INFILE kullanarak büyük olasılıkla giderdim. – MarkR

cevap

-4

:

çok fazla karşı korunmak için ifadeleri aynı anda oluşturulan hazırlanan max_prepared_stmt_count sistemi değişkeni ayarlayın.

max_prepared_stmt_count belgelerine göre varsayılan 16_382 ve izin verilen aralık 1_000_000 için, (birlikte hazırlanmış deyimleri devre dışı bırakır) 0'dır.

+3

Bu, hazırlanmış deyimlerin sayısıdır, bağ değişkeni sayısı DEĞİLDİR. –

9

Hazırlanan bir ifadedeki değerler için maksimum yer tutucu sayısı, 16 bit işaretsiz bir tamsayıya ait maksimum değerdir veya özel olarak: 65,536. mariadb 5.5 içinde

static bool init_param_array(Prepared_statement *stmt) 
{ 
    LEX *lex= stmt->lex; 
    if ((stmt->param_count= lex->param_list.elements)) 
    { 
    if (stmt->param_count > (uint) UINT_MAX16) 
    { 
     /* Error code to be defined in 5.0 */ 
     my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0)); 
     return TRUE; 
    } 
+0

MySQL'in hangi sürümü bu? Bu kod cevabımdaki belgeyle çelişiyor gibi görünüyor: http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html –

+0

Bu, 5.1 ağacının kaynağı için kesinlikle doğrudur. Şu anda bu kod ile çalışırken 7/18/12'den itibaren. –

+1

Sadece bir şey daha eklemek için: Mysql 5'de hacklemekle meşguldü.Her neyse, ileri gittim ve UINT_MAX32 cevabında belirtilen satırı değiştirdim. İlk allıkta "sadece çalışır" gibi görünüyor. Yani ilk başta neden sınırın orada olduğundan emin değilim. –

1

bulunmaktadır sınır 65.535 (2^16-1) yer tutucuları: SQL/sql_prepare.cc:

Bu

burada MySQL kodu görülebilir Bu, MySQL 5.5 ile aynı davranışa sahip olması gerekiyordu.

Uygun olup olmadığından emin değilim, PHP 5.5.12 üzerinde MySQLi/MySQLND kullanarak test ettim.

İlgili konular