Mysql中文亂碼以及建立外來鍵報1215
阿新 • • 發佈:2018-12-28
今天使用Mysql報兩個錯誤,這裡記錄一下。
1、使用insert語句以及sqlyog插入中文字元顯示亂碼,核對資料庫編碼是utf8,
建表語句也設定了引擎和預設字符集:
CREATE TABLE `department` ( `id` VARCHAR(32) NOT NULL, `created_date` DATE DEFAULT NULL, `updated_date` DATE DEFAULT NULL, `dept_name` VARCHAR(100) DEFAULT NULL, `dept_code` VARCHAR(300) DEFAULT NULL, `parent_dept_id` VARCHAR(32) DEFAULT NULL, `sort` INT(2) DEFAULT NULL, `del_flag` INT(1) DEFAULT '0', `creator_id` VARCHAR(32) DEFAULT NULL, `updater_id` VARCHAR(32) DEFAULT NULL, `content` VARCHAR(255) DEFAULT NULL, `enable` INT(1) NOT NULL DEFAULT '1', `has_child` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FKfah4pv78w9qc8lmb9pwhg8iel` (`parent_dept_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8
始終沒找到原因,後來檢查建表語句發現欄位也要加上字符集型別才行。。如下所示欄位設定為CHARACTER SET utf8字符集
CREATE TABLE `department` ( `id` VARCHAR(32) CHARACTER SET utf8 NOT NULL, `created_date` DATE DEFAULT NULL, `updated_date` DATE DEFAULT NULL, `dept_name` VARCHAR(100) CHARACTER SET utf8 DEFAULT NULL, `dept_code` VARCHAR(300) CHARACTER SET utf8 DEFAULT NULL, `parent_dept_id` VARCHAR(32) CHARACTER SET utf8 DEFAULT NULL, `sort` INT(2) DEFAULT NULL, `del_flag` INT(1) DEFAULT '0', `creator_id` VARCHAR(32) CHARACTER SET utf8 DEFAULT NULL, `updater_id` VARCHAR(32) CHARACTER SET utf8 DEFAULT NULL, `content` VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL, `enable` INT(1) NOT NULL DEFAULT '1', `has_child` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FKfah4pv78w9qc8lmb9pwhg8iel` (`parent_dept_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8
2、表建立外來鍵報1215錯誤
一張表比如department_in_role,包含兩個外來鍵dept_id和role_id分別引用department表的主鍵id和role表的主鍵id,在建立外來鍵引用role表和department表時,對role表的外來鍵建立成功但是對department表的外來鍵始終不成功,百思不得其解,沒辦法只能一個個排除,檢查欄位型別、長度是否一致,還真發現了問題,同樣是看建表語句,其中department的dept_id欄位包含COLLATE utf8_bin 設定,但是department表的主鍵id建表語句中id欄位不包含COLLATE utf8_bin。。而role表引用成功的原因就是role表的id欄位包含COLLATE utf8_bin。
這裡也長了個教訓,建表時風格要統一,否則會出現各種意想不到的問題。。