茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671863 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00035.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

DB研討會 : [分享]mysql與phpMyAdmin顯示或儲存utf-8問題集

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]mysql與phpMyAdmin顯示或儲存utf-8問題集
mysql big5 轉 utf-8 速記

當網站改版時,要把以往mysql的big5資料轉換成utf-8時,常常會是個頭痛的問題。

要轉換,你的新舊資料庫都有phpmyadmin的介面,另外還得有big5->utf-8的工具,在windows上中文轉換工具首選為 ConvertZ ,在linux上得轉碼工具為iconv。

[全文:]

首先,檢查看看phpmyadmin在輸出csv檔案時會不會有問題。
stripslash為把字串去掉反斜線的函式,但是在處理big5碼的時候便會碰到難題,他會將big5的斜線去掉,以至於轉出來的文字變成亂碼。新版的phpmyadmin已經沒有這個問題,但是要看看舊版有沒有在轉出的時候加上這個函式,得把他去掉
編輯 phpmyadmin/libraries/export/csv.php

    function PMA_exportData
裡頭,找到while迴圈,並找找看有沒有stripslash的function:


while ($row = PMA_DBI_fetch_row($result))
.....
$row[$j] = stripslashes($row[$j]);

把function拿掉,留下

    $row[$j];
就好。

第二,輸出csv資料。到phpmyadmin的輸出頁面,針對舊資料庫一次一個表格輸出。調成csv匯出,存檔。

第三,匯出資料庫的結構schema。到phpmyadmin的輸出介面,針對全部的表格,調成SQL輸出,並且不要包含資料,下載回來的是單純的sql結構檔。

第四,打開convertz,對剛剛轉下來的csv轉換成utf8的動作。

第五,到新資料庫,先把剛剛.sql的結構給匯入,建立好空的table格式。如果在mysql4.1以後,如果有預設連線校對,匯入的表格統統都會用該連線校對設定。

第六,一個一個資料表,匯入剛剛存下的csv檔。

最後,檢查看看新資料庫有沒有亂碼。

這應該是個笨方法,不過目前沒有出現中文轉換的問題。如果一直試不成功,不妨也可以試看看這個笨方法。

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]mysql 4.1中文(utf-8)支援設定
mysql 4.1中文(utf-8)支援設定

mysql對utf-8的支援,如果確定都是要給utf-8服務的話,client程式也都是以utf-8來連的話,那可以用這樣的設定

1. 在my.ini的client與mysqld加入下面這些

[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci 

2. 建立資料庫時,確定要加入這個選項

    DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 

應該會是這樣的語法
    CREATE DATABASE `tmp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

資料表的屬性也要確定為

    COLLATE utf8_general_ci 

不過直接新增資料表,為跟著資料庫的設定一起,便可以不用加上屬性

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]MySQL 4.1x 中文亂碼問題
MySQL 4.1x 中文亂碼問題

現在多數host裝的還是 MySQL 4.0x 版本以下,如果升級到了4.1x 或者移動到使用4.1x 的主機上,估計會遇到一些問題。我在powweb上遇到了兩個問題。

一是數據導入。在phpMyAdmin內導入後,發現中文變成了亂碼。搜索學習後,瞭解到需要設置數據庫的collation (校勘),如果你的數據庫是utf-8的,設置為utf8_general_ci就可以了。

二是,即使正確導入了,在phpMyAdmin裡也能正確顯示,但WordPress頁面上顯示的文章內容都是「???」,而模板裡面的漢字都能正常顯示。這讓我頭疼了很久。搜索到 Windix’s Weblog 上有對此的說明:

從MySQL 4.1開始引入的多語言支持確實很棒,而且一些特性已經超過了其他的數據庫系統。不過我在測試過程中發現使用適用於MySQL 4.1之前的PHP語句操作MySQL數據庫會造成亂碼,即使是設置過了表字符集也是如此。我讀了一下新的MySQL在線手冊中第十章” Character Set Support 最後終於找到了解決方法並測試通過。

MySQL 4.1的字符集支持(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和連接(connection)。

當我們按照原來的方式通過PHP存取MySQL數據庫時,就算設置了表的默認字符集為utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。解決方法是在發送查詢前執行一下下面這句:


SET NAMES `utf8`;

但是我依舊不知道,如何,在何處讓WordPress運行這個SQL語句。後來在 阿修的部落格 上查到辦法:

為著解決這個問題必須去修改wp-includes/wp-db.php內的資料連線設定。詳細的修改方式是這樣的:

 
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//?#91;上下面這行
$this->query("SET NAMES 'utf8'");

這樣子終於能正常顯示中文的WordPress了。雖然後來 還是沒用Powweb ,但是覺得這個經驗會對別人有用。記得有人用email和我討論過這樣子的中文顯示問題,但是我那時哪裡知道問題出在MySQL 4.1x上。

還有,4.1x的數據庫不向下兼容,所以升級的時候要三思啊。

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]如何修正 MySQL 資料庫的 encoding?
如何修正 MySQL 資料庫的 encoding?
Posted in SA, Chinese Processing, Web by jeffhung @ August 11th, 2005 |
最近 gslin 的 blog 因為 MySQL 資料庫的 encoding 問題,發生異常現象,只好從零開始。無獨有偶地,Pesty 最近也處理了 MySQL 使用 UTF-8 的相關問題。這些問題之所以會發生,是因為越來越多的 web application 套件使用 UTF-8 儲存資料,但大家在設定 MySQL 時卻都沒有注意到這點,仍然使用預設的 latin1 作為資料庫的 encoding。Web application 餵入 UTF-8 資料,MySQL 卻當作 latin1 在讀,雖然 web application 讀回來的時候,因為剛好是反向處理,資料看似沒有任何異常,但實際上 collation 是錯的,當進行移機、備份甚至轉換 web application 時,也都會發生問題。 我一年多前也有遇到類似的問題,原本在公司有個用 phpBB2 架的 forum,採用 big5 編碼,但實際上 mysql-3.23 裡是用 latin1 存。想要轉換成 UTF-8,移機到 FreeBSD 5 上改用 mysql-4.1,就發生問題了。我那時沒有解決,所以 phpBB2 移機計畫暫緩了一年多,但實在是多跑一個 virtual machine 只為了這個移不過來的 phpBB2,實在浪費記憶體。剛好看到 gslin 與 pesty 最近也在弄這個問題,就重新試了一遍步驟如下:
用 mysqldump 自 mysql-3.23 倒出來,
發現必須加上 --default-character-set=latin1 的參數,
才能正確倒出實際上是用 big5 的 phpBB2 的資料庫。
用 iconv -c -f CP950 -t UTF-8 將倒出來的 SQL 轉成 UTF-8。
必須要加 -c,否則會死在半路。
換句話說,其實中間已經有東西爛掉了。
進 mysql 用 SET GLOBAL/SESSION character_set_XXX=utf8 調整 system variables,
將 charset 與 collation 通通改成 UTF-8,然後做 CREATE DATABASE phpbb2。
再用 SOURCE 指令把剛剛用 iconv 轉出來的 SQL 檔倒回來。

結果在第四個步驟裡,mysql (client) 就 core dump 了。猜測有可能是第二步用 -c 硬轉時,把某個指令搞爛了。不過 mysql (client) 是直接 core dump 而不是跑 error message 出來指出錯誤何在,所以這下難辦了,只能靠 iconv 不加 -c 想辦法慢慢抓問題。
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]MySQL 5 使用 UTF-8 配合 WordPress 的問題
MySQL 5 使用 UTF-8 配合 WordPress 的問題

果然「Ignorance is a bliss」。不知道、不清楚、不明白、不去碰它,就不會有問題。一研究,才發現原來問題那麼多。這邊先筆記以下,改天繼續。

MySQL 編碼方面

目前發現 MySQL 5.0.11-beta 裡用的都是 latin1。目前心得是依照這個步驟改:

  1. 用 mysqldump -default-character-set=latin1 來備份所有資料庫(確認過用這個丟出來的檔案,可以直接用 Vim 與 EmEditor 當成 UTF-8 開啟,中文都正常顯示)
  2. 把各資料庫刪除(也就是 WordPress……當然系統方面的東西不碰他)
  3. 把備份資料庫丟回去

不過不確定可行,所以還沒做。最終目標是全 UTF-8 的資料庫後端,所以還得改 my.cnf──但是我就是找不到這個檔案在哪裡呀!


MySQL 編碼問題更新

終於完成了(我用 FreeBSD 5.3 + MySQL 5)。問題簡單來說,就是 MySQL 預設內部是用 latin1 處理資料,所以外表看似 UTF-8 的 WordPress 站實際資料卻並非純正 UTF-8。用 mysqldump 看就會發現全都是亂碼,直接在 mysql 裡 SELECT 出來的也全是亂碼。

  1. 先進 mysql 看編碼:
      mysql> show variables like '%character%'; 
    ,都是 latin1 的話就要改
  2. 備份 WordPress:
      mysqldump -u root -p --default-character-set=latin1 --add-drop-table 資料庫名稱 > 備份檔名稱 
  3. 把資料庫編碼改過:
      mysql> ALTER DATABASE DEFAULT CHARACTER SET utf8; 
  4. 修改
      /etc/my.cnf 
    ,加入:

    			[mysqld]
    			default-character-set=utf8
    			[mysql]
    			default-character-set=utf8
    

  5. 重新啟動 MySQL:
       /usr/local/etc/rc.d/mysql-server.sh restart 
  6. 先備份一份剛才的資料庫備份檔,然後手動編輯把裡面的 latin1 改成 utf8;一個是最開頭的「SET NAMES latin1」,再來就是建立每個表格時的「ENGINE=MyISAM DEFAULT CHARSET=utf8;」
  7. 改好之後把資料庫送回去:
       mysql -u root -p 資料庫名稱 < 改過的備份檔案名稱 

  8. 最後,如果是用 root 或其他 SUPER 權限帳戶存取 MySQL 的話,還得修一下 WordPress 的 wp-includes/wp-db.php,在連接資料庫後自己 set names:搜尋
       $this->select($dbname);  
    然後在前一行加入
       mysql_query("SET NAMES 'UTF8'");  
    即可。( clsung 說:「 具有 SUPER 權限的人,加在 my.cnf 是沒用的 。」我想大概只要另外給一個使用者供 WordPress 專用,就不用修 wp-db.php 了吧……話說回來,只因為懶得研究如何新增使用者、授予權限,就讓 WordPress 一直用 root 去連 MySQL,我也實在是太沒警戒心了。)
  9. 如果出問題,可以從備份還原:
       mysql -u root -p 資料庫名稱 < 備份檔名稱 

如此就大功告成了,從裡到外每一環節都是 UTF-8,在 mysql 裡直接 SELECT 出來的也都是正確的 UTF-8 中文了。總共兩天的時間,加起來花了好幾個小時,雖然有點累,但也成果豐碩,學了不少東西。這種滿足感,可是玩 Windows 很少有的。

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享][phpmyadmin 2.6 up + mysql 4.0 up] utf-8 亂碼問題解決方法
[phpmyadmin 2.6 up + mysql 4.0 up] utf-8 亂碼問題解決方法
前言
很多php愛好者都很喜歡用phpmyadmin來管理mysql的資料,但新版本的charset好像比較複雜了, 以致有人的phpmyadmin在顯示資料時有亂碼的情形(圖: 取自www.phpv.net
安裝完發生問題後就我一直找解決的辦法, 發現根本沒有完整解決辦法, 所以就用找到的資料了解一下phpmyadmin, mysql的設定來解決.

問題解決過程
我一開始在用的時候當在phpmyadmin處理的資料在他本身來看其實是沒有問題的, 然而當用php show出來的時間就會看到好多亂碼, 而在php處理的只在phpmyadmin有問題, 就知道問題只在於phpmyadmin的顯示方式.
但之後看一看html是utf-8 encode的, 無理由phpmyadmin跟我自己php program, 同樣用utf-8顯示出來會有不同的. 所以便想到問題不是整個php, 也包括mysql的, 那麼在看到phpv.net的一段簡體中文變成亂碼的解決教學中, 想到了, mysql是用latin1為默認的, 而關鍵應該就是phpmyadmin跟mysql mapping的問題了. 再找一下php的設定檔, 終於解決了問題了 ^^"

解決方法

大家先在hpmyadmin中的libraries裡開啟select_lang.lib.php, 找一下"$mysql_charset_map", 在那將'utf-8' => 'utf8'改成'utf-8' => 'latin1', 那麼在phpmyadmin中就會使用latin1來做編碼, 在phpmyadmin中便能正常顯示出資料了!

:::註:::
這只是我解決問題的小心得, 不代表一定能解決你的問題, 只希望可以讓跟我有同樣問題的朋友能解決問題, 不用downgrade phpmyadmin或mysql -v-"
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]解決phpmyadmin 亂碼,支持 utf-8 讓phpMyAdmin 同時支援 Big5 & UTF-8
解決phpmyadmin 亂碼,支持 utf-8 讓phpMyAdmin 同時支援 Big5 & UTF-8
PHP版本: 4.4.2
伺服器作業系統: FreeBSD
MySQL版本: 4.1.19
phpMyAdmin版本: 2.8.1

解決方法:
UNIX LIKE
/{dir}/phpMyAdmin/libraries/select_lang.lib.php

WIN
C:\AppServ\www\phpMyAdmin\libraries\select_lang.lib.php

1.支援 UTF-8
在這一段裡:
// MySQL charsets map
$mysql_charset_map = array(

將:
'utf-8' => 'utf8',

改成:
'utf-8' => 'latin1',

若要同時支援 Big5 則繼續下面修正
2.支援 Big5
將:
'big5' => 'big5',

改成:
'big5' => 'latin1',

(加上-utf-8 在語言選單就會出現chinese_traditional-big5的選項)
將:
'zhtw-big5' => array('zh[-_](tw|hk)|chinese traditional', 'chinese_traditional-big5', 'zh-TW'),

改成:
'zhtw-big5-utf-8' => array('zh[-_](tw|hk)|chinese traditional', 'chinese_traditional-big5', 'zh-TW'),

到這邊將Apache重起後...就可以在phpmyadmin裡面看到Big5的編碼啦...
記得語系要選擇 'zhtw-big5-utf-8' 這樣才可以...
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[教學]phpBB+BugFree+XAMPP的UTF-8經驗談
鑑於本次冷日要再Windows上面透過XAMPP寫一個系統,
其中使用Apache/2.2.2 (Win32) PHP/5.1.4 與 MySQL - 5.0.21 作為平台,
然後冷日採用 BugFree1.0 + phpBB 2.0.20 還有 phpMyAdmin - 2.8.1。

此時碰上了MySQL常見的UTF-8問題,
簡單來說,就是 MySQL 預設內部是用 latin1 處理資料,
所以外表看似 UTF-8 的網站實際資料卻並非純正 UTF-8。
用 mysqldump 看就會發現全都是亂碼,
直接在 mysql 裡 SELECT 出來的也全是亂碼,
phpMyAdmin也無法正常顯示輸入的資料!

冷日的處理方法如下:
1.備份資料庫:
mysqldump -u root -p --default-character-set=latin1 --add-drop-table bugfree > bugfree_latin1.sql
mysqldump -u root -p --default-character-set=latin1 --add-drop-table phpBB2 > phpBB2_latin1.sql


2.轉換編碼:
使用ConvertZ把 bugfree_latin1.sql、phpBB2_latin1.sql 分別用utf-8編碼另存為bugfree_UTF8.sql、phpBB2_UTF8.sql
然後把bugfree_UTF8.sql、phpBB2_UTF8.sql這兩個檔案裡面所有的「latin1」這字眼取代為「utf8」

3.設定MySQL:
修改my.cnf,在client區段加入default-character-set=utf8,如下
[client]
default-character-set=utf8

在mysqld區段加入utf8設定,如下
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
default-character-set = utf8
default-collation = utf8_general_ci


4.倒回資料:
mysql -u root -p bugfree < bugfree_UTF8.sql
mysql -u root -p phpBB2 < phpBB2_UTF8.sql


5.重新啟動MySQL

6.修改資料庫連結:
在每個(就是BugFree與phpBB)資料庫連結Function檔案裡,只要db connect上以後,馬上加入這一行:
mysql_query("SET NAMES 'UTF8'");


這樣就大功告成啦!

順便提一下, UTF-8 編碼的東東,在透過 get 傳遞的時候,常常會有怪怪的狀況,
比方說使用者要設定「永遠將URL傳送成UTF-8」或是明明已經設定好了,卻還是會有和其他英文字碼混在一起變亂碼的問題,
這時候請使用php內建的函式「rawurlencode」!
使用方法如下:
string rawurlencode (string str)

如此你的字串不管是啥編碼,都會被轉成RFC1738的URL編碼,應該就不會錯了啦!
至少冷日測試是OK的喔。
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|