顯示具有 MySLQ 標籤的文章。 顯示所有文章
顯示具有 MySLQ 標籤的文章。 顯示所有文章

2009年9月2日 星期三

「許功蓋」的問題

 

為什麼網頁上變成了亂碼?
應該就是遇到了頭疼的「許功蓋」問題了。
許功蓋是何許人? 令人頭疼的傢伙
有人說中國人像一盤散沙,不但不團結又愛搞分化,無論在學校、公司、部隊或社會,小圈圈或小山頭林立,想要中立者很難不被人貼上標籤,一旦被歸類到哪個派系時禍福難料。台海兩岸不就是最明顯的例子,上一代的鬥爭,下一代繼續鬥,非要弄得大家頭破血流為止。
實體和虛擬都在搞分裂
在電腦的領域裡也一樣,中文字分裂成兩大類;你有你的一套而我也自成一派,現實生活玩分裂遊戲到虛擬世界還在搞,真令老外們百思不得其解?
常摸電腦的人都知道,台灣和香港這邊號稱自由地區的人,雖然人少卻依然堅持正統的繁體字,統領著五湖四海華人文化界,其精神多麼地偉大呀!這派中文字型編碼以"大五碼(BIG5)"為首。對岸的大陸同胞在文革前,早開始「破四舊、立四新」,所謂的四舊是:“舊思想、舊文化、舊風俗、舊習慣”這些八股東西通通要拋掉,要改革就改的徹底,繁體自筆畫多太麻煩,不符合新的標準。而四新就是指相對應的:「新思想、新文化、新風俗、新習慣」,因此,以後電腦的中文環境都受此意識型態影響,奇怪得是既然統一寫簡體中文,後來簡體中文的編碼又搞出三這種不同派系:「GB18030、GB2312及HZ」,看來中國人真是與眾不同的民族。
相同地,自由地區的台灣及香港雖同樣都使用大五碼來號令中文字型,妙就妙在我老廣講的粵語要維持我原來語意的精神,又多增加些令台灣人看了莫宰羊的港仔字型,於是,中文字和西方文字一字一位元組的單純性更顯得複雜難懂,英美語系的ASCII Code全球通行無障礙,這也難怪啦!電腦本來就是西方所發明出來的呀!
相形之下,台灣也單純得多,幾乎人人全用大五碼,可是,如今不是都在全球化,台灣不能搞鎖國,文字總要交流,一有交流網絡一旦離開台灣島後,問題及麻煩也跟著來了。撇開亂碼的問題不談,因為這是先天不良所致沒辦法改變,然而,麻煩的事並不侷限在簡繁中文字的轉換上,就算在台灣普遍使用大五碼環境,一樣會有後天失調的問題出現。
大名鼎鼎的許功蓋
無論是許功蓋或是許蓋功其實只是本尊與分身的差別不同,意思是在電腦世界裡都代表一個相同問題,我想只要曾經用"PHP + MySQL "架站過的人,幾乎是無人不知無人不曉這頭疼的傢伙,且絕對是這些架站人心中永遠的痛。仔細探究原因,你會發現,錯的人其實不該是許功蓋,而是通稱大五碼的BIG5碼,關於大五碼的歷史傳說眾說紛紜,無一定論。我們並不評論當初編碼的對錯與是非,對這歷史有興趣的讀者不妨到google搜尋"BIG5″,相信可以找到一堆資料。
既然大五碼聽來似乎有些問題,為何目前幾乎所有的繁體中文卻又都採用此一編碼呢?在西元1983-1984年間,個人電腦正在台灣逐漸推廣,電腦上的套裝軟體也開始盛行,為了解決電腦處理中文的問題,因而制定一套中文內碼,也就是我們通稱的"BIG5碼",又稱大五碼。而經歷過這段時間的人,一定不會忘記當初倚天中文的行銷手法,在國外軟體廠商開始引進原版軟體觀念的當時,倚天中文卻反其道而行,允許校園甚至一般使用者無條件且免費複製其中文系統,因此,讓倚天中文在當時幾乎成為中文的標準,也由於倚天中文正是採用BIG5編碼,嚴格說來,也就是BIG5碼為何一直沿用到現今的主要原因了。
大五碼錯在哪裡?
錯在編碼時沒有把美國標準資訊交換碼 ASCII(American Standard Code for Information Interchange)的控制碼摒除在外,凡是唸過計算機概論的人都知道ASCII是以位元組(byte)為單位,又1 byte=8 bits,所以ASCII最多可以編2^8=256個字元,對於只有26個字母的英文語系國家來說已綽綽有餘,但對於有幾萬字的中文絕對不夠,因此必須用兩個byte來代表一個中文字,如"中"字的編碼即是"A4A4″。然而,BIG5碼設計時為了避免與ASCII衝突,每個中文字的第一個byte僅使用 ASCII裡的高字元(129-255),但在第二個byte卻用到了部分低字元(1-128),這正是BIG5碼在日後應用上造成極大不便的最大幫兇了。
BIG5不只找php麻煩,連UNIX都倖免於難
7C 是 ASCII 裡的 pipe ‘|’ 用過 UNIX的人應該知道它是作什麼的,舉一個簡單的例子,如果你用 FTP 上傳一個 “四.doc” 的檔名到 UNIX 作業系統 ,傳完後立刻變成 “北.doc’,我想有太多人碰過這種經驗,原因無他,中文字 “四” 的 BIG5 碼是"A57C",當 UNIX 看到 7C 時會覺得莫名其妙,上傳一個 “|” 給我做什麼?於是就自己處理掉了…
因此,你可以想像只要是中文字第二個byte是 “7C” 的,保證也都難逃BIG5的魔掌。
許功蓋的解決之道
一、去除程式裡出現問題那段程式碼裡的STRIPSLASHES函數,如此,除了顯示"許蓋功"時可能變成"許蓋功"之外,似乎也沒太大的問題,但是,MySQL Server的隱碼及跳脫字元問題還是存在的。
二、使用big5_func字串處理函數集
當你決定使用big5_func來處理時,就必須將mysql的charset也一併改為BIG5,切記千萬不可讓許、功、蓋等字放在要插入資料字串的最後面。還有一個比較嚴重的問題是,變更charset是必須重新編譯mysql的,也就是說如果你是已經運作正常的主機,必須重新安裝MySQL Server並加入 charset=big5 的參數,若如果你是租用的虛擬主機,那問題就會變得更為複雜,因為主機供應商通常不會特別因為你要使用big5_func的函數而重新去編譯他們的資料庫系統。
幸虧得是網絡上資源浩瀚無窮,可以搜尋繁體中文OSC版本,僅針對MySQL的charset為latin1的一些修正資料。由於BIG5所造成的問題幾乎無所不在,筆者認為除非BIG5有一個完整的補救計劃,否則許功蓋將會一直困擾著所有用PHP+MySQL架站的人,相信網絡上許多熱心的高手可以來解決BIG5的問題。或者,省得這麼多的麻煩乾脆全部改採萬國碼(Unicode),值得高興的是MySQL終於從善如流接受雙字元,自 v4.1版 以上已經支援 UTF-8 編碼了,真是可喜可賀,造福華人世界呀!

附錄:
BIG5碼中容易衝碼的文字:
(請注意看你的內文是否用到了下列的字:)
ASCII(5C) == “”
A45C么 AE5C娉 B85C稞 C25C擺 A55C功
AF5C珮 B95C鈾 C35C黠 A65C吒 B05C豹
BA5C暝 C45C孀 A75C吭 B15C崤 BB5C蓋
C55C髏 A85C沔 B25C淚 BC5C墦 C65C躡
A95C坼 B35C許 BD5C穀 AA5C歿 B45C廄
BE5C閱 AB5C俞 B55C琵 BF5C璞 AC5C枯
B65C跚 C05C餐 AD5C苒 B75C愧 C15C縷
ASCII(7C) == “|”
AA7C泜 B47C揉 A87C育 BE7C魯 B27C琍
BC7C慝 C67C鸛 A97C尚 B37C逖 BD7C罵
A77C坑 B17C悴 BB7C誡 C57C疊 A67C帆
B07C院 BA7C漏 C47C辮 AB7C咽 B57C稅
BF7C糕 AC7C洱 B67C閏 C07C嚐 AD7C迢
B77C會 C17C舉 A47C弋 AE7C徑 B87C腮
C27C甕 A57C四 AF7C砝 B97C頌 C37C牘

2009年8月26日 星期三

php 與 mysql的操作原理及函式使用

在PHP與Mysql的互動過程中,SQL語法的查詢、新增、修改及刪除的作用僅是結果的呈現,在PHP與MySQL兩個系統的操作過程,大致可分為下列簡單的幾個步驟:
一、連結資料庫

    1. 建立連線:
      $link = mysql_connect("Mysql主機名稱", "帳號", "密碼")
      or die("無法連接資料庫: " . mysql_error( ));
    2. 選擇資料庫:
      mysql_select_db("資料庫名稱") or die("無法選擇資料庫");

二、執行SQL語法

    1. 建立SQL語法
      (查詢) $query = "SELECT * FROM my_table";
      (新增) $query = "INSERT INTO my_table (c1,c2,...) VALUES ( value1,value2, ...)";
      (修改) $query = "UPDATE my_table SET c1='abc' WHERE id='100' ";
      (刪除) $query = "DELETE FROM my_table WHERE id='100' ";
    2. 送出SQL語法到資料庫系統
      $result = mysql_query($query) or die("無法送出" . mysql_error( ));

三、取得執行SQL語法後的結果 (指查詢部份)

    while ( $row = mysql_fetch_array($result) ) {
    echo $row[0]."<BR>";
    }

四、釋放與Mysql的連線

mysql_free_result($result);

Mysql相關函數

函數名稱/用途說明

mysql_affected_rows
得到 MySQL 最後操作影響的列數目。

mysql_change_user
Change logged in user of the active connection

mysql_client_encoding
Returns the name of the character set

mysql_close
關閉 MySQL 伺服器連線。

mysql_connect
開啟MySQL 伺服器連線。

mysql_create_db
建立一個 MySQL 新資料庫。

mysql_data_seek
移動內部傳回指標。

mysql_db_name
取得結果資料。

mysql_db_query
送查詢字串 (query) 到 MySQL 資料庫。

mysql_drop_db
移除資料庫。

mysql_errno
傳回錯誤訊息代碼。

mysql_error
傳回錯誤訊息。

mysql_escape_string
Escapes a string for use in a mysql_query.

mysql_fetch_array
傳回陣列資料。

mysql_fetch_assoc
Fetch a result row as an associative array

mysql_fetch_field
取得欄位資訊。

mysql_fetch_lengths
傳回單列各欄資料最大長度。

mysql_fetch_object
傳回物件資料。

mysql_fetch_row
傳回單列的各欄位。

mysql_field_flags
獲得目前欄位的旗標。

mysql_field_len
獲得目前欄位的長度。

mysql_field_name
傳回指定欄位的名稱。

mysql_field_seek
設定指標到傳回值的某欄位。

mysql_field_table
獲得目前欄位元的資料表 (table) 名稱。

mysql_field_type
獲得目前欄位的型態。

mysql_free_result
釋放傳回佔用記憶體。

mysql_get_client_info
取得 MySQL客戶端的資訊

mysql_get_host_info
取得 MySQL客戶端的主機名稱

mysql_get_proto_info
取得 MySQL客戶端Get MySQL protocol info

mysql_get_server_info
Get MySQL server info

mysql_info
Get information about the most recent query

mysql_insert_id
傳回最後一次使用 INSERT 指令的 ID。

mysql_list_dbs
列出 MySQL 伺服器可用的資料庫 (database)。

mysql_list_fields
列出指定資料表的欄位元 (field)。

mysql_list_processes
List MySQL processes

mysql_list_tables
List tables in a MySQL database

mysql_num_fields
取得傳回欄位元的數目。

mysql_num_rows
取得傳回列的數目。

mysql_pconnect
開啟MySQL 伺服器長期連線。

mysql_ping
如果沒有連線,則偵測伺服器的連線或重新連線。

mysql_query
送出一個 query 字串。

mysql_real_escape_string
Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection.

mysql_result
取得查詢 (query) 的結果。

mysql_select_db
選擇一個資料庫。

mysql_stat
取得目前系統狀態。

mysql_tablename
取得資料表名稱。

mysql_thread_id
Return the current thread ID

mysql_unbuffered_query
Send an SQL query to MySQL, without fetching and buffering the result rows

revit 小住宅練習

revit 小住宅練習 專案零件檔下載