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类型?