程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql VARCHAR的最年夜長度究竟是若干

mysql VARCHAR的最年夜長度究竟是若干

編輯:MySQL綜合教程

mysql VARCHAR的最年夜長度究竟是若干。本站提示廣大學習愛好者:(mysql VARCHAR的最年夜長度究竟是若干)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql VARCHAR的最年夜長度究竟是若干正文


之前一向都以為有兩個字節來記載長度(長度小也能夠用一個字節記載),所以這個成績其時認為就挺無聊的不外後來群裡有人給懂得釋,忽然才發明本來工作不是這麼簡略

MYSQL COMPACT格局,每筆記錄有一個字節來表現NULL字段散布,假如表中有字段許可為空,則最年夜只能定到65532,假如沒有字段許可為空,則誰人字節可以節儉,最年夜可以界說到65533,不曉得是否是這個緣由

因而上彀看了些材料,又在當地做了些試驗,本來vachar的最年夜長度真的是不定的(依據能否有非空字段來決議)
在當地做了下試驗,innodb+latin的情況


-- success
drop table if exists test;
create table test(name varchar(65533) not null)engine=innodb DEFAULT CHARSET=latin1
-- too large
drop table if exists test;


create table test(name varchar(65533))engine=innodb DEFAULT CHARSET=latin1
關於第二種情形,許可空字段的時刻是不克不及加到65533的長度的,最年夜只能到65532,究竟應當是引文的那種說法。

網上也有人做了相似的試驗,參考http://stackoverflow.com/questions/8295131/best-practise-for-sql-varchar-column-length

name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1)
name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1)
name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1)
name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte

總結一下,本來mysql的vachar字段的類型固然最年夜長度是65535,然則其實不是能存這麼多半據,最年夜可以到65533(不許可非空字段的時刻),當許可非空字段的時刻只能到65532。

以下是其它網友的彌補解釋:

這不是一個固定的數字。本文扼要解釋一上限制規矩。

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。
  關於英文比擬多的服裝論壇t.vhao.net ,應用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”了。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved