簡要說一下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端起作用。
新聞熱點
疑難解答