初始化文件
首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则。这两个参数集可以在数据库实例、单个数据库、表、列等四个级别指定。对于使用者来说,一般推荐使用utf8编码来存储数据。而要解决乱码问题,不单单是MySQL数据的存储问题,还和用户的程序文件的编码方式、用户程序和MySQL数据库的连接方式都有关系。
在MySQL5.5版本下,在my.cnf (my.ini)中指定数据库端字符集为UTF8,其中init_connect参数的作用是给每个普通用户的连接自动设置字符集(但是要注意的是,这个命令对具有super权限的用户是不生效的)。
[client]
# 修改客户端默认字符编码格式为utf8
default-character-set = utf8
[mysqld]
# 修改服务器端默认字符编码格式为utf8
character-set-server = utf8
# 在每个普通用户连接上来的时候都会触发执行
init_connect = 'SET NAMES GBK'
在客户端中查看配置生效
mysql> show variables like '%char%';
+--------------------------+--------------------------+
| Variable_name | Value |
+--------------------------+--------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | d:\MySQL\share\charsets\ |
+--------------------------+--------------------------+
ODBC 和 MySQL
通过ODBC连接MySQL的应用,比如Power Designer, 需要在ODBC的配置当中手工指定 init statement 的值为 set names gbk,这样才可以正确使用中文。
大小写敏感
默认LINUX下,MySQL的表名称是大小写敏感的。可以修改my.cnf进行配置
[mysqld]
# 0是敏感,1是不敏感
lower_case_table_names = 1
默认字符串的比较是大小写不敏感的,可以通过字段类型增加binary关键字进行指定。也可以在SQL语句中用binary()函数或者binary关键字
create table t(x varchar(1) binary);
也可以在SQL语句中用binary()函数或者binary关键字
select * from t where x = binary('A');
select * from t where binary x = 'A';