同樣的字符在不同字符集下占用空間可能不同
默認的 latin1 字符集下,漢字占兩個字節,英文占1個字節。而在 gb2312 和 utf-8 等字符集下,英文也占兩個字節。從字符編碼的角度講似乎也無可非議,但是 MySQL 中這樣處理以前真沒有注意到過,char(10) 中的 10 正是按照字符集中的個數算的。處理數據量大的時候尤其需要注意,當然在 char 和 varchar 之間也可以權衡選擇。
tinyint 和 smallint mediaint int
無論你指定 tinyint(1) 還是 tinyint(2),一個 tinyint 字段中保存的值范圍都會是無符號時 0-255(有符號時 -127-128) ,其他 int 類型有類似情況。
PHPMyAdmin 顯示的”總計”不准確
這個應該不是 MySQL 的原因。在我 select * from innodb_table 的時候,顯示的“總計”數和 select count(*) from innodb_table 所得數可能不一致。這個以前也注意到過,之前還造成過幾次誤解。貌似並不是只有 InnoDB 表會出這樣的情況, MyISAM 表在 PHPMyAdmin 也有這樣的問題。
內存表
內存表有大小限制,內存文件超過 my.ini 中設置以後,會自動轉換部分到硬盤。內存表所占內存以固定的大小分配空間,即使一個表中只有一條記錄,也可能占幾M空間。內存表是有大小限制的,在 my.ini 中可以設置,當內存大小達到限制時,可能會報錯:#1114: The table ‘XXX’ is full 。上面是我實際遭遇到的,但是 my.ini 中有下面這段:
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=13M
MERG 表
只有 MyISAM 表可以 merge ,MERG 的所有子表表結構要求一致。
多表更新
比較新的版本才支持同時 update 多個表。比如這樣 update user_state, user_state2 set user_state.state_0507_db2 = user_state2.state_0507_db2 where user_state.qq = user_state2.QQ