对于数据库来说,开发人员可能更多的属于不明真相的围观群众这类人。对于字段长度或许都有所了解,对于不同的字符集所占的位数也会明白一些,但究竟是不是你想象的那样,你又真的了解多少?
看看人家玄月写的文章吧。不要不承认,其实你我都一样,都是知其然不知其所以然,而且都是看着书然后人云亦云。有时候不测试不亲自动手是看不到真相的。当然我也仅转载。我也没有测试,其实我就在真相门外徘徊。
原文如下:
字符与字节的问题
1、表t1
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` char(1) DEFAULT NULL,
`b` binary(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1)插入数据:
mysql> insert into t1 values(’w',’w'),(’中’,'中’);
mysql> select * from t1;
+——+——+
| a | b |
+——+——+
| w | w |
| 中 | ? |
+——+——+
2)插入数据被截断:
mysql> insert into t1 values(’xy’,'xy’),(’中国’,'中国’);
Query OK, 2 rows affected, 4 warnings (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 4
mysql> select * from t1;
+——+——+
| a | b |
+——+——+
| w | w |
| 中 | ? |
| x | x |
| 中 | ? |
+——+——+
2、表t2
mysql> show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`a` char(2) DEFAULT NULL,
`b` binary(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1)插入数据:
mysql> insert into t2 values(’w',’w'),(’中’,'中’);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t2;
+——+——+
| a | b |
+——+——+
| w | w |
| 中 | 中 |
+——+——+
2 rows in set (0.01 sec)
mysql> insert into t2 values(’xy’,'xy’),(’中国’,'中国’);
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from t2;
+——+——+
| a | b |
+——+——+
| w | w |
| 中 | 中 |
| xy | xy |
| 中国 | 中 |
+——+——+
总结: char以字符来计算,一个中文一个英文都是占1个字符;
Binary以字节来计算,一个英文占1个字节,一个中文占2个字节。
原文地址:http://rdc.taobao.com/blog/dba/html/324_%e5%ad%97%e7%ac%a6%e4%b8%8e%e5%ad%97%e8%8a%82.html