Mysql varchar长度问题

http://dinglin.iteye.com/blog/914276

http://www.cnblogs.com/fakis/archive/2011/03/07/1976532.html

如果某一项中设置的是varchar(50)

那么对英文当然是50

那么对中文呢

utf-8的中文占3个字节

那么,这个varchar(50)是不是只能存16个汉字了?

不是这样的,mysql低版本之前是这样的,但是5.0以后就不是了

mysql varchar(50)  不管中文 还是英文 都是存50个的,但是一个表中所有varchar字段的总长度跟编码有关,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2.

MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是65,532字节)。

为何会这般变换?真是感觉MySQL的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。

MySQL中varchar最大长度是多少?这不是一个固定的数字。本文简要说明一下限制规则。

1、限制规则

字段的限制在字段定义的时候有以下规则:

a)  
存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,实际存储从第二个字节开始,接着要用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b)  
编码长度限制

字符类型若为gbk,每个字符最多占2个字节

字符类型若为utf8,每个字符最多占3个字节

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c)  
行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

2、计算例子

举两个例说明一下实际长度的计算。

a)                  若一个表只有一个varchar类型,如定义为

create table t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766。

减1的原因是实际行存储从第二个字节开始’;

减2的原因是varchar头部的2个字节表示长度;

除2的原因是字符编码是gbk。

b)                  若一个表定义为

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

减1和减2与上例相同;

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是utf8。

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

时间: 2024-10-13 01:19:59

Mysql varchar长度问题的相关文章

MySQL的varchar长度问题

From: http://blog.csdn.net/longyulu/article/details/7863737 http://dinglin.iteye.com/blog/914276 http://www.cnblogs.com/fakis/archive/2011/03/07/1976532.html 如果某一项中设置的是varchar(50) 那么对英文当然是50 那么对中文呢 utf-8的中文占3个字节 那么,这个varchar(50)是不是只能存16个汉字了? 不是这样的,my

mysql varchar vs oracle varchar2

1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为数据库里的表设置的字符集不相同. 解决办法: varchar(10) ——>varchar(20) alter table `cms_activity_test` convert to character set gbk collate gbk_chinese_ci;(单独修改指定表的字符集) 其他

mysql varchar类型使用心得

自己的一个例子,在存储一个email的需求中.mysql定义的字段,类型:varchar 长度:20 当我插入一个email:[email protected]  发现怎么样都差不进去..后面才发现原来是字段长度20不够存放..下次要注意,当然,字段长度设定也不能过于大,够用即可. 以下为转发: 今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下. 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的最

mysql - varchar类型与数字的比较和转换

mysql - varchar类型与数字的比较和转换 convert(对象, 目标类型)是mysql中常用的类型转换对象函数.eg: select convert('1.123', decimal(10.4)),结果就是1.1230.对象可以用列名替代. 前两天发现,一个小伙伴之前设计表时把某个表数据类型设计成了varchar,实际用于存储Decimal.我需要用其数据进行过滤筛选 如果文章内容有问题,欢迎评论或与我进行讨论(请注明原因): mail: [email protected] 微信:

mysql sql长度限制解决

mysql sql长度限制解决 今天发现了一个错误: Could not execute JDBC batch update 最后发现原因是SQL语句长度大于1M,而我机器上的mysql是默认设置, 也就是说mysql通讯的数据包大小设置是1M,这就造成sql语句执行失败. 于是把mysql的配置文件(my.ini)中的max_allowed_packet = 6M变大, 问题就解决了.

MYSQL VARCHAR排序 CAST ,CONVERT函数 类型转换

自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为integer(2)的,但是今天在后台发现排序有问题,varchar排序有问题,所以该怎么解决呢? 示例表结构: 先来看一下,我的表结构 show create table cardserver \G *************************** 1. row *************************** Table: cardserver Create Table: CREATE TABLE `card

关于mysql varchar类型的长度

char 定长  最多255字符  末尾的空格会被默认删除 何时选用char类型储存? 1 数据长度近似 如手机号 身份证 MD5加密后的值 2 短字符串 相对varchar可以节约一个储存长度的空间 3 频繁更新的字段  相对于varchar不会产生长度变化也就不会产生存储碎片 varchar varchar类型与char类型不同 为变长字符串 在字符长度不超过255时 使用一个字节存储长度 超过255时用两个字节存储长度 每行的varchar总和不得超过65535字节 如果想存储更长的字符串

MySql中的varchar长度究竟是字节还是字符

今天在设计表的时候,遇到个小问题,由于不知道未来将要存储的数据有多长(数据是通过第三方http接口提供的,根据sample显示,数据大概是如下:) 也就是6个字符. 我在设计表的时候,有点犹豫,本来准备设计为varchar(6),但担心是按字节计算的,会导致存不下.(数据库采用utf8编码) 于是自己试了下, 可以存放5个utf8字符.看来Mysql的varchar是按照字符来计算的. 然后也查阅了一下网上的答案: 也就是version4之前,按字节: version5之后,按字符.

MySQL索引长度限制问题

在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes. MySQL版本为Server version: 5.1.36, 执行SQL为: alter table pre_common_diy_data modify column targettplname varchar(255); 如果是按一个字符占两个字节计算 2*255=510 并没有超过1000字符,怎么会报错呢? 在查询相关资料后发现,MySQL MyI