2010年4月12日 星期一

Linux下mysql中文問題

操作系統環境:

CentOS4.8、MySQL 5.1.45

現象:

在此電腦上安裝了Tomcat作為web服務器,部署了一個項目,通過jdbc連接到mysql數據庫。但是發現中文輸入輸出亂碼現象。

解決步驟:

1. 找到mysql的配置文件

網上說,mysql的配置文件就是/etc/my.cnf。但是這個文件並不一定存在,由於你可能採取的MySQL安裝方式跟網上所說的不一樣,就不一定能夠找得到/etc/my.cnf。因此,你需要使用find命令查找cnf文件。記得不要去找my.cnf因為它不一定存在,而應該找*.cnf。



# find / -iname '*.cnf' -print
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/mysql-test/std_data/ndb_config_mycnf2.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/mysql-test/std_data/ndb_config_mycnf1.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/mysql-test/std_data/bug15328.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/support-files/my-huge.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/support-files/my-large.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/support-files/my-medium.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/support-files/my-innodb-heavy-4G.cnf
/usr/local/mysql-6.0.4a-alpha-linux-i686-glibc23/support-files/my-small.cnf
/usr/share/ssl/openssl.cnf

找到之後,複製一個出來
# cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf

2. 打開my.cnf修改編碼


# vi /etc/my.cnf

在[mysqld]下添加
default-character-set=utf8

在[client]下添加
default-character-set=utf8

3. 重啟mysql

根據你安裝mysql的方式的不同,採用不用的命令來重啟你的mysql。如果你配置過使用mysqld自啟動方式,可以執行
# /etc/rc.d/init.d/mysql restart
來重啟。
或者你把mysql配置成系統服務的方式,你可以執行
# service mysql restert

但是如果你僅僅按照INSTALL-BINARY來啟動mysql的話,如
shell> bin/mysqld_safe --user=mysql &
那麼你可能需要找出mysql的進程,然後kill了它們。如
# ps -aux | grep mysql
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.3/FAQ
root 24246 0.0 0.0 4532 1076 pts/7 S 13:36 0:00 /bin/sh bin/mysqld_safe --user=mysql
mysql 24273 0.0 1.0 305872 43712 pts/7 S 13:36 0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data -- user=mysql --pid-file=/usr/local/mysql/data/cmmi.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock
從顯示出來的結果找到進程id,殺掉他們
# kill -9 24246
# kill -9 24273
最後再重啟。



4.登錄mysql看看修改成功否

# mysql
mysql> show variables like 'character_set_%';
-------------------------- ------------------------ -----------------------------------
| 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 | /usr/local/mysql-6.0.16a-linux-i686/share/mysql/charsets/ |
-------------------------- ------------------------ -----------------------------------
8 rows in set (0.00 sec)

mysql> show variables like 'collation_%';
---------------------- -----------------
| Variable_name | Value |
---------------------- -----------------
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
---------------------- -----------------
3 rows in set (0.00 sec)

5. 修改已經部署的數據庫編碼

# mysql
mysql>use dbname
mysql>alter database dbname character set utf-8;

或者修改這個數據庫的文件$mysql_data_path/dbname/db.opt
default-character-set=latin1
default-collation=latin1_swedish_ci

default-character-set=utf8
default-collation=utf8_general_ci

重啟mysql。

6. 以後創建數據庫時,為了保險起見,你可以指定編碼創建:

# mysql
mysql>create database dbname character set utf-8;

7. 檢查你的Java應用的JDBC連接字符串

設置好數據庫的編碼後,在連接數據庫時候,應該指定connection的編碼,比如使用jdbc連接時,指定連接為utf8方式。

沒有留言:

張貼留言