標籤:sorted ant text any 資料 without byte 個數 contex
字元類型
#官網:https://dev.mysql.com/doc/refman/5.7/en/char.html#注意:char和varchar括弧內的參數指的都是字元的長度#char類型:定長,簡單粗暴,浪費空間,存取速度快 字元長度範圍:0-255(一個中文是一個字元,是utf8編碼的3個位元組) 儲存: 儲存char類型的值時,會往右填充空格來滿足長度 例如:指定長度為10,存>10個字元則報錯,存<10個字元則用空格填充直到湊夠10個字元儲存 檢索: 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們開啟pad_char_to_full_length SQL模式(SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH‘;)#varchar類型:變長,精準,節省空間的,存取速度慢 字元長度範圍:0-65535(如果大於21845會提示用其他類型 。mysql行最大限制為65535位元組,字元編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 儲存: varchar類型儲存資料的真實內容,不會用空格填充,如果‘ab ‘,尾部的空格也會被存起來 強調:varchar類型會在真實資料前加1-2Bytes的首碼,該首碼用來表示真實資料的bytes位元組數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大位元組限制,即已經足夠使用) 如果真實的資料<255bytes則需要1Bytes的首碼(1Bytes=8bit 2**8最大表示的數字為255) 如果真實的資料>255bytes則需要2Bytes的首碼(2Bytes=16bit 2**16最大表示的數字為65535) 檢索: 尾部有空格會儲存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容
基本知識
官網解釋如下
測試前瞭解兩個函數
length:查看位元組數char_length:查看字元數
1. char填充空格來滿足固定長度,但是在查詢時卻會很不要臉地刪除尾部的空格(裝作自己好像沒有浪費過空間一樣),然後修改sql_mode讓其現出原形
mysql> create table t1(x char(5),y varchar(5));Query OK, 0 rows affected (0.26 sec)#char存5個字元,而varchar存4個字元mysql> insert into t1 values(‘你瞅啥 ‘,‘你瞅啥 ‘);Query OK, 1 row affected (0.05 sec)mysql> SET sql_mode=‘‘;Query OK, 0 rows affected, 1 warning (0.00 sec)#在檢索時char很不要臉地將自己浪費的2個字元給刪掉了,裝的好像自己沒浪費過空間一樣,而varchar很老實,存了多少,就顯示多少mysql> select x,char_length(x),y,char_length(y) from t1; +-----------+----------------+------------+----------------+| x | char_length(x) | y | char_length(y) |+-----------+----------------+------------+----------------+| 你瞅啥 | 3 | 你瞅啥 | 4 |+-----------+----------------+------------+----------------+row in set (0.00 sec)#略施小計,讓char現出原形mysql> SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH‘;Query OK, 0 rows affected (0.00 sec)#這下子char原形畢露了......mysql> select x,char_length(x),y,char_length(y) from t1;+-------------+----------------+------------+----------------+| x | char_length(x) | y | char_length(y) |+-------------+----------------+------------+----------------+| 你瞅啥 | 5 | 你瞅啥 | 4 |+-------------+----------------+------------+----------------+row in set (0.00 sec)#char類型:3個中文字元+2個空格=11Bytes#varchar類型:3個中文字元+1個空格=10Bytesmysql> select x,length(x),y,length(y) from t1;+-------------+-----------+------------+-----------+| x | length(x) | y | length(y) |+-------------+-----------+------------+-----------+| 你瞅啥 | 11 | 你瞅啥 | 10 |+-------------+-----------+------------+-----------+row in set (0.00 sec)
View Code
2. 雖然 CHAR 和 VARCHAR 的儲存方式不太相同,但是對於兩個字串的比較,都只比 較其值,忽略 CHAR 值存在的右填充,即使將 SQL _MODE 設定為 PAD_CHAR_TO_FULL_ LENGTH 也一樣,,但這不適用於like
Values in CHAR and VARCHAR columns are sorted and compared according to the character set collation assigned to the column.All MySQL collations are of type PAD SPACE. This means that all CHAR, VARCHAR, and TEXT values are compared without regard to any trailing spaces. “Comparison” in this context does not include the LIKE pattern-matching operator, for which trailing spaces are significant. For example:mysql> CREATE TABLE names (myname CHAR(10));Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO names VALUES (‘Monty‘);Query OK, 1 row affected (0.00 sec)mysql> SELECT myname = ‘Monty‘, myname = ‘Monty ‘ FROM names;+------------------+--------------------+| myname = ‘Monty‘ | myname = ‘Monty ‘ |+------------------+--------------------+| 1 | 1 |+------------------+--------------------+row in set (0.00 sec)mysql> SELECT myname LIKE ‘Monty‘, myname LIKE ‘Monty ‘ FROM names;+---------------------+-----------------------+| myname LIKE ‘Monty‘ | myname LIKE ‘Monty ‘ |+---------------------+-----------------------+| 1 | 0 |+---------------------+-----------------------+row in set (0.00 sec)
View Code
3. 總結
#常用字串系列:char與varchar註:雖然varchar使用起來較為靈活,但是從整個系統的效能角度來說,char資料類型的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,使用者在設計資料庫時應當綜合考慮各方面的因素,以求達到最佳的平衡#其他字串系列(效率:char>varchar>text)TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXTBLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB BINARY系列 BINARY VARBINARYtext:text資料類型用於儲存變長的大字串,可以組多到65535 (2**16 − 1)個字元。mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
View Code
8.3.4 - mysql 字串