使用long类型作为主键建表时出现BLOB/TEXT键规格错误
嘿,我之前刚好踩过这个坑!让我给你拆解下问题出在哪,以及怎么快速解决
为啥会出现这个奇怪的错误?
你肯定纳闷:我明明用的是long类型做主键,没碰TEXT/BLOB啊,怎么会报这个错?其实问题出在MySQL的类型别名坑上——你以为long是长整数类型,但在MySQL里,long其实是TEXT类型的同义词!
所以当你把weng_id定义为long并设为主键时,MySQL背地里把它当成了TEXT列处理。而TEXT作为索引(主键属于特殊的唯一索引)必须指定长度,你没给,自然就触发了1170 - BLOB/TEXT column 'weng_id' used in key specification without a key length这个错误。
怎么解决?
把weng_id的类型换成MySQL真正支持的长整数类型就行,这里推荐用bigint——这是MySQL里最大的标准整数类型,范围足够覆盖绝大多数场景;如果你的ID范围不需要这么大,用int也可以。
修正后的完整建表SQL
CREATE TABLE `ContentRepository`.`无标题` ( `weng_id` bigint NOT NULL, `content_type` tinyint(0) NOT NULL DEFAULT 0, `store_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0), `create_time` datetime(0) NOT NULL, `modify_time` datetime(0) NOT NULL, `weng_url` varchar(1000) NOT NULL, `algorithm_tags` varchar(1000) NULL, `words` varchar(1000) NULL, `operate_tags` varchar(1000) NULL, `mdd_id` bigint(0) NULL, `related_mdd_ids` varchar(1000) NULL, `related_pois` varchar(1000) NULL, `uid` bigint(0) NOT NULL, `user_level` tinyint(0) NOT NULL, `user_contribution_score` double NULL, `status` tinyint(0) NOT NULL, `check_status` tinyint(0) NULL, `checked_time` datetime(0) NULL, `static_score` double NULL, `static_level` int(0) NULL, `dynamic_level` int(0) NULL, `dynamic_score` double NULL, `show_channel` int(0) NULL, `show_num` bigint(0) NULL, `click_num` bigint(0) NULL, `favorite_num` bigint(0) NOT NULL, `comment_num` bigint(0) NOT NULL, `share_num` bigint(0) NOT NULL, `collect_num` bigint(0) NOT NULL, `weng_type` tinyint(0) NOT NULL, `pricture_urls` varchar(1000) NOT NULL, `video_url` varchar(1000) NULL, `content` varchar(8000) NULL, `weng_level` tinyint(0) NOT NULL, `weng_category` tinyint(0) NOT NULL, `picture_num` int(0) NOT NULL, PRIMARY KEY (`weng_id`), INDEX `idx_create`(`create_time`) USING BTREE, INDEX `idx_modify`(`modify_time`) USING BTREE, INDEX `idx_store`(`store_time`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
小提醒
MySQL的整数类型里没有long这个说法,常见的整数类型按范围从小到大是:tinyint、smallint、mediumint、int、bigint。以后要定义长整数,直接用bigint就对了,别再踩这个别名的坑啦!
内容的提问来源于stack exchange,提问作者xingbin




