2008年12月17日 星期三

PHP全面UTF8化

http://blog.wu-boy.com/2008/08/25/336/

BIG5大五碼過時了嗎?
我想還没,目前還有不少網站使用大五碼。
但我個人認為UTF8,一定是未來使用中文的「主流」編碼方式。

所以,我寫PHP程式,串接MYSQL,當然要以UTF8為使用字元集。
不過,在使用MYSQL的過程中,常常遇到系統預設值,造成亂碼的困擾。
没辦法,誰叫MYSQL是西方人開發出來的呢?

還好,隨著時間演變,慢慢使用MYSQL的人多了,網路討論的人也跟著多了起來。
之前一直不解的問題,也慢慢有人分享出來了。
感恩啊!


[以下擷取部份做為重點筆記]
+===================================================================================+
這兩個字段來更改資料庫的預設字符集。
第一個是客戶端預設的字符集,第二個是伺服器端預設的字符集。
假設我們把兩個都設為 utf8,然後在MySQL Command Line 裡面輸入
"show variebles like ‘character%’;”,可看到如下結果:
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8

其中的 utf8 隨著我們上面的設置而改動。
此時,要是我們透過採用 UTF-8 的 PHP 程式從資料庫裡讀取資料,
很有可能是一串 "?????” 或者是其他亂碼。
網上查了半天,解決辦法倒是簡單,在連結資料庫之後,
讀取資料之前,先執行一項查詢 "SET NAMES UTF8″,即在 PHP 裡為

mysql_query("SET NAMES UTF8");

即可顯示正常(只要資料庫裡資料的字元正常)。
為什麼會這樣?這句查詢 "SET NAMES UTF8″ 到底是什麼作用?

到 MySQL 命令行輸入 "SET NAMES UTF8;",
然後執行 "show variables Like 'character%'",
發現原來為 latin1 的那些變數
"character_set_client”、”character_set_connection”、 ”character_set_results”
的值全部變為 utf8 了,原來是這 3 個變數在搗蛋。

查閱手冊,上面那句等於:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

看看這 3 個變數的作用:

資料輸入路徑:client → connection → server;

資料輸出路徑:server → connection → results。

換句話說,每個路徑要經過 3 次改變字符集編碼。
以出現亂碼的輸出為例,server 裡 utf8 的資料,
傳入 connection 轉為 latin1,傳入 results 轉為 latin1,
utf-8 頁面又把 results 轉過來。
如果兩種字符集不相容,比如 latin1 和 utf8,轉化過程就為不可逆的,破壞性的。
所以就轉不回來了。

但這裡要聲明一點,”SET NAMES UTF8″ 作用只是臨時的,MySQL 重啟後就恢復預設了。

接下來就說到 MySQL 在伺服器上的配置問題了。
豈不是我們每次對資料庫讀寫都得加上 "SET NAMESUTF8″,以保證資料傳輸的編碼一致?
能不能透過配置 MySQL 來達到那三個變數預設就為我們要想的字符集?
手冊上沒說,我在網上也沒找到答案。
所以,從伺服器配置的角度而言,是沒辦法省略掉那行程式碼的。

+===================================================================================+

2008年12月16日 星期二

最近LINUX開不起來,懷疑是fstab有錯!

錯誤訊息好像和掛載之前安裝XP那顆硬碟有關!
在ubuntu LINUX是用UUID的識別方式,把硬碟掛上去。
之前也都一直好好的用,没事!

但自從昇級核心版本到 2.6.24-21-generic 以上,就出問題了。
一度以為我的LINUX掛了,我心目中堅不可摧的LINUX,怎麼會出現和M$一樣的情形。
動不動就當,重新開機也是出現一堆錯誤訊息,就掛著怎麼也開不起來。

今天平心靜氣動手找原因,懷疑是核心昇級後,用UUID掛NTFS硬碟會出錯。
怎麼解決呢?還没有答案!

又要未完,待續了……

+=====================================================================================+
# /etc/fstab: static file system information.
#
# <file> <mount> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
# chroot enviroment
proc /opt/sid-root/proc proc none 0 0
# /dev/sda3
UUID=6d0c4082-d375-4fa6-9614-78bdbd3df1f9 / ext3 defaults,errors=remount-ro 0 1
# /dev/sda1
UUID=011b1d42-7f60-4886-b182-f1020fc90aa3 /boot ext3 defaults 0 2
# /dev/sda5
UUID=f79f6796-bcfa-4f26-940a-1e76e6c517ec /home ext3 defaults 0 2
# /dev/sda6
UUID=57208124-6345-4d3f-baa3-a5898fcb4257 /opt ext3 defaults 0 2
# /dev/sda2
UUID=50491ebb-b37b-423b-bb0a-2f158724043d none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
# /dev/sdb1
UUID=629C54EF9C54BF6B /media/win_c ntfs-3g auto,users,uid=1000,gid=1000,utf8,dmask=027,fmask=1 37 0 0
# /dev/sdb2
UUID=CCBC3CEABC3CD0A6 /media/win_d ntfs-3g auto,users,uid=1000,gid=1000,utf8,dmask=027,fmask=1 37 0 0

# /dev/sdb3(extend)
# /dev/sdb5
UUID=22BC6A11BC69DFB1 /media/win_e ntfs-3g auto,users,uid=1000,gid=1000,utf8,dmask=027,fmask=1 37 0 0

+=====================================================================================+

用grub去啓動另一顆硬碟中的XP

有不少文件是教怎麼在「一顆」硬碟上安裝雙系統。
通常是先裝XP,再裝LINUX。
因為grub很聰明,會在裝LINUX時,自動找有没有XP系統可用,然後加到開機的OS選單。
真的是太體貼XP的重度使用者了!
為了把XP重度使用者,「拐」來使用LINUX。
老實說,LINUX的HACKER們,真的是用心良苦!

不過,我筆記下來的設定內容,是把XP裝在「另」一顆硬碟的作法。
好像也有別種設定值可用!

先湊合用著吧~

+===========================================================================+

title Microsoft Windows XP SP2 Pro
rootnoverify (hd1,0)
map (hd0) (hd1)
map (hd1) (hd0)
chainloader +1

+===========================================================================+

日後,要來補上說明,談談 map, chainloader, rootnoverify 的用法。

2008年12月13日 星期六

Debian 寫PHP的mail程式

之前移植到Debian的PHP程式,這陣子想把一些功能加強一下。
因為懶惰的自己,常常忘了去看業務單位報送簡訊的線上需求單。
而那個介面還是我自己開發的,實在不能再這麼混下去!
目前百業蕭條的這種敏感時刻,難保自己會不會就名列下一波的裁員名單啊!

OK!重點是把PHP的MAIL功能加上去。
所以首要任務,就是要先自建一個郵件伺服器,但只有對內部網路提供服務。
版本仍然是用Debian 的GNU/Linux,暫時就決定裝在這部寫PHP用的機器上。
動手吧~
先在Debian主機測一下電子郵件的服務有没有裝上?

debian:~# echo "Helloless mainlog This is a test mail." | mutt -s "test mail" bullock@mail.niceplaza.com.tw

看看我在mail.niceplaza.com.tw的信箱,居然收不到任何由Debian來的信件!
這下糟了,難道要就此打住,認賠殺出@#$%^&...

debian:~# netstat -tlnp | grep 25

查了一下,tcp port 25有啓用,是被一個叫 exim4 的程序拿去用了!
原來 Debian 預設的郵件服務套件是用 exim/exim4!
嗯!和之前摸的 sendmail 和 postfix 不一樣。有挑戰性!

應該有 log 資訊,看看去!
debian:~# tail /var/log/exim4/mainlog

有以下幾行文字......
2008-12-14 15:41:54 1LBlbu-0006hG-BN <= root@debian.niceplaza.com.tw U=root P=local S=567 id=20081214074154.GA25741@debian.niceplaza.com.tw 2008-12-14 15:41:54 1LBlbu-0006hG-BN ** bullock@mail.niceplaza.com.tw R=nonlocal: Mailing to remote domains not supported 2008-12-14 15:41:54 1LBlbu-0006hI-E0 <= <> R=1LBlbu-0006hG-BN U=Debian-exim P=local S=1470
2008-12-14 15:41:54 1LBlbu-0006hG-BN Completed
2008-12-14 15:41:54 1LBlbu-0006hI-E0 => bullock
R=local_user T=mail_spool
2008-12-14 15:41:54 1LBlbu-0006hI-E0 Completed


看來是要請教GOOGLE大師了~
Mailing to remote domains not supported 是怎麼解決呢?

+=============================================================================+
1.編輯並修改 /etc/exim4/update-exim4.conf.conf 下列兩行:
 dc_eximconfig_configtype='internet' #預設為 local
 dc_smarthost='msxx.hinet.com' #遠端的SMTP主機,利用它來發送郵件

2.修改 /etc/mailname ,改成你所在寄送郵件的領域(domain)。

3.執行 exim4 -bV 可測試 exim4 的配置有否出錯。

4.重新啟動 exim4:
 # /etc/init.d/exim4 restart

+=============================================================================+

第一百零一次求婚-[回味系列]

記得這是我看日劇的第二齣!
日劇在我高中到大學的時期,大行其道.
這部第一百零一次求婚,更是讓我感動到不行!
配樂和主題曲還那麼優!


經典的一幕!



主題曲



主題曲原唱



演唱會-高超的演唱技巧!

回味一下踢踏舞

大河之舞 River Dance Goy

火焰之舞 Feet of Flames

超級震撼(越後面越棒)



2008年12月3日 星期三

Debian要有router功能

Debian 要有ROUTER功能!
需要那些套件啊?

之前玩單機的GNU/LINUX,利用單網卡設定成Proxy主機,玩得很高興。
没想到,改成雙網卡的機器,一些設定值,居然失效!

一定是我不用功,所以忘了有那些套件和設定值没搞定。
先筆記一下己經知道的知識。

/etc/sysctl.conf
補上以下這行...
+==================================+
net.ipv4.ip_forward = 1
+==================================+
要開 ip_forward 為真

# echo 1 > /proc/sys/net/ipv4/ip_forward
只能暫時有效,重開機就失效,所以寫入sysctl.conf是最佳做法。
也能利用rc.local檔的性質來做到相同的效果。

# apt-get install ipmasq 要記得裝,才有轉送封包,而且偽裝IP的效果。
没有SNAT的功能,轉送封包,能搞什麼花樣!還是没用啦。

裝上ipmasq套件後,發現之後開機,會自動加入NAT table不少規則!
# iptables -t nat -L

To be continue ......

2008年12月2日 星期二

存取各種資料庫前十筆的語法

存取各種資料庫前十筆的語法(轉貼)
PS/原作不可考?如有善心人士知悉,告知後將修訂出處!

1. ORACLE
SELECT * FROM TABLE1 WHERE ROWNUM<=N

2. INFORMIX
SELECT FIRST N * FROM TABLE1 where 1=1

3. DB2
SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N
或者
SELECT COLUMN FROM TABLE where 1=1 FETCH FIRST N ROWS ONLY

4. SQL SERVER
SELECT TOP N * FROM TABLE1 where 1=1
or
SET ROWCOUNT N SELECT * FROM TABLE1 where 1=1 SET ROWCOUNT N1

5. SYBASE
SET ROWCOUNT N SELECT * FROM TABLE1 where 1=1 SET ROWCOUNT N1

6. MYSQL
SELECT * FROM TABLE1 where 1=1 LIMIT N

7. FOXPRO
SELECT * TOP N FROM TABLE ORDER BY COLUMN

8. ACCESS
SELECT TOP N * FROM TABLE1 where 1=1

搜尋此網誌

本站大事記

這個部落格(網站)內容以分享LINUX和延伸出的技術文章為主!
特別是為了工作和進修需要,搜集了不少網站連結。
希望對來這裡觀文的朋友們,有提供一些有用的資訊或文章。
但這裡的文章中,也包含個人的心情扎記和隨興言談……
若是當中沒有對上你的口味,請多包涵!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!
--原序文--
就是當LINUX遇上CISCO啦!他們的結合還能作什麼事…不就是讓這個世界的網路,串…串起來啊…不然你們那能上這網站看部落格!