MySQL VARCHAR型別欄位到底可以定義多長
MySQL 單行行長最大是65535,不包含TEXT,BLOB型別。
varchar 長度小於255時,需要額外使用1位元組儲存長度,大於255時,需要 額外使用2位元組儲存長度。
varchar 欄位如果不定義not null 時,預設null也需要佔1位元組
lantin1字符集儲存的每個值佔1位元組
gbk 字符集儲存的每個值佔2位元組
utf8 字符集儲存的每個值佔3位元組
那麼一行varchar到底可以定義多長呢?
lantin1長度=65535-儲存長度大小 - default NULL大小
gbk長度=(65535-儲存長度大小 - default NULL大小)/2
utf8長度=(65535-儲存長度大小 - default NULL大小)/3
舉例說明:
lantin1情況
lantin1 varchar設定兩個欄位sno小於255( 額外使用1位元組儲存長度),sname大於255( 額外使用2位元組儲存長度),所以單行varchar最大長度為:
mysql> select 65535-1-2; +-----------+ | 65535-1-2 | +-----------+ | 65532 | +-----------+ 1 row in set (0.00 sec)
sno varchar(1) not null+sname varchar(65531) not null=65532,建表成功
mysql> create table my8(sno varchar(1) not null,sname varchar(65531) not null, primary key(sno)) CHARSET=latin1; Query OK, 0 rows affected (0.03 sec) mysql> drop table my8 ; Query OK, 0 rows affected (0.01 sec)
再看sno varchar(1) not null+sname varchar(65532) not null>65532,建表失敗
mysql> create table my8(sno varchar(1) not null,sname varchar(65532) not null, primary key(sno)) CHARSET=latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
如指定 not null sno varchar(1) sname varchar(65531) 就不行,因為有一個隱含的default null還佔用1位元組,建表失敗
mysql> create table my8(sno varchar(1),sname varchar(65531) , primary key(sno)) CHARSET=latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
UTF8情況
UTF8 varchar設定兩個欄位sno小於255(額外使用1位元組儲存長度),sname大於255(額外使用2位元組儲存長度),utf8字符集儲存的每個值佔3位元組,所以單行varchar最大長度為:
mysql> select (65535-1-2)/3; +---------------+ | (65535-1-2)/3 | +---------------+ | 21844.0000 | +---------------+ 1 row in set (0.00 sec)
sno varchar(1) not null+sname varchar(21844) not null>21844,建表失敗
mysql> create table my8(sno varchar(1) not null,sname varchar(21844) not null, primary key(sno)) CHARSET=utf8; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
sno varchar(1) not null+sname varchar(21843) not null=21844,建表成功
mysql> create table my8(sno varchar(1) not null,sname varchar(21843) not null, primary key(sno)) CHARSET=utf8; Query OK, 0 rows affected (0.02 sec)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2723947/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql varchar型別欄位為什麼經常定義為255MySql型別
- MySQL中欄位型別與合理的選擇欄位型別;int(11)最大長度是多少?varchar最大長度是多少?MySql型別
- mysql變長型別欄位varchar值更新變長或變短底層檔案儲存原理MySql型別
- 聯機重定義修改欄位型別(NVARCHAR2->VARCHAR2)型別
- varchar or blob:欄位型別的儲存和溢位條件型別
- 多型關聯自定義的型別欄位的處理多型型別
- mysql中varchar型別最大長度測試MySql型別
- mysql的varchar欄位最大長度真的是65535嗎?MySql
- MySQL欄位型別最全解析MySql型別
- MySQL欄位型別小記MySql型別
- Oracle varchar2型別欄位插入插入過長資料丟失問題Oracle型別
- varchar型別的欄位儲存純數字的排序型別排序
- mysql表操作(alter)/mysql欄位型別MySql型別
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- 關於mysql varchar 型別的最大長度限制MySql型別
- [轉]MySQL 欄位型別參考MySql型別
- Oracle 修改欄位型別和長度Oracle型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- mysql字元型別varchar()比較MySql字元型別
- DM8 varchar型別長度型別
- 如何將varchar2修改為clob型別欄位(使用long過渡)型別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- 例項操作mysql varchar型別求和MySql型別
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- 【原創】Oracle number date varchar2欄位型別佔用空間大小Oracle型別
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- MongoDB更改欄位型別MongoDB型別
- oracle的欄位型別Oracle型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- mysql的text欄位長度MySql
- sql語句修改欄位型別和增加欄位SQL型別
- MySQL CHAR和VARCHAR資料型別介紹MySql資料型別
- date、timestamp欄位型別型別
- 資料欄位型別匹配型別
- 修改表的欄位型別型別
- sqlite sql 修改欄位型別SQLite型別