今天使用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。
这里也长了个教训,建表时风格要统一,否则会出现各种意想不到的问题。。