MySQL varchar计算:求列的数目和计算N的最大值

本文详细解析了MySQL中VARCHAR类型字段的最大长度计算方法,尤其是在UTF8编码下的具体计算过程,并给出了具体的公式及实例。
有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?
先明白计算的一些规则限制

① 存储限制
    需要额外地在长度列表上存放实际的字符长度:小于255为1个字节,大于255则要2个字节
② 编码限制
    gbk:每个字符最多占用2个字节
    utf8:每个字符最多占用3个字节
③ 长度限制
    MySQL定义行的长度不能超过65535,这个限制了列的数目,比如char(255) utf8
    那么列的数目最多有65535/(255*3)=85,列的数目可以从这里得到依据
   
行长度计算公式如下:
row length = 1
                   + (sum of column lengths)
                   + (number of NULL columns + delete_flag + 7)/8
                   + (number of variable-length columns)
① 对于MyISAM,需要额外1个位来记录值是否为NULL;对于InnoDB,没有区别
② 对于row_format为fixed,delete_flag为1;对于row_format=dynamic,delete_flag为0

根据这个公式,我们便能够解答开头N的最大值:(65535-1-2)/3
减1是因为实际存储从第2个字节开始
减2则因为要在列表长度存储实际字符长度
除3是因为utf8编码限制

再来一道:
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
N的最大值:(65535-1-2-4-30*3)/3

参考资料
http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html
http://dinglin.iteye.com/blog/914276


By 迦夜
2013-10-21 
Good Luck
### 如何在 MySQL计算字段的字符长度或字节长度 在 MySQL 中,可以通过不同的函数来分别计算字段的 **字符长度** **字节长度**。 #### 字符长度 要获取字段的字符长度,可以使用 `CHAR_LENGTH()` 或者 `CHARACTER_LENGTH()` 函数。这两个函数的功能相同,返回字符串中字符的数量,而不考虑字符集的影响[^2]。 ```sql SELECT CHAR_LENGTH(field_name) AS char_length FROM table_name; ``` 或者: ```sql SELECT CHARACTER_LENGTH(field_name) AS char_length FROM table_name; ``` #### 字节长度 如果需要获取字段的实际存储字节数,则应使用 `LENGTH()` 函数。此函数返回字符串占用的字节数量,具体取决于字符集编码方式[^1]。 ```sql SELECT LENGTH(field_name) AS byte_length FROM table_name; ``` 对于多字节字符集(如 UTF-8),单个字符可能会占用多个字节,因此同一个字段的 `CHAR_LENGTH` 值通常小于等于其对应的 `LENGTH` 值。 #### 示例查询 假设有一个表名为 `example_table` 的表,其中有一 `attach_id` 是 VARCHAR 类型的数据,下面是一个综合示例查询,展示如何同时获得该字段的字符长度字节长度: ```sql SELECT attach_id, CHAR_LENGTH(attach_id) AS char_len, LENGTH(attach_id) AS byte_len FROM example_table; ``` 通过上述语句可以获得每条记录中 `attach_id` 的字符数以及它所占有的实际字节数。 #### 特殊情况说明 需要注意的是,在某些旧版 MySQL 数据库中 (比如 4.x),VARCHAR 定义中的括号内的数值代表的是字节长度而非字符数量。而在现代版本的 MySQL 中 (5.x 及以上),这一参数已经改为表示最大允许的字符数目,无论这些字符是由多少字节组成[^3]。 另外,整数类型的定义形式如 INT(6) 并不意味着限制了存储值的有效位数为六位;这里的 "(6)" 实际上仅用于显示宽度控制,并不影响数据本身的取值范围或是物理存储空间大小。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值