首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 MySQL 儲存過程錯誤 1307:phpMyAdmin proc 表結構不匹配修復方案

     編輯:MySQL 資料庫相關知識

在 phpMyAdmin 2.11.9.2 + MySQL 5.2.6 環境建立儲存過程時遇到 ERROR 1307 (HY000): Failed to create procedure。根因為 mysql.proc 系統表結構與 MySQL 版本不匹配(缺少新版欄位)。

故障現象

CREATE PROCEDURE test_proc() BEGIN SELECT 1; END;
// ERROR 1307 (HY000): Failed to create procedure...

根因分析

早期 proc 表缺少 MySQL 5.1+ 新增欄位:

  • character_set_client
  • collation_connection
  • db_collation
  • body_utf8
  • sql_mode 選項不完整(缺 GBASE80、GBASE81 等)

修復步驟

  1. 備份原 proc 表資料(若有自訂過程)
  2. 刪除舊表:DROP TABLE mysql.proc;
  3. 執行以下建表腳本(對應 MySQL 5.1+ 完整結構):
CREATE TABLE `proc` (
  `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `name` char(64) NOT NULL DEFAULT '',
  `type` enum('FUNCTION','PROCEDURE') NOT NULL,
  `specific_name` char(64) NOT NULL DEFAULT '',
  `language` enum('SQL') NOT NULL DEFAULT 'SQL',
  `sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL',
  `is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO',
  `security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER',
  `param_list` blob NOT NULL,
  `returns` char(64) NOT NULL DEFAULT '',
  `body` longblob NOT NULL,
  `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','GBASE80','GBASE81','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') NOT NULL DEFAULT '',
  `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `body_utf8` longblob DEFAULT NULL,
  PRIMARY KEY (`db`,`name`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures';
  1. 執行 FLUSH PRIVILEGES; 重載授權表
  2. 驗證:重新建立測試儲存過程

對照:舊版結構缺失欄位

早期版本無 character_set_client、collation_connection、db_collation、body_utf8,且 sql_mode 缺少 GBASE80、GBASE81 等選項,導致建立過程時系統表寫入失敗。

預防建議

  • MySQL 升級後務必執行 mysql_upgrade 修正系統表結構
  • phpMyAdmin 版本需與 MySQL 版本匹配
  • 定期備份 mysql 系統庫

修復系統表結構是解決「Failed to create procedure」最直接有效的方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved