mysql_stmt_executeを実行しようとすると奇妙なエラーが発生しました。mysql_stmt_executeで奇妙なエラーが発生しました
フローが行く:
- 私は接続してい私のデータベース内のテーブルのリストを取得します。 (カタログ、スキーマ、および名前)
- テーブルごとに、私は外部キー、フィールド、およびインデックスのリストを取得しています。
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]
「名前が長すぎます」の部分はわかりにくいですか?与えられた名前は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が書かれているので、あなたはその限界には達していませんが、何かが不満ですあなたの名前の選択。 –
@JonathanLeffler、mySQLのバージョンが質問に追加されました。また、これは私の名前の選択ではなく、システム・テーブルです:スキーマによって識別されます。さらに、それは識別子ではないので混乱しています。これはバインディングパラメータです。クエリの中の何もその名前を参照しません。 – Igor