分类: Mysql/postgreSQL
2012-02-01 16:12:09
MySQL数据库中使用何字符集的问题,大多数人能分辨清楚,但是使用字段值比较的校对规则,则很多人容易混淆不清楚,为此介绍一个latin1字符集编码保存,然后设置为不同校对规则的不同之处。
1 |
mysql> SELECT NICKNAME FROM user WHERE nickname = '磊飞'; |
+———-+
| NICKNAME |
+———-+
| 龙飞 |
| 龙飞
|
| 龙飞 |
| 龙飞 |
+———-+
4 rows in set (0.00 sec)
明明不同的汉字被认为是相等的。我们知道mysql的诸多collation有很多结尾是_ci的,表示大小写不敏感。
mysql> select ‘a’='a’;
+———+
| ‘a’='a’ |
+———+
| 1
|
+———+
1 row in set (0.00 sec)
mysql> select ‘a’='A’;
+———+
| ‘a’='A’ |
+———+
| 1
|
+———+
1 row in set (0.00 sec)
mysql> select ‘a’='b’;
+———+
| ‘a’='b’ |
+———+
| 0
|
+———+
1 row in set (0.00 sec)
mysql> show table status like
‘user’;
+———-+——–+———+————+———-+—————-+————-+—————–+————–+———–+—————-+———————+———————+———————+——————-+———-+—————-+———+
|
Name | Engine | Version | Row_format | Rows | Avg_row_length |
Data_length | Max_data_length | Index_length | Data_free | Auto_increment |
Create_time | Update_time | Check_time |
Collation | Checksum | Create_options | Comment
|
+———-+——–+———+————+———-+—————-+————-+—————–+————–+———–+—————-+———————+———————+———————+——————-+———-+—————-+———+
|
user | MyISAM | 10 | Dynamic | 17705707 | 70 | 1251800492 |
281474976710655 | 1211700224 | 0 | NULL | 2009-12-22
01:43:26 | 2011-11-10 13:46:03 | 2011-11-10 13:49:05 | latin1_swedish_ci |
NULL | NULL |
|
+———-+——–+———+————+———-+—————-+————-+—————–+————–+———–+—————-+———————+———————+———————+——————-+———-+—————-+———+
1
row in set (0.00 sec)
我们看到latin1_swedish_ci,这就是造成“磊”和“龙”相等的原因了。
怎么样让大小写敏感,而去掉这种不需要的“相等”?
注意collate的用法
mysql> SELECT `NICKNAME` FROM user WHERE nickname = (‘磊飞’ collate
latin1_bin);
Empty set (0.00 sec)
mysql> SELECT `NICKNAME` FROM user WHERE nickname = (‘龙飞’ collate
latin1_bin);
+———-+
| NICKNAME |
+———-+
| 龙飞 |
| 龙飞
|
| 龙飞 |
| 龙飞 |
+———-+
4 rows in set (0.00 sec)