[ travel ] 14 九月, 2009 16:53

    這次去宜蘭住的一家民宿, 布置的很不錯喔, 後面有一個漂亮的水池..

http://www.ete.com.tw/springvilla/

http://www.springvilla.com.tw/

    原本是要住他新開的花間雅舍, 但是都客滿, 建議平日去比較便宜喔.

    個人比較喜歡這種很舒服的布置, 會讓我回到房間休息時有在家的感覺, 當然外面的風景一定要美美的.

[ Linux ] 04 九月, 2009 16:32

awstats安裝完後有時候會需要更詳細的資料, 想知道該IP是從那個國家來的, 可以使用免費版的GeoIP, 準確率60%, 付費版的聽說是75%

Geo:IP 除了perl元件外需要C library支援

自動安裝library

  1. C library可以用yum 安裝
    yum install GeoIP
  2. Perl library  可以用CPAN
    cpan
    install Geo::IP (可能有相依性的問題)

手動安裝library方式如下

  1. perl的Geo::IP需要有C library支援
    wget http://www.maxmind.com/download/geoip/api/c/GeoIP-1.4.6.tar.gz
    tar zxvf GeoIP-1.4.6.tar.gz
    cd GeoIP-1.4.6
    ./configure
    make
    make check
    make install
    echo '/usr/local/lib' >> /etc/ld.so.conf
    /sbin/ldconfig /etc/ld.so.conf
    cd ..
  2. perl的Geo::IP
    wget http://www.maxmind.com/download/geoip/api/perl/Geo-IP-1.38.tar.gz
    tar zxvf Geo-IP-1.38.tar.gz
    cd Geo-IP-1.38
    perl Makefile.PL
    make
    make test
    make install
    cd ..

下載所需的資料檔

wget http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz
gunzip GeoIP.dat.gz
mv GeoIP.dat /var/lib/GeoIP/GeoIP.dat (如果資料夾不存在手動建立)

修改awstats.domainname.conf

vi awstats.domainname.conf
拿掉註解並修正
LoadPlugin="geoip GEOIP_STANDARD /var/lib/GeoIP/GeoIP.dat"

重新跑一次awstats應該就ok了, 再來我們要每個月自動更新IP的檔案

建立自動更新的程式
vi /usr/connexone/bin/update_GeoIP.sh
#!/bin/bash
# Name: update_GeoIP.sh
# Version: 0.1
# Last Modified: 2009-09-04
wget http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz
gunzip GeoIP.dat.gz
mv GeoIP.dat /var/lib/GeoIP/GeoIP.dat

加入每月更新 
crontab -e
15 7 5 * * /usr/connexone/bin/update_GeoIP.sh >/dev/null

[ MySQL ] 02 九月, 2009 17:58

使用phpmyadmin與已知工具轉換big5的資料庫為utf-8

轉換資料庫編碼並沒有簡單的方法,因為big5編碼有許多的\,在透過軟體轉換編碼後也需要再做調整

  1. 用phpmyadmin備份,不過需要確認是使用latin1編碼連線的,不然會產生亂碼喔,如果是在4.0版的mysql是不會有問題,在4.1版以上的mysql通常phpmyadmin會使用utf-8編碼, 需參考文章讓phpmyadmin同時支援big5與utf-8, 並使用big5連線, 匯出的才是一般的big5編碼文字.這裡我們匯出database.sql
  2. 修改剛剛備份好的 sql 檔案,用編輯器打開 查找”DEFAULT CHARSET=latin1″ 用”DEFAULT CHARSET=utf8″替换
  3. 使用支援big5轉utf-8編碼的編輯器, 將big5的database.sql檔案轉換成utf-8編碼, notepad++是其中一個可以用的, 只要打開檔案後點選格式->轉換至utf-8碼格式(檔首無BOM)即可
  4. big5的編碼匯出後有些特殊字會有問題, 像許大功都會在字的後面產生多餘的\ ,ex 功\ ,所以要善用搜尋與取代把這些\拿掉, 不然在匯入utf8的資料庫後這些字後面都會多出\,或是匯到一半就錯誤,下面列舉幾個常看到的字
    許\\
    功\\
    蓋\\
    餐\\
    愧\\
    擺\\
    穀\\
    淚\\
    豹\\
    珮\\
    俞\\
  5. 在phpMyadmin中設定MySQL 字符集: UTF-8 Unicode (utf8)
  6. phpMyadmin中設定MySQL 連線校對 選 utf8_general_ci
  7. 然後在重新利用phpmyadmin把檔案匯入到新建立的資料庫
  8. 修改程式碼,資料庫連線的語法後面加入
    $this->query(”SET NAMES ‘utf8′” );
[ MySQL ] 02 九月, 2009 17:56

轉換資料庫編碼並沒有簡單的方法,因為big5編碼有許多的\,在透過軟體轉換編碼後也需要再做調整 

所以為了解決亂碼問題,在PHP 與 MySQL 建立連線時,於 query 之前先執行:

mysql_query("SET CHARACTER_SET_CLIENT=utf8");
mysql_query("SET CHARACTER_SET_CONNECTION=utf8");
mysql_query("SET CHARACTER_SET_RESULTS=utf8");

如上三列編碼都一樣時,可直接執行下列

mysql_query("SET NAMES utf8");

◎ MySQL資料庫big5轉utf8:

Step1:首先把資料dump出來

由於先前資料是存成latin1,所以dump出來後要用iconf或piconf把他轉成UTF-8,記得dump出來時要加上-default-character-set=latin1

#mysqldump -u 帳號 -p --default-character-set=latin1 資料庫 >output.sql

Step2:big5轉成utf8

如果原先是Big5的資料, dump出來後就直接把Big5轉成UTF-8即可

#piconv -f big5 -t utf8 output.sql >utf8.sql

如果原先是UTF-8的資料,dump出來後要先轉成Big5後,再把他轉成UTF-8,因為原先dump出來的是偽裝成UTF-8的lantin1不是真正的UTF-8

#mysqldump -u 帳號 -p -default-character-set=latin1 資料庫 >output.sql
#piconv -f utf8 -t big5 output.sql > big5.sql
#piconv -f big5 -t utf8 big5.sql >utf8.sql

Step3:修改sql檔

1、修改轉成的sql檔中所產生的‘’\”及換行的問題(有時換行時會成‘\n’)

2、在dump出來的sql檔最前面加上:
SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;

:1,$s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g
:1,$s/latin1/utf8/gc
:1,$s/許\\/許/g
:1,$s/功\\/功/g
:1,$s/蓋\\/蓋/g
:1,$s/餐\\/餐/g
:1,$s/愧\\/愧/g
:1,$s/擺\\/擺/g
:1,$s/穀\\/穀/g
:1,$s/淚\\/淚/g
:1,$s/豹\\/豹/g
:1,$s/珮\\/珮/g
:1,$s/俞\\/俞/g


再來把每個資料表後面的TYPE=MyISAM是否有DEFAULT CHARSET=latin1;
若沒有請改為ENGINE=MyISAM DEFAULT CHARSET=utf8;

Step4:建立新的資料庫

方法1. SQL語法
CREATE DATABASE `資料庫` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

方法2. 用phpMyAdmin建立資料庫的,建立時”校對”要選utf8_general_ci

步驟五:import資料

方法1. SQL語法

#mysql -u 帳號 -p 資料庫 < utf8.sql

方法2. 直接用phpMyAdmin把他import進去了,import時記得文字編碼檔案要選utf8即可。不過使用phpMyAdmin import 有檔案大小的限制,可先把sql檔分成幾個檔案。

◎ 最後記得檢查看MySQL的my.cnf設定檔內要加入以下設定
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci

http://yumax1012.blogspot.com/2009/04/mysql-big5-utf8.html

[ MySQL ] 02 九月, 2009 17:50

轉貼

從前的舊包袱:MySQL database 和 table 都是 latin1,資料裡面有big5中文。又因應 big5,所以會有許多的 escape char("\") 在裡面;如今 UTF-8 的趨勢,用 mysqldump 出來的資料,裡面有 big5 的 \,也有跳脫特殊資源的 \,用 iconv 或 piconv 把 dump 出來的文字檔轉成 UTF-8 之後,要塞進新的資料庫會出現一堆問題,不外乎是取代跳脫字元時的例外狀況。資料不多的狀況下還好辦,用人眼判斷即可。但是資料量達到數十萬筆甚至數百萬筆的時候,恐怕還是換個方法吧。


環境如下:

系統直接升級為 MySQL version 5
舊的資料庫 OLD_DB ,charset 是 latin1,裡面有一個 table 叫作 tbl, charset 亦為 latin1

my.cnf 裡面

[client] 中有設定 default-character-set = utf8

[mysqld] 中有設定 default-character-set = utf8 還有 skip-character-set-client-handshake

[mysql] 中有設定 default-character-set = utf8

寫一個像以下的 php 如下:

<?
$outputfile= "OUTPUT.sql";
$DB_HOST="localhost";
$DB_USER="testuser";
$DB_PASS="testpass";
$DB_DBNAME="OLD_DB";
$DB_TABLE="tbl";

$fp=fopen($outputfile, "w+");
if(!$fp){
echo "Can not open file for writing.\n";
exit;
}

$dbcon=mysql_connect($DB_HOST, $DB_USER, $DB_PASS);
mysql_query("SET NAMES latin1", $dbcon);
mysql_select_db($DB_DBNAME, $dbcon);
$sqlstr="select * from $DB_TABLE";
$rs=mysql_query($sqlstr, $dbcon);
$NAMESTR="SET NAMES utf8;\r\n\r\n";
fwrite($fp, $NAMESTR, strlen($NAMESTR));
while($rsrow=mysql_fetch_row($rs)){
$i_sqlstr="INSERT INTO $DB_TABLE VALUES(";
foreach($rsrow as $rid=>$rval){
$rsrow[$rid]=iconv("BIG5", "UTF-8", $rval);
if(strval($rid)=="0")
$i_sqlstr.="'".addslashes($rsrow[$rid])."'";
else
$i_sqlstr.=", '".addslashes($rsrow[$rid])."'";
}
$i_sqlstr.=");\r\n\r\n";
fwrite($fp, $i_sqlstr, strlen($i_sqlstr));
}
mysql_free_result($rs);
mysql_close($dbcon);
fclose($fp);

exit;
?>

執行這個 php 之後,會產生一個 OUTPUT.sql

匯入之前,先建好新的 database 和 table。記得新的 databae 和 table 都要以 utf8 為 default charset

然後就可以 mysql -u XXX -p < OUTPUT.sql

轉換為 UTF-8 的過程並不會比傳統 mysqldump 出來再 import 進去來得慢。

http://blog.sikazozo.org/index.php?/archives/95-Mysql-latin1-table-UTF8-PHP.html

[ MySQL ] 02 九月, 2009 17:47
有用過 mysql 的 UTF-8 編碼的人可能都會對這件事感到疑惑:

連線校對(collation)裡面的

utf8_general_ci

utf8_unicode_ci

到底有什麼差異呢?
在 phpMyAdmin 裡面的說明看起來通通一樣:

utf8_general_ci 統一碼 (Unicode) (多語言), 大小寫不相符
utf8_unicode_ci 統一碼 (Unicode) (多語言), 大小寫不相符

utf8_general_ci 在轉換時速度比較快
utf8_unicode_ci 在轉換時比較精準

轉換?怎麼講呢?
簡單說就是當資料要從一個編碼換成另外一個編碼時,
mysql 要在兩個 codepage 裡面找出來相對應的字元位置在哪裡。
對 utf8_general_ci 來說,來源 codepage 裡面的一個字元只能對應到目標 codepage 裡面的一個字元,
而 utf8_unicode_ci 則可以把來源 codepage 裡的一個字元對應到目標 codepage 裡的多個字元(或反過來)。
例如德文裡的 ß 要轉換成英文的時候如果是用 utf8_unicode_ci 轉換會變成正確的 ss ,
但是如果用 utf8_general_ci 的話則會變成單一的 s 而已。

所以如果可以的話請盡量用 utf8_unicode_ci 而不要用 utf8_general_ci ,
雖然對 multibyte 字元來說這兩個都沒差,
但是 utf8 的網頁誰也不知道哪天會不會有這種字元出現在你的網頁上,
所以如果設成 utf8_unicode_ci 你就不需要擔心貼上去之後資料在轉換間遺失了。
[ MySQL ] 02 九月, 2009 17:24

當系統預設為latin1時(my.cnf裡面沒有設定default-character-set=utf8), 雖然使用了mysql 4.1或5以上的版本, create database的指令預設會建立latin1的編碼, 將資料庫編碼改為utf-8

這個動作也可以在phpmyadmin裡面使用管理, 把資料庫校對改成utf8_unicode_ci就可以

 ALTER DATABASE `database_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci