YMLib Systems Librarian

一些設定的記錄

我的相片
名稱:
位置: WuGu, Taipei, Taiwan

我是個大光頭,因我的頭型適合這一型。I have a perfect head style.

星期四, 11月 23, 2006

perl在mysql上中文解決的方式

$sth = $dbh->do( "SET character_set_client ='big5'");
$sth = $dbh->do( "SET character_set_connection='big5'");
$sth = $dbh->do( "SET character_set_results='big5'");

http://a-wei.net/archives/category/mysql/

標籤: , ,

解決PHP在mysql的中文問題

http://mmug.com.tw/forum/viewtopic.php?p=38349

mysql_select_db("xxx", $conn);之後要接下面三行

$charset=mysql_query("SET NAMES big5;");
$charset=mysql_query("SET CHARACTER_SET_CLIENT=big5;");
$charset=mysql_query("SET CHARACTER_SET_RESULTS=big5;");

http://ria.richtechmedia.com/2005/12/19/%E3%80%90%E4%BF%9D%E8%A8%BC%E6%88%90%E5%8A%9F%E3%80%91%E7%9A%84-mysql-%E4%B8%AD%E6%96%87%E4%BA%82%E7%A2%BC%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%A1%88/
【保証成功】的 mysql 中文亂碼解決方案
I promise this is gonna be the last time on it :-)

自從寫完下面兩篇文章:

wordpress 1.5升級注意事項 - 中文亂碼篇
http://ria.richtechmedia.com/go.php?http://ria.richtechmedia.com/?p=192

mysql 4.1中文亂碼第二擊
http://ria.richtechmedia.com/go.php?http://ria.richtechmedia.com/?p=213

過去幾個月就不斷有來信詢問各種 mysql 中文相容的問題,所以有機會看到許多玩家們用的各式連接法與程式,實在太開眼界。

最近因為轉換到 flex 2做為開發平台並重寫一些產品,許多去年寫的 framework 就無法使用,而其中有部份專門處理多國語系的library也隨之失效,導致我得重新面對這個問題,所以正好籍此機會將一些新心得整理出來。

*mysql中文亂碼的原因

mysql 會出現中文亂碼的原因不外乎下列幾點:

-mysql server本身設定問題,例如還停留在 latin1

-mysql table 的語系設定問題(包含 character 與 collation)

-客戶端程式(例如 php) 的連線語系設定問題

在之前的兩篇文章中已介紹過如何設定 mysql server/table 的 character/collation。

接下來只需要補充幾點注意事:

*mysql中文亂碼必勝解決法

1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:

C:\windows\my.ini 也就是作業系統的安裝目錄,也有可能是 C:\winnt\my.ini
C:\:my.cnf 也就是 C disk 的根目錄

注意不同位置裏的檔案suffix不一樣,這點在之前的文章中沒有特別強調,因此那時我是用更複雜的方法直接重新將mysql 註冊到 service裏面,並在那裏指定 my.ini的位置。

2、my.ini 裏的內容為:

[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_connect='SET NAMES utf8'

其中 mysqld 是指定 server啟動時要用的語系,但如果這裏設定為 utf8可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki,所以這裏建議設成 latin1。

下面的 client 則是設定當 client 連線時要使用什麼語系,但可惜的是這個設定不是每個client都會鳥它,基本上只有 mysql 自已家的程式,例如 mysql.exe, mysqld.exe, mysqladmin.exe 或是 MySQL Control Center這種程式會去讀取這個設定檔然後改用 utf8 連線。

note: 感謝 b6s 桑熱情相助提供第二行指令,據說比一支支php程式去設定connection setting更快,這樣應該也可以順便解決phpmyadmin無法正確顯示 unicode 中文的問題(不過 amfphp 到是不吃這套,一定要乖乖的自已設定語系才行)

但大部份工程師應該都是自已寫 php/jsp 程式去連線,此時自然不會讀取這個設定而繼續使用預設的語系 - latin1。

這也正是八成來信朋友陣亡的地方。

通常我會用一個獨立的檔案來處理 mysql connection的設定,例如:
PLAIN TEXT
PHP:

1.


請注意在 mysql_connect後第五行的地方有加上一個 "set names 'utf8' "的指令,告訴mysql 這個 connection 之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。

從這裏也可以推想得知,如果你有用某種custom connection pooling機制,就要記得在每次建立新的connection後立即設定為 utf8。

這組設定經過幾天的反覆測試(使用中文繁、簡、日文、韓文)後已經証實完全不會有亂碼或是某些字變成 "口"。

例子:試者輸入這幾個字「不道可否囉」如果它們能正確進入mysql再被讀出來,那就是中文沒問題了,如果讀出來後變成『口』字那就是革命還未成功同志仍需努力...orz

當然我也順便驗証了 flex2 - amfphp - php - mysql 來回傳resultset 也不再會有中文亂碼問題,可以安心使用囉。
by jeremy

標籤: , ,

星期二, 11月 21, 2006

mysql的中文問題

perl2編程mysql中文 [天氣] 2005年9月13日11:14星期二 [Dev開發] 追蹤此文的RSS

使用connect方法建立一個到數據源的連接。$data_source應該以DBI:driver_name:開始,例如:

$dbh = DBI->connect("DBI:mysql:$database", $user, $password); www.shengfang.org

$dbh = DBI->connect("DBI:mysql:$database:$hostname",$user, $password);

$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",$user, $password);


Can't locate DBI.pm in at INC (@INC contains: O:/php/perl/lib O:/php/perl/site/lib dot ) at O:\php\OptiPerl\webroot\cgi-bin\newscript1.cgi line 3.
BEGIN failed--compilation aborted at O:\php\OptiPerl\webroot\cgi-bin\newscript1.cgi line 3.

#!O:/php/perl/bin/Perl.exe www.shengfang.org
print "Content-type: text/plain; charset=gb2312\n\n";
print "rrow[1]\n";
use DBI; www.shengfang.org
my $dbh = DBI->connect('dbi:mysql:astbill:localhost','root','123');

$dbh->do("set names gbk");

my $sql = "insert into admin(namee,pwd) values('對數函數','閃電劃過的')";
my $sth = $dbh->prepare($sql);
$sth->execute(); www.shengfang.org

my $sql = "select * from admin";
my $sth = $dbh->prepare($sql);


$sth->execute(); www.shengfang.org
my at row;
while(@row=$sth->fetchrow_array())
{ www.shengfang.org
print "$row[2]\n"; www.shengfang.org
}

rrow[1]
21232f297a57a5a743894a0e4a801fc3
?????
rrow[1] www.shengfang.org
21232f297a57a5a743894a0e4a801fc3
閃電劃過的 www.shengfang.org

[client]
port=3306
default-character-set=gbk www.shengfang.org

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=gbk www.shengfang.org

引用 cnchun
perl mysql中文亂碼
摘自 中國Perl協會 用戶推廣組 cnchun 2005-06-29 16:57
http://perlchina.sun126.com/cgi-bin/ccb/index.cgi
搞了一天總算搞好了。
perl5.8+mysql4.1,用perl DBI mysql往數據庫插入數據,總是亂碼,而用phpmyadmin能插入中文;而用perl插入的中文在phpmyadmin裡面也是亂碼。數據庫的創建,我用了。
create database cnews default character set gbk;
CREATE TABLE `news` (
`id` int(10) unsigned NOT NULL auto_increment,
`title` varchar(50) default NULL,
`context` text,
`date` date default NULL,
`site` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk

如果在my.cnf裡面設置了
[client]
default-character-set = gbk
[mysqld]
default-character-set = gbk

mysql -uroot -p;
mysql>use cnews;
mysql> status
--------------
Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk
則perl能夠正常插入中文無須其它設置。

如果不在my.cnf裡設置default-character-set,例如:
mysql -uroot -p;
msyql>use cnews
mysql> status
Server characterset: latin1
Db characterset: gbk
Client characterset: latin1
Conn. characterset: latin1

在調用perl 的時候,需要下面設置:
$db->do("SET character_set_client = 'gbk'");
$db->do("SET character_set_connection = 'gbk'");
如果需要顯示結果,加上
$db->do("SET character_set_results= 'gbk' ");

其實可以把database 設置為gbk,然後用character_set_*來設置相關編碼,mysql其實還是很靈活的。perl運行跟linux的locale沒有關係,對於數據庫操作。
剛學perl,希望對跟我一樣的新手有所幫助。

hoowa
在Perl裡簡單的執行這個也.
摘自 中國Perl協會 用戶推廣組 hoowa 2005-06-29 19:00
http://perlchina.sun126.com/cgi-bin/ccb/index.cgi
在Perl裡簡單的執行這個也可以實現與服務器端一樣是gbk編碼
set names gbk

標籤: ,