
varchar存盤MySQL字串型別資料,
本文基于MySQL 5.7x
varchar有以下特點:
- MySQL規定:一行資料的最大長度是65535位元組,注意,是位元組(byte),text、blob等大欄位型別除外,
- varchar的存盤需要單獨記錄其長度,是在列之外占用的空間,但包括在每行總位元組數限制內,
- 占用空間和使用字符集相關
- gbk(每字符占用2位元組)
- utf8(每字符占用3位元組)
- utf8mb4(每字符占用4位元組)
為什么是 varchar(255)?
以varchar(255)為例,這里的255表示字符數,假設字符集是utf8,那么存盤漢字占用的位元組數是255*3=765,那么為什么我們看到有很多情況資料庫里的varchar欄位長度是255呢?
每個業務場景可能有特定的原因,但是設定為255有一些優點:
- 在utf8字符集下,每個字符占3位元組,
- mysql innodb引擎的每個索引列長度限制為767位元組(bytes),255*3=765,255恰好是不超過索引長度限制的最大長度,
- 節省1byte空間,varchar欄位需要單獨記錄其長度,1byte(8bit)無符號可表示的最大數是2^8-1=255,如果超過255(小于512)則需要多申請1byte來記錄欄位長度,
該用char還是varchar?
char:定長字串
varchar:可變長字串
char和varchar區別,以char(32)和varchar(32)舉例:
| char(32) | varchar(32) | |
|---|---|---|
| 占用空間 | 固定32字符1(如果資料長度不夠32將用空格補齊) | 跟隨實際存盤內容長度,但不超過32 |
| 空格處理 | 檢索時會去掉尾部空格(資料本身有空白符也會被去掉) | 不會對空格處理 |
| 是否記錄欄位長度 | 否 | 是,額外拿出空間記錄欄位資料長度(字符數) |
| 適用場景 | 存盤的資料長度基本一致,不需要空格,eg 手機號、UUID、密碼加密后的密文 | 資料長度不一定,長度范圍變化較大的場景 |
占用空間需根據字符集轉換為位元組,以utf8為例,每字符占3位元組, ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21946.html
標籤:其他
上一篇:MySQL實操
