1. 程式人生 > >Mysql中文亂碼以及建立外來鍵報1215

Mysql中文亂碼以及建立外來鍵報1215

今天使用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。

這裡也長了個教訓,建表時風格要統一,否則會出現各種意想不到的問題。。