You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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这个说法,常见的整数类型按范围从小到大是:tinyintsmallintmediumintintbigint。以后要定义长整数,直接用bigint就对了,别再踩这个别名的坑啦!

内容的提问来源于stack exchange,提问作者xingbin

火山引擎 最新活动