MYSQL学习:varchar最大长度限制规则
发布时间:2019-04-13浏览次数:1062
<p>
</p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#fdfddf">
<font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySQL中varchar最大长度是多少?</font>
</td>
</tr></tbody></table>
<p><span style="FONT-SIZE: 12pt" lang="zh-CN">这不是一个固定的数字。本文简要说明一下限制规则。</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">strlen 计算字符串长度,一个中文当2字符</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">mb_strlen根据它的字符编码模式,统计字符quot</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">count计算数组中的元素数目或对象中的属性个数</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN"><?php<br>header('Content-Type:text/html;charset=UTF-8');<br>$string1="谢春业";//定义中文字符变量<br>$string2="xcy";//定义英文字符变量<br>//直接输出看看他们的长度<br>echo strlen($string1);<br>echo "</br>";<br>echo strlen($string2);<br>echo "</br>";</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">//用 php 多字节扩展函数 mb_strlen试试看<br>echo mb_strlen($string1,'utf8');<br>echo "</br>";<br>echo mb_strlen($string2,'utf8');<br>echo "</br>";</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN"></span><span style='FONT-FAMILY: "times new roman"; COLOR: rgb(128,128,128); FONT-SIZE: 10pt' lang="-none-"></span><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">?></span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN"></span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">输出结果是:</span></p>
<p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">9<br>3<br>3<br>3</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">1、限制规则</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">字段的限制在字段定义的时候有以下规则:</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">a)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">存储限制</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">b)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">编码长度限制</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span"> 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN"> 对于英文比较多的</span><span style="FONT-SIZE: 12pt" lang="zh-CN">论坛</span><span style="FONT-SIZE: 12pt" lang="zh-CN"> ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span"> 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">c)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">行长度限制</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span"> 导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span"> 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。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">2、计算例子</span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span"> 举两个例说明一下实际长度的计算。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">a)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">若一个表只有一个varchar类型,如定义为</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">create table t4(c varchar(N)) charset=gbk;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">则此处N的最大值为(65535-1-2)/2=</span><span lang="zh-CN">32766</span><span style="FONT-SIZE: 12pt" lang="zh-CN">。</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减1的原因是实际行存储从第二个字节开始’;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减2的原因是varchar头部的2个字节表示长度;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">除2的原因是字符编码是gbk。</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN"></span></p>
<p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">b)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">若一个表定义为</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">则此处N的最大值为 (65535-1-2-4-30*3)/3=21812</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减1和减2与上例相同;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减4的原因是int类型的c占4个字节;</span></p>
<p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减30*3的原因是char(30)占用90个字节,编码是utf8。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p>
<p style="TEXT-ALIGN: left" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。</span></p>