日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

發布時間:2023/12/2 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DROP TABLE IF EXISTS [TEMP_TABLE_NAME];

create temporary table [TEMP_TABLE_NAME] select col1,col2,... from [TABLE_NAME];

alter table [TEMP_TABLE_NAME] add unique idx_col1(col1);

經過以上操作中,多次出現該warning問題。通過查詢和跟蹤調試源碼,有以下線索和處理方式:

mysql的"[Warning] Invalid (old?) table or database name"問題出現位置:

sql_table.cc:279

uint explain_filename (THD* thd, const char *from, char *to , uint to_length , enum_explain_filename_mode explain_mode )

跟蹤代碼發現,只有在ha_innodb.cc:1946的innobase_convert_identifier 中調用explain_filename函數。

/*****************************************************************//**

Convert an SQL identifier to the MySQL system_charset_info (UTF-8)

and quote it if needed.

@return pointer to the end of buf */

static char* innobase_convert_identifier (

/*========================*/

char* buf, /*!< out: buffer for converted identifier */

ulint buflen, /*!< in: length of buf, in bytes */

const char * id, /*!< in: identifier to convert */

ulint idlen, /*!< in: length of id, in bytes */

void* thd, /*!< in: MySQL connection thread, or NULL */

ibool file_id) /*!< in: TRUE=id is a table or database name;

FALSE=id is an UTF-8 string */

順著線索向上查找,發現在有兩個位置調用了innobase_convert_identifier 函數,分兩個線索繼續查找。

線索一:

ha_innodb.cc:2034

調用innodb_convert_identifier函數

/*****************************************************************//**

Convert a table or index name to the MySQL system_charset_info (UTF-8)

and quote it if needed.

@return pointer to the end of buf */

extern "C" UNIV_INTERN char* innobase_convert_name (

/*==================*/

char* buf, /*!< out: buffer for converted identifier */

ulint buflen, /*!< in: length of buf, in bytes */

const char * id, /*!< in: identifier to convert */

ulint idlen, /*!< in: length of id, in bytes */

void* thd, /*!< in: MySQL connection thread, or NULL */

ibool table_id) /*!< in: TRUE=id is a table or database name;

FALSE=id is an index name */

從函數定義和函數功能來看,該函數是將mysql的表名或者索引名轉換成utf8,與字符集相關。查看現有數據庫字符集和生成的臨時表字符集均為lanti1,推斷是可能的原因之一。

處理方式:

修改數據庫的字符集為utf8,觀察數據庫是否仍然出現該錯誤。

線索二:

ha_innodb.cc:6269

調用innodb_convert_identifier函數

/*****************************************************************//**

Creates a table definition to an InnoDB database. */

static create_table_def (

/*=============*/

trx_t* trx, /*!< in: InnoDB transaction handle */

TABLE* form, /*!< in: information on table

columns and indexes */

const char * table_name, /*!< in: table name */

const char * path_of_temp_table, /*!< in: if this is a table explicitly

created by the user with the

TEMPORARY keyword, then this

parameter is the dir path where the

table should be placed if we create

an .ibd file for it (no .ibd extension

in the path, though); otherwise this

is NULL */

ulint flags) /*!< in: table flags */

在create_table_def 函數中,調用row_create_table_for_mysql函數后,當返回值為DB_DUPLICATE_KEY時,調用innodb_convert_identifier,從而觸發該warning。

row0mysql.c:1820

UNIV_INTERN int row_create_table_for_mysql(

/*=======================*/

dict_table_t* table, /*!< in, own: table definition

(will be freed) */

trx_t* trx) /*!< in: transaction handle */

該函數中調用了更深層次的函數,但從調試代碼來看,暫時沒有發現導致該問題的點。

處理方式:

在線索一中的處理方式不能解決問題的情況下,再進行進一步的代碼分析。

總結:

經過以上代碼調試和分析,得出兩條線索,但是一直未能重現該問題。因此,目前只能對現有服務器進行線索一的處理。如果按照線索一處理方式處理后,仍然出現該問題,將對第二步進行深入的分析。

作者 king_wangheng

總結

以上是生活随笔為你收集整理的sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。