MySQL中資料型別的驗證
CHAR
char (M) M字元,長度是M*字元編碼長度,M最大255。
驗證如下:
?
mysql> create table t1( name char (256)) default charset=utf8; ERROR 1074 (42000): Column length too big for column 'name' ( max = 255); use BLOB or TEXT instead mysql> create table t1( name char (255)) default charset=utf8; Query OK, 0 rows affected (0.06 sec) mysql> insert into t1 values (repeat( '整' ,255)); Query OK, 1 row affected (0.00 sec) mysql> select length( name ),char_length( name ) from t1; + --------------+-------------------+ | length( name ) | char_length( name ) | + --------------+-------------------+ | 765 | 255 | + --------------+-------------------+ 1 row in set (0.00 sec)
|
VARCHAR
VARCHAR(M),M同樣是字元,長度是M*字元編碼長度。它的限制比較特別,行的總長度不能超過65535位元組。
?
mysql> create table t1( name varchar (65535)); 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 mysql> create table t1( name varchar (65534)); 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 mysql> create table t1( name varchar (65533)); 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 mysql> create table t1( name varchar (65532)); Query OK, 0 rows affected (0.08 sec)
|
注意,以上表的預設字符集是latin1,字元長度是1個位元組,所以對於varchar,最大隻能指定65532位元組的長度。
如果是指定utf8,則最多隻能指定21844的長度
?
mysql> create table t1( name varchar (65532)) default charset=utf8; ERROR 1074 (42000): Column length too big for column 'name' ( max = 21845); use BLOB or TEXT instead mysql> create table t1( name varchar (21845)) default 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 mysql> create table t1( name varchar (21844)) default charset=utf8; Query OK, 0 rows affected (0.07 sec)
|
注意:行的長度最大為65535,只是針對除blob,text以外的其它列。
?
1234 |
mysql> create table t1( name varchar (65528),hiredate datetime) default 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 mysql> create table t1( name varchar (65527),hiredate datetime) default charset=latin1; Query OK, 0 rows affected (0.01 sec)
|
確實,datetime佔了5個位元組。
TEXT,BLOB
?
mysql> create table t1( name text(255)); Query OK, 0 rows affected (0.01 sec) mysql> create table t2( name text(256)); Query OK, 0 rows affected (0.01 sec) mysql> show create table t1G *************************** 1. row *************************** Table : t1 Create Table : CREATE TABLE `t1` ( ` name ` tinytext ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> show create table t2G *************************** 1. row *************************** Table : t2 Create Table : CREATE TABLE `t2` ( ` name ` text ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
|
透過上面的輸出可以看出text可以定義長度,如果範圍小於28(即256)則為tinytext,如果範圍小於216(即65536),則為text, 如果小於224,為mediumtext,小於232,為longtext。
上述範圍均是位元組數。
如果定義的是utf8字符集,對於text,實際上只能插入21845個字元
?
mysql> create table t1( name text) default charset=utf8; Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values (repeat( '整' ,21846)); ERROR 1406 (22001): Data too long for column 'name' at row 1 mysql> insert into t1 values (repeat( '整' ,21845)); Query OK, 1 row affected (0.05 sec)
|
DECIMAl
關於Decimal,官方的說法有點繞,
?
1 |
Values for DECIMAL ( and NUMERIC ) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes. Storage for the integer and fractional parts of each value are determined separately. Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes. The storage required for excess digits is given by the following table .
|
還提供了一張對應表
對於以上這段話的解讀,有以下幾點:
1. 每9位需要4個位元組,剩下的位數所需的空間如上所示。
2. 整數部分和小數部分是分開計算的。
譬如 Decimal(6,5),從定義可以看出,整數佔1位,整數佔5位,所以一共佔用1+3=4個位元組。
如何驗證呢?可透過InnoDB Table Monitor
如何啟動InnoDB Table Monitor,可參考:http://dev.mysql.com/doc/refman/5.7/en/innodb-enabling-monitors.html
?
mysql> create table t2(id decimal (6,5)); Query OK, 0 rows affected (0.01 sec) mysql> create table t3(id decimal (9,0)); Query OK, 0 rows affected (0.01 sec) mysql> create table t4(id decimal (8,3)); Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE innodb_table_monitor (a INT ) ENGINE=INNODB; Query OK, 0 rows affected, 1 warning (0.01 sec)
|
結果會輸出到錯誤日誌中。
檢視錯誤日誌:
對於decimal(6,5),整數佔1位,小數佔5位,一共佔用空間1+3=4個位元組
對於decimal(9,0),整數部分9位,每9位需要4個位元組,一共佔用空間4個位元組
對於decimal(8,3),整數佔5位,小數佔3位,一共佔用空間3+2=5個位元組。
至此,常用的MySQL資料型別驗證完畢~
對於CHAR,VARCHAR和TEXT等字元型別,M指定的都是字元的個數。對於CHAR,最大的字元數是255。對於VARCHAR,最大的字元數與字符集有關,如果字符集是latin1,則最大的字元數是65532(畢竟每一個字元只佔用一個位元組),對於utf8,最大的字元數是21844,因為一個字元佔用三個位元組。本質上,VARCHAR更多的是受到行大小的限制(最大為65535個位元組)。對於TEXT,不受行大小的限制,但受到自身定義的限制。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4560/viewspace-2811295/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- 銷售憑證中資料的類別
- mysql 中資料型別tinyint(2)括號中的數字意思MySql資料型別
- JS中資料型別轉換JS資料型別
- C語言中資料型別的自動型別轉換C語言資料型別
- 如何驗證Oracle資料庫中表的型別Oracle資料庫型別
- JS中資料型別檢測方法——typeofJS資料型別
- C中資料型別(Android之JNI)資料型別Android
- PHP中資料型別轉換的三種方式PHP資料型別
- 混合運算中資料型別的轉換 (轉)資料型別
- JavaScript中資料型別檢測方法盤點JavaScript資料型別
- XHTML 對文件型別(DOCTYPE)的驗證HTML型別
- JS中資料型別、內建物件、包裝型別物件、typeof關係JS資料型別物件
- C語言中資料型別轉換函式C語言資料型別函式
- MySQL 的資料型別MySql資料型別
- MySQL的資料型別MySql資料型別
- 6. 自定義容器型別元素驗證,類級別驗證(多欄位聯合驗證)型別
- JS中資料型別檢測四種方式的優缺點JS資料型別
- c語言中資料型別的自動轉換原則C語言資料型別
- 二進位制安全_C語言中資料型別C語言資料型別
- 異常:標準表示式中資料型別不匹配資料型別
- 驗證碼基礎(小遊戲型別)遊戲型別
- mysql 常用的資料型別MySql資料型別
- MYSQL 資料型別MySQL 資料型別
- [Mysql]資料型別MySql資料型別
- MySQL資料型別MySql資料型別
- 報錯:非介入式客戶端驗證規則中的驗證型別名稱必須唯一。下列驗證型別出現重複客戶端型別
- Mysql 資料型別之整數型別MySQL 資料型別
- 【MySQL資料型別3之--字元型別】MySql資料型別字元
- MVC驗證11-對複雜型別使用jQuery非同步驗證MVC型別jQuery非同步
- 【乾貨】驗證碼的常見型別總結型別
- 06. MySQL的資料型別MySql資料型別
- 【MySQL】資料型別的基本用法MySql資料型別
- 理解MySQL資料型別MySql資料型別
- MySQL基本資料型別MySql資料型別
- [Mysql] 3.Mysql 資料型別MySQL 資料型別
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- 【MySQL資料型別1之--數值型別】MySql資料型別