日期:2012-09-24  浏览次数:20439 次

简要说一下mysql4.1以后的问题
第一:mysql4.1的存储方式已经是utf8的了。。也就是说他的文件编码是utf8格式,我们不需要担心会有存储不了的字符
第二:mysql服务器需要以一种编码方式来启动,设定连接(通讯)过来的字符编码是什么,就是所谓的我们的交流语言
第三:mysql的client端,需要设定一种编码去和mysql的服务器端通讯,也是交流语言

那么为什么回出现乱码哪?
就是出在这个连接的过程中,试想一个人用英文和你说话,而你只明白中文,真的和小燕子一样,三块肉喂了马吃了。。

那么如何解决乱码的问题哪?
有几个办法:
第一,服务器端mysql和客户端mysql编译时候用相同的charset
./configure --with-extra-charsets=big5,gbk,gb2312,utf8 --with-charset=utf8
其中--with-charset=utf8就是设定服务器或者客户端的默认连接方式中的编码,当然你可以用各种编码,只要统一就可以。
(我感觉这个是吓唬人的,因为就算你用--with-charset=gbk,在日文或者其他文字中也不会出现乱码)
第二,在编译后进行设置,这个也有两种方式,读配置文件,或者直接加参数
先说直接加参数的方式:
以下是我用的一个服务器脚本,用来启动mysql

CODE:
#!/bin/sh
rundir=`dirname "$0"`
echo "$rundir"
/usr/local/soft/mysql4112/bin/mysqld_safe --user=mysql --pid-file="$rundir"/mysql.pid --datadir="$rundir"/var "$@"\-O max_connection
s=500 -O wait_timeout=60 -O key_buffer=32M --port=6000 --socket="$rundir"/mysql.sock --default-character-set=utf8 &


其中可以看到服务器启动的连接编码为utf8,当然你可以用别的方式比如gbk
客户端那更容易了
/$mysqlpath/bin/mysql -hxxxx -uxxx -pxxx -P6000 --default-character-set=utf8
呵呵,然后你在mysql中看到mysql>show variables;
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8
说一下参数
character_set_system | utf8 这个是系统的文件编码,所有的都是utf8
| character_set_database | utf8 这个就是我们服务器的启动的时候设置的编码
其他几项是客户端的连接编码

然后说通过my.cnf设置的方法,这个也分服务器和客户端的方式
编译的时候我们可以通过--sysconfdir=/etc的方式设置my.cnf的读取目录

my.cnf的配置,cnf在client端和server端的设置是一样的,位置不同
以下是client端my.cnf一脚

CODE:
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8


看一下就明白了,服务器端同理,不过是在[mysqld]下。

ps:my.cnf的位置是个问题,如果编译的时候不设置sysconfdir的话,默认是在mysql的安装目录下的etc下面,这个目录需要你自己建一个,使用client端连接既可以读取。
php有个问题,他的mysql连接不会读取mysql目录下的,而是读取/etc的根目录中的配置文件,不知道是不是个bug

ps:如何找到适合我自己的my.cnf文件那,这个是在mysql安装目录下的share/mysql/中,其中有
my-small.cnf
my-medium.cnf
my-large.cnf
my-huge.cnf
my-innodb-heavy-4G.cnf
分别对应数据库的大小设置相应的配置文件,这些设置的不同只对server端起作用。