2011-02-07 11 views
5

MySQL 5のクエリで使用できるバインド変数の数に制限はありますか?私はそこにいると仮定しますが、参照マニュアルやグーグルでは情報を見つけることができません。MySQL 5のSQLクエリで使用できるバインド変数の数はいくつですか?

私はそれがすべてで任意の情報を提供して見つけることができる唯一のことは、C APIリファレンスにあります。http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-bind-result.html

これは、そのメモリを意味すると思わ唯一の制限ですが、それは少し疑わしいと思われます。

更新:制限があります。

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' 

これは私に検索する方が良いです! http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.htmlから

+1

好奇心が強い、何人を渡したいですか? ;-) – zerkms

+0

できるだけ多く。 :)私が達成しようとしているのは、特定のデータをあるサーバーのデータベースから別のサーバーのデータウェアハウススタイルのデータベースに移動することです。カスケードな一連のクエリがあります。これは、IDで選択できる別のテーブルのレコードのIDを持つテーブルからレコードを選択することを意味します。私はできるだけ大きなバッチを作ってほしいが、(アインシュタインの助言をひねるために)それ以上のものは作っていない。 –

+0

おそらく、クライアント側でプリペアドステートメントをシミュレートするクライアントAPIが必要です。これは、一般に、より効率的であり、そのような制限を回避します。しかし、バッチインサートの場合は、大規模なINSERT文をアセンブルするか、LOAD DATA(LOCAL)INFILEを使用するかのいずれかになります。 – MarkR

答えて

-4

あまりにも多くのを防ぐためには、 max_prepared_stmt_countシステム 変数を設定し、同時に を作成中 文を作成しました。

max_prepared_stmt_countドキュメントによれば、デフォルトは16_382で、許容範囲は1_000_000に、(完全に準備されたステートメントを無効に)0です。

+3

これは、プリペアドステートメントの数であり、バインド変数の数ではありません。 –

9

プリペアドステートメントの値のプレースホルダーの最大数は、16ビットの符号なし整数の最大値、または具体的には65,536です。

これは、ここではMySQLのコードで見ることができます。 SQL/sql_prepare.cc:

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ですか?このコードは、私の答えに引用されているドキュメントと矛盾しているようです:http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html –

+0

これは5.1のソースツリーで当てはまります私は現在そのコードを使って作業しているので、7/18/12現在。 –

+1

もう1つ追加するだけです:mysql 5をハッキングして忙しそうでした。1とにかく、私は先に進み、答えに記載されている行をUINT_MAX32に変更しました。最初の紅潮では、 "ただの仕事"のようです。だから私はなぜ最初の場所に限界があったのか分からない。 –

1

制限65,535(2^16-1)MariaDB 5.5でプレースホルダがありますMySQL 5.5と同じ動作をするはずです。

関連性があるかどうかわからない場合は、PHP 5.5.12でMySQLi/MySQLNDを使用してテストしました。

関連する問題