php中strlen,mb_strlen,count之区别

转自 http://www.cnblogs.com/mo-beifeng/archive/2011/08/09/2133039.html

这不是一个固定的数字。本文简要说明一下限制规则。

strlen 计算字符串长度,一个中文当2字符

mb_strlen根据它的字符编码模式,统计字符quot

count计算数组中的元素数目或对象中的属性个数

<?php
header(‘Content-Type:text/html;charset=UTF-8‘);
$string1="谢春业";//定义中文字符变量
$string2="xcy";//定义英文字符变量
//直接输出看看他们的长度
echo strlen($string1);
echo "</br>";
echo strlen($string2);
echo "</br>";

//用 php 多字节扩展函数 mb_strlen试试看
echo mb_strlen($string1,‘utf8‘);
echo "</br>";
echo mb_strlen($string2,‘utf8‘);
echo "</br>";

?>

输出结果是:

9
3
3
3

1、限制规则

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

a)    存储限制

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

b)    编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

  字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

  对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

  若定义的时候超过上述限制,则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-28 19:25:24

php中strlen,mb_strlen,count之区别的相关文章

SQL语句中SUM与COUNT的区别

SUM是对符合条件的记录的数值列求和 COUNT 是对查询中符合条件的结果(或记录)的个数 例如: 表fruit id     name    price 1     apple     3.00 2     pear       4.00 select count(price) from fruit; ----执行之后结果为:2  (表示有2条记录) select  sum(price) from fruit;---执行之后结果为:7:00(表示各记录price字段之和为7.00) SQL语句

C#中Length和Count的区别(个人观点)

这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家对这个话题的看法,如果不信的话,你还真搜不到类似的文章,反正我是没搜索到. 也许有些观点是错的,或者不正确的,还请指出:我的观点是: Length:用于计算连续内存区域的一些“对象”的长度,而使用Count()计算非连续内存块的对象集合的“个数”: Length是这个集合对象的一个特有的属性,它 继

细说PHP中strlen和mb_strlen的区别

原文:细说PHP中strlen和mb_strlen的区别 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别.下面通过例子,讲解这两者之间的区别. $str='中文a字1符'; echo strlen($str);//字节个数 ,14 echo mb_strlen($str,'UTF-8');//选定内码为UTF-8,中文作为一个字节,6 echo mb_strlen($str,'gbk'); //8 echo mb_s

mysql中的count(primary_key)、count(1)、count(*)的区别

表结构如下: mysql> show create table user\G; *************************** 1. row *************************** Table: user Create Table: CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `pwd` varchar(50) NOT N

mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:  代码如下 复制代码 mysql> SELECT SQL_CA

php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:  代码如下 复制代码 mysql> SELECT SQL_CA

Ado.net中DataSet和SqlDataReader的区别

概述: 一,SqlDataReader //基于连接,只读访问 适合数据量较小. SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库.要求资源也大一点 二,SqlDataAdapter 读取数据后将数据集放入DataSet ,DataSet 的数据存在本地客服机内存. 三,SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到. SqlDataAdapter返回的是数据集或者表,可以对其中的

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 

SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别

原文:SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方式的用法. 先建立一个表,并添加一些数据来进行演示: CREATE TABLE t_student( Id INT NOT NULL, Name NVARCHAR (10) NULL, Age TINYINT NULL, School NVARCHAR(20) NULL, Class NVAR