char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
| addr | char(8) | YES | | NULL | |
| bn | varbinary(4) | YES | | NULL | |
| b | binary(8) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+----------------------+----------------------+
| concat("$",name,"$") | concat("$",addr,"$") |
+----------------------+----------------------+
| $asdf$ | $a$ |
| $asdf$ | $a$ |
| $a $ | $a$ |
| $a$ | $a$ |
| $t a$ | $a$ |
+----------------------+----------------------+
mysql> select * from zcy where name='a '; //由于name是varchar,比较时,'a '自动转换为'a'
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
mysql> select * from zcy where name='a';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节
进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速
按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格
mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 5 | t a | a | NULL | a |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
varbinary保存变长的字符串,后面不会补\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.01 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 2 | asdf | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.00 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
1 row in set (0.00 sec)
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM tbl_name
-> ORDER BY comment;
当你想要使超过max_sort_length的字节有意义,对含长值的BLOB或TEXT列使用GROUP BY或ORDER BY的另一种方式是将列值转换为固定长度的对象。标准方法是使用SUBSTRING函数。例如,下面的语句对comment列的2000个字节进行排序:
mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name
-> ORDER BY SUBSTRING(comment,1,2000);
· BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。例如,可以使用mysql和mysqldump来更改客户端的max_allowed_packet值。