开发者社区> 问答> 正文

mysql创建数据表,varchar(2000)报错1118?报错

mysql创建数据表时发生错误。

字符集:utf-8

补充一下:

mysql版本:Ver 14.14 Distrib 5.1.65, for Win64 (unknown)

错误语句:

CREATE TABLE `NewTable` (
`goods_id`  int(11) UNSIGNED NULL AUTO_INCREMENT ,
`cat_id`  int(11) NULL ,
`type_id`  int(11) NULL ,
`brand_id`  int(11) NULL ,
`goods_brand`  varchar(200) NULL ,
`goods_brief`  varchar(1000) NULL ,
`goods_info`  varchar(2000) NULL ,
`goods_price`  int(10) NULL ,
PRIMARY KEY (`goods_id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
CHECKSUM=0
DELAY_KEY_WRITE=0
;    
将varchar中的字符长度,改为200,就可以正常使用了。
这是什么原因?mysql创建长度为2000的varchar字段,应该是没有问题的啊。

展开
收起
爱吃鱼的程序员 2020-06-22 14:30:10 1419 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    mysql5.0.3及以前版本varchar类型最大长度是255字符,

    之后版本理论上长度可取值范围是1到65535字节,但实际上不可能取到这么大的值,原因是65535字节是mysql1行数据占用的长度。所以单个字段是不可能占用这么大的空间的。

    那如果是你设置的值过大,mysql怎么处理呢?

    根据设置的sql_mode不同会有两种情况:

    • mysql会把varchar类型转成text类型并产生一个warning;
    • MySQL报错;
    学习回复 @喂马:如果utf8的话一行最大长度为21845,gbk的32767,然后多字段平分?回复 @苏生不惑:这个是和字符集有关系的,因为65535指的是字节,所以具体能有多少个字符你可以尝试一下如果一行只有一个字段,那就可以到65535了?

    你的mysql知识上哪学的?

    体育老师教的?  varchar最大255.

    回复 @小虫0302:真不知道你们怎么当上程序员的呵呵,你的经验是老黄历了。确认一下你mysql的版本?

    1118是行的长度过长,这个异常返回的说明里面会告诉你限制是多少,和mysql版本,引擎和编码都有关系。不过你这个语句在5.6上执行我并没有发现有报错。

    引用来自“逝水fox”的答案

    1118是行的长度过长,这个异常返回的说明里面会告诉你限制是多少,和mysql版本,引擎和编码都有关系。不过你这个语句在5.6上执行我并没有发现有报错。

    我测试了下mysql5.0.45
    按你的sql执行后没问题

    mysql>descnewtable;+-------------+------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------------+------------------+------+-----+---------+----------------+|goods_id|int(11)unsigned|NO|PRI|NULL|auto_increment||cat_id|int(11)|YES||NULL|||type_id|int(11)|YES||NULL|||brand_id|int(11)|YES||NULL|||goods_brand|varchar(200)|YES||NULL|||goods_brief|varchar(1000)|YES||NULL|||goods_info|varchar(2000)|YES||NULL|||goods_price|int(10)|YES||NULL||+-------------+------------------+------+-----+---------+----------------+8rowsinset(0.01sec) mysql>insertintonewtablesetgoods_info='MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0';QueryOK,1rowaffected(0.00sec) mysql>selectlength(goods_info)fromnewtablewheregoods_id=1;+--------------------+|length(goods_info)|+--------------------+|680|+--------------------+1rowinset(0.00sec)


    引用来自“苏生不惑”的答案

    我测试了下mysql5.0.45
    按你的sql执行后没问题

    mysql>descnewtable;+-------------+------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------------+------------------+------+-----+---------+----------------+|goods_id|int(11)unsigned|NO|PRI|NULL|auto_increment||cat_id|int(11)|YES||NULL|||type_id|int(11)|YES||NULL|||brand_id|int(11)|YES||NULL|||goods_brand|varchar(200)|YES||NULL|||goods_brief|varchar(1000)|YES||NULL|||goods_info|varchar(2000)|YES||NULL|||goods_price|int(10)|YES||NULL||+-------------+------------------+------+-----+---------+----------------+8rowsinset(0.01sec) mysql>insertintonewtablesetgoods_info='MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0';QueryOK,1rowaffected(0.00sec) mysql>selectlength(goods_info)fromnewtablewheregoods_id=1;+--------------------+|length(goods_info)|+--------------------+|680|+--------------------+1rowinset(0.00sec)


    为啥不用text类型?顶我是来看评论的

    引用来自“mark35”的答案

    为啥不用text类型?
    2020-06-22 14:30:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像