日期:2014-05-16  浏览次数:20711 次

linux mysql 5.5 设置编码
公司新搭建了一套linux环境, 服务、数据库都架设在这上面。
我的任务是把整个一套的编码问题解决了。

应用层使用 spring 的org.springframework.web.filter.CharacterEncodingFilter 使用UTF-8转码,JSP页面统统使用UTF-8。关键是在mysql上面有问题, 由于第一次使用mysql,很不清楚怎么设置。在网上找了一大堆,按照方式修改,结果均不能启动。  后来想是不是由于版本问题造成的?  看了一下版本:5.5 原来果然有版本限制。下面是具体设置。


1. 首先使用mysql命令进入mysql命令界面。使用如下命令查看编码设置
    mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.12, for Linux (i686) using readline 5.1

Connection id:          20
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket

Server characterset:    latin1     #server char
Db     characterset:    latin1     #db     char
Client characterset:    latin1     #client char
Conn.  characterset:    latin1     #connection char


2. 上面的latin1就是产生乱码的罪魁祸首,因为入库 和 数据显示的时候使用的UTF-8,因此,只需要将上面命令查看到的编码修改即可。

3. 修改/etc/my.cnf 中的设置,
     在[client]节点下添加 
       default-character-set=utf8
    在[mysqld]节点下添加
       character-set-server=utf8
      collation-server=utf8_general_ci
   保存即可(如果你是使用vi来操作,则保存时会报错,因为这个文件是只读属性,可以使用 wq! 强制保存退出)。

4. 重启mysql即可。


5. 这里面本没有什么高深之处, 重要一点是要注意版本, 网上有不少的修改帖子,都是要在[mysqld]下加上 default-character-set=utf8  ,实际上5.0(>)版本以上是不支持的,如果你这样修改, 你的mysql将不能启动, 报一个错,信息是"上次退出的时候没有保存PID ??  " (大概是这个错误提示)


关于乱码:

    这么多年来,碰到的乱码问题可多了, 最开始学习jsp ,使用tomcat、到各种数据库, 或者从xml等解析数据,   我的总结是: 乱码不可怕, 只要把握一条原则即可, “这个东西用什么编码的, 用什么解码的,用什么编码的, 用什么解码的....”,只要保证这个过程中的编码、解码过程一致就OK, 例如,你用GBK编码了一个str, 然后用UTF解码肯定会出错,但是你如果用这个UTF8的str解码后的byte用GBK再次编码就么有问题了。


    要清楚本质: 不论什么东东, 在底层表示的时候都是 byte[], 而在真正编码的时候,就可能是用一个字节、两个字节 ==来表示某种语言的一个字符, 例如一个asc字符用一个byte表示即可,但是汉字却是使用两个字节。   解码时,一个汉字用两个byte表示,如果你在编码的时候用这两个byte来解析成两个字符,则结果不是原字符-----这就是乱码原理。


最懒的方式: 保证你的项目 从UI-server-DB 这个过程使用一致的编码格式即可,前提是你需要知道各个过程哪里发生了解码、哪里发生了编码。