2017-10-23 17 views
0

mysql_stmt_executeを実行しようとすると奇妙なエラーが発生しました。mysql_stmt_executeで奇妙なエラーが発生しました

フローが行く:

  1. 私は接続してい私のデータベース内のテーブルのリストを取得します。 (カタログ、スキーマ、および名前)
  2. テーブルごとに、私は外部キー、フィールド、およびインデックスのリストを取得しています。

performance_schema.events_stages_summary_by_account_by_event_nameという表が表示されるまで、すべてがうまくいっています。

私はエラー:Identifier name "events_stages_summary_by_account_by_event_name" is too longを受け取ります。不思議なことは、名前が識別子ではないということです。これはクエリのパラメータであり、識別子の制限である64文字未満です。以下は

は、関連するコードです:

std::wstring query3 = L"SELECT kcu.column_name, kcu.ordinal_position, kcu.referenced_table_schema, kcu.referenced_table_name, kcu.referenced_column_name, rc.update_rule, rc.delete_rule FROM information_schema.key_column_usage kcu, information_schema.referential_constraints rc WHERE kcu.constraint_name = rc.constraint_name AND kcu.table_catalog = ? AND kcu.table_schema = ? AND kcu.table_name = ?;"; 
char *catalog_name = row[0] ? row[0] : NULL; 
char *schema_name = row[1] ? row[1] : NULL; 
char *table_name = row[2] ? row[2] : NULL; 
MYSQL_BIND params[3]; 
unsigned long str_length1, str_length2, str_length3; 
str_length1 = strlen(catalog_name) * 2; 
str_length2 = strlen(schema_name) * 2; 
str_length3 = strlen(table_name) * 2; 
str_data1 = new char[str_length1], str_data2 = new char[str_length2], str_data3 = new char[str_length3]; 
memset(str_data1, '\0', str_length1); 
memset(str_data2, '\0', str_length2); 
memset(str_data3, '\0', str_length3); 
memset(params, 0, sizeof(params)); 
strncpy(str_data1, catalog_name, str_length1); 
strncpy(str_data2, schema_name, str_length2); 
strncpy(str_data3, table_name, str_length3); 
params[0].buffer_type = MYSQL_TYPE_STRING; 
params[0].buffer = (char *) str_data1; 
params[0].buffer_length = strlen(str_data1); 
params[0].is_null = 0; 
params[0].length = &str_length1; 
params[1].buffer_type = MYSQL_TYPE_STRING; 
params[1].buffer = (char *) str_data2; 
params[1].buffer_length = strlen(str_data2); 
params[1].is_null = 0; 
params[1].length = &str_length2; 
params[2].buffer_type = MYSQL_TYPE_STRING; 
params[2].buffer = (char *) str_data3; 
params[2].buffer_length = strlen(str_data3); 
params[2].is_null = 0; 
params[2].length = &str_length3; 
if(mysql_stmt_bind_param(res1, params)) 
{ 
std::wstring err = m_pimpl->m_myconv.from_bytes(mysql_stmt_error(res1)); 
errorMsg.push_back(err); 
result = 1; 
break; 
} 
else 
{ 
prepare_meta_result = mysql_stmt_result_metadata(res1); 
if(!prepare_meta_result) 
{ 
std::wstring err = m_pimpl->m_myconv.from_bytes(mysql_stmt_error(res1)); 
errorMsg.push_back(err); 
result = 1; 
break; 
} 
else 
{ 
if(mysql_stmt_execute(res1)) 
{ 
std::wstring err = m_pimpl->m_myconv.from_bytes(mysql_stmt_error(res1)); 
errorMsg.push_back(err); 
result = 1; 
break; 
} 

誰かがエラーにいくつかの光を当てるていただけますか?私はおそらくこのテーブルをスキップしようとすることができますが、私はしたくないでしょう。

[EDIT]

mysql --version 
mysql ver 14.14 Distrib 5.6.35, for Linux (x86+64) using Editine wrapper 

[/ EDIT]

+0

「名前が長すぎます」の部分はわかりにくいですか?与えられた名前は46バイトです( 'events_stages_summary_by_account_by_event_name')。エラーメッセージに「それは長すぎます」と表示されます。 MySQLの名前の長さの制限はいくらですか?どのバージョンのMySQLを使用していますか? [Schema Object Names](https://dev.mysql.com/doc/refman/5.7/en/identifiers.html)の5.7マニュアルには64が書かれているので、あなたはその限界には達していませんが、何かが不満ですあなたの名前の選択。 –

+0

@JonathanLeffler、mySQLのバージョンが質問に追加されました。また、これは私の名前の選択ではなく、システム・テーブルです:スキーマによって識別されます。さらに、それは識別子ではないので混乱しています。これはバインディングパラメータです。クエリの中の何もその名前を参照しません。 – Igor

答えて

0

編集: コードが実際にOKであるとはstrncpyがOKであると思われます。私は誤って、割り当てが文字列の長さの2倍であったが、文字列の長さはまだ1つだけであることを読んでいます。

エラーが表示される理由は、nullで終了していない文字列を使用しているためです。

memset(str_data1, '\0', str_length1); 
strncpy(str_data1, catalog_name, str_length1); 
params[0].buffer_length = strlen(str_data1); 

これを行うには良い方法はに次のようになります。これは、それが与えられた制限を超えると、使用制限は、文字列の実際の長さであればstrncpyは、文字列をNULLで終了しないことに起因します文字列をNULLで終了するsnprintf(3)を使用するか、const char*と長さをパラメータとするstd::string constructorを使用してください。

+0

チケットが提出されました。 Ref:https://bugs.mysql.com/bug.php?id=88216&thanks=5¬ify=71私は再現可能なケースに入れました。あなたはチャンスがあるときに見てみることができますか?残念ながら、mySQLコミュニティの誰も最初の応答の後に返信しました。 TIA! – Igor

+0

私はMariaDBや古いバージョンのMySQLで試してみることをお勧めします。このようにすれば、どこに問題があるかを知ることができます。 – markusjm

関連する問題