binary 與 varbinary 類型和char與varchar類型是相似的,只是他們存儲的是二進制數據,也就是說他們是包含字節流而不是字符流,他們有二進制字符的集合和順序,他們的對比,排序是基於字節的數值進行的
binary與varbinary的最大長度和char與varchar是一樣的,只不過他們是定義字節長度,而char和varchar對應的是字符長度。
存儲和取出時對尾部空格的處理
char(N)用來存儲非二進制字符串,插入時,對於少於N個字符的會自動在尾部加空格,查詢時,尾部的空格就會被丟棄掉
vachar(N) 用來存儲非二進制字符串,插入時,對於少於N個字符的不填補空格,查詢時,尾部的空格不會被丟棄掉
binary(N)存儲二進制字符串,插入進,少於N個字節的會自動在尾部加0x00,取出時,所有的字節都保留,返回定義長度的字節長度,在比較的時候,所有的字節都是有效的,並且0x00<space (space對應的是0x20)
varbinary在插入不會去填補0x00字節,查詢的時候也不會丟棄任何字節,在比較的時候,所有的字節都是有效的,並且0x00<space (space對應的是0x20)
大小比較時
char與varchar的字符比較中,是忽略大小寫與最后的空格的,如:
mysql> select 'a'='a ' , 'a'='A' , 'a'='A ';
+----------+---------+----------+
| 'a'='a ' | 'a'='A' | 'a'='A ' |
+----------+---------+----------+
| 1 | 1 | 1 |
+----------+---------+----------+
1 row in set (0.00 sec)
而binary及varbinary的字節比較中,所有的信息都不會被忽略,如:
mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)
mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 | 0 | 1 |
+--------+---------+-------------+
1 row in set (0.08 sec)