韌館-LearnHouse

Archive for the 'Linux' Category

mysql 中文亂碼解決方案

內容來源:LINK     (此篇文章僅供站長備份參考用,固為加密文章) 

*mysql中文亂碼的原因

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

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

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

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

mysql 4.1 及之後的版本在語系方面增加了許多功能,它可以設定語系的層次從最底層的 server, database 到單一 table, column, connection 都可以設定,而除了語系之外,還可以指定搭配不同的 collation(校對),所以組合百百種,只要一個錯了就難逃亂碼的命運。

進phpmyadmin找到可輸入 sql query的畫面,然後鍵入:
show variables like '%character%';
這句話會顯示目前資料庫使用的語系設定,一般國外的網站或剛裝好的 mysql 4.1預設都是 latin-1。

[新增資料庫]
如果你熟悉 phpmyadmin 的操作,在畫面上就可以選擇建立新 database 要用的語系,
charset 請選擇 UTF-8 Unicode (utf8)
collation 請選擇 utf8_general_ci (ci 代表 case insensitve 大小寫沒差)

[修改資料庫]
改 database語系,同樣在 phpmyadmin 的query畫面鍵入下面兩行:
alter database myblog
character set utf8;

前面曾經提過,mysql的語系設定是多層次的,前面我們把database與table的語系都設定正確,但程式與mysql連線時的語系則是由 connection 來決定,這部份就要使用程式碼
mysql_query("SET NAMES 'utf8'");
這句話會同時設定 client, results, connection三者使用的語系為 utf-8。

最後檢查是否全部改成 utf-8
show variables like '%character%';

此時你應該會看到大部份欄位都是utf-8了,除了 server 這項之外,如果是用別人的 hosting 主機,就沒法兒改這部份,但平常做案子時大部份都可以直接控管mysql,此時就可以用 my.ini 設定:

[mysqld]
default-character-set=utf8
告訴mysql server啟動時要用 utf-8即可。

*mysql中文亂碼必勝解決法
1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:
C:windowsmy.ini 也就是作業系統的安裝目錄,也有可能是 C:winntmy.ini
C::my.cnf 也就是 C disk 的根目錄

2、my.ini 裏的內容為:
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_c

其 中 mysqld 是指定 server 啟動時要用的語系,但如果這裏設定為 utf8 可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki/wordpress/drupal/gregarius,所以這裏建議設成 latin1。要使用utf8中文的人,只要記得建資料庫時將它設成utf8,讓中文程式正確的使用 utf8 與它溝通即可。

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

所以通常會用一個獨立的檔案來處理 mysql connection的設定,例如:

PHP:

<?
//database connection details.
$host = "localhost";
$link = mysql_connect($host, "xxx", "xxx");
mysql_query("SET NAMES 'utf8'");
mysql_select_db("your_table_name_here", $link);
?>

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

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

2007年10 月 posted by admin in Linux and have No Comments

最簡便的備份MySql資料庫方法

為了同步兩個系統的程式與資料庫,因此用phpmyadmin把資料庫匯出成SQL檔

然後在備援Server匯入!!搞了好久的資料庫!!怎麼用都會有亂碼

從所有的環境變數開刀,對照了系統語系、MySQL語系、資料庫資料表、與phpmyadmin設定

都改成相同了可是就是有問題,後來找出原因是因為我太依賴phpmyadmin的匯出功能了

所以導致匯入到另外一個資料時是錯誤的編碼格式

以下是用mysqldump所匯出來的資料庫備份時所可以用的選項

其實說穿了只是用--help可以看到的所有選項參數

不過以下這篇的選樣說明是中文的,給有需要的人參考看看吧!!

使用MYSQL進行資料庫備份,有很正規的資料庫備份方法,同其他的資料庫伺服器有相同的概念,但有沒有想過,MySQL會有更簡捷的使用檔目錄的備份方法,而且又快有好。  
 
一、資料備份捷徑  
 
因為這個方法沒有得到官方正式文檔的驗證,我們暫稱為試驗吧。  
 
目的:備份hostA主機中一個mysql資料庫TestA,並恢復到到hostB機中  
 
試驗環境:  
 
作業系統:WinNT4.0,Mysql3.22.34,phpMyAdmin 2.1.0  
 
在hostA中安裝mysql資料庫並建立TestA資料庫  
 
hostB機安裝mysql資料庫,沒有TestA資料庫  
 
方法步驟:  
 
啟動phpMyAdmin察看HostA和HostB中的資料庫列表,在HostB中沒有TestA資料庫  
 
找到HostA中mysql的安裝目錄,並找到資料庫目錄data  
 
在我的試驗環境中,這個目錄是  
 
C:mysqldata  
 
找到對應資料庫名稱的子目錄  
 
C:mysqldataTestA  
 
粘貼拷貝到HostB的Data目錄下,是HostA同HostB Mysql資料目錄下的檔相同  
 
刷新HostB的phpMyAdmin察看一下資料庫列表,我們看到TestA已經出現,並且作查詢修改等操作都正常,備份恢復恢復成功  
 
試驗結論:Mysql的資料庫可以通過檔形式保存,備份,恢復只要將相應檔目錄恢復即可,無需使用其他工具備份。  
 
二、正規的方法(官方建議):  
 
導出要用到MySQL的mysqldump工具,基本用法是:  
 
          

代碼:
mysqldump [OPTIONS] database [tables]  


 
如果你不給定任何表,整個資料庫將被導出。  
 
通過執行mysqldump --help,你能得到你mysqldump的版本支援的選項表。  
 
注意,如果你運行mysqldump沒有--quick或--opt選項,mysqldump將在導出結果前裝載整個結果集到記憶體中,如果你正在導出一個大的資料庫,這將可能是一個問題。  
 
mysqldump支援下列選項:  
 
--add-locks  
 
在每個表導出之前增加LOCK TABLES並且之後UNLOCK TABLE。(為了使得更快地插入到MySQL)。  
 
--add-drop-table  
 
在每個create語句之前增加一個drop table。  
 
--allow-keywords  
 
允許創建是關鍵字的列名字。這由在列名前面加表名的方法做到。  
 
-c, --complete-insert  
 
使用完整的insert語句(用列名字)。  
 
-C, --compress  
 
如果客戶和伺服器均支援壓縮,壓縮兩者間所有的資訊。  
 
--delayed  
 
用INSERT DELAYED命令插入行。  
 
-e, --extended-insert  
 
使用全新多行INSERT語法。(給出更緊縮並且更快的插入語句)  
 
-#, --debug[=option_string]  
 
跟蹤程式的使用(為了調試)。  
 
--help  
 
顯示一條幫助消息並且退出。  
 
--fields-terminated-by=...  
 
--fields-enclosed-by=...  
 
--fields-optionally-enclosed-by=...  
 
--fields-escaped-by=...  
 
--fields-terminated-by=...  
 
這些選擇與-T選擇一起使用,並且有相應的LOAD DATA INFILE子句相同的含義。  
 
LOAD DATA INFILE語法。  
 
-F, --flush-logs  
 
在開始導出前,洗掉在MySQL伺服器中的日誌檔。  
 
-f, --force,  
 
即使我們在一個表導出期間得到一個SQL錯誤,繼續。  
 
-h, --host=..  
 
從命名的主機上的MySQL伺服器導出資料。缺省主機是localhost。  
 
-l, --lock-tables.  
 
為開始導出鎖定所有表。  
 
-t, --no-create-info  
 
不寫入表創建資訊(CREATE TABLE語句)  
 
-d, --no-data  
 
不寫入表的任何行資訊。如果你只想得到一個表的結構的導出,這是很有用的!  
 
--opt  
 
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。  
 
應該給你為讀入一個MySQL伺服器的盡可能最快的導出。  
 
-pyour_pass, --password[=your_pass]  
 
與伺服器連接時使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來自終端的口令。  
 
-P port_num, --port=port_num  
 
與一台主機連接時使用的TCP/IP埠號。(這用於連接到localhost以外的主機,因為它使用 Unix套接字。)  
 
-q, --quick  
 
不緩衝查詢,直接導出至stdout;使用mysql_use_result()做它。  
 
-S /path/to/socket, --socket=/path/to/socket  
 
與localhost連接時(它是缺省主機)使用的套接字檔。  
 
-T, --tab=path-to-some-directory  
 
對於每個給定的表,創建一個table_name.sql檔,它包含SQL CREATE 命令,和一個table_name.txt檔,它包含資料。 注意:這只有在mysqldump運行在mysqld守護進程運行的同一台機器上的時候才工作。.txt檔的格式根據--fields-xxx和-- lines--xxx選項來定。
 
-u user_name, --user=user_name  
 
與伺服器連接時,MySQL使用的用戶名。缺省值是你的Unix登錄名。  
 
-O var=option, --set-variable var=option  
 
設置一個變數的值。可能的變數被列在下面。  
 
-v, --verbose  
 
冗長模式。列印出程式所做的更多的資訊。  
 
-V, --version  
 
列印版本資訊並且退出。  
 
-w, --where='where-condition'  
 
只導出被選擇了的記錄;注意引號是強制的!  
 
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"  
 
最常見的mysqldump使用可能製作整個資料庫的一個備份:  
 
          

代碼:
mysqldump --opt database > backup-file.sql  


 
但是它對用來自於一個資料庫的資訊充實另外一個MySQL資料庫也是有用的:  
 
          

代碼:
mysqldump --opt database | mysql --host=remote-host -C database  


 
由於mysqldump導出的是完整的SQL語句,所以用mysql客戶程式很容易就能把資料導入了:  
 
          

代碼:
mysqladmin create target_db_name  
 
mysql target_db_name < backup-file.sql  


 
http://tech.ccidnet.com/art/1105/20050804/303341_1.html
http://ria.richtechmedia.com/category/phpmysql/

 

 

 

2007年9 月 posted by admin in Linux and have No Comments

SQL Server資料匯入MySQL

相信這個問題拜託google大師後會有很多種解法

可是符合需求又簡單的卻沒幾種

而且可分自行寫程式的或是利用軟體轉換 

但偏偏寫程式的方式我怎麼使用都沒辦法正常連線到SQL Server

後來找到了一個方法,不用寫程式就能轉換,而且可以自訂排程 

首先要先下載 MySQL Connector/ODBC

在SQL Server端安裝,這裡的設定以Windows Server 2003為主

安裝完後就開始設定如何連結MySQL,開始→程式及→系統管理工具→資料來源 (ODBC)

切換到系統資料來源名稱,按新增

 

找到MySQL ODBC 3.51 Driver後點選並按完成

 

根據下面圖的指示填入,並選擇所要匯入的資料庫後按OK,若有出現錯誤點選Diagnostics看錯誤訊息

 

再來開始就是要匯資料了,開始→程式集→Microsoft SQL Server→Enterprise Manager,找到你要匯出的資料庫與資料表

在要匯出的資料表按右鍵選 所有工作→匯出資料

 

點選下一步,資料來源選擇Microsoft OLE DB Provider for SQL Server

伺服器選local,並使用Windows的帳戶驗證,資料庫選擇想匯出的資料庫

 

點選下一步,目的地選擇MySQL ODBC 3.51 Driver,使用者/系統 DSN下拉會有當初設定的名稱

 

點選下一步,複製來源資料庫的資料表與檢視表

 

點選下一步,選擇SQL Server中哪些資料表要轉到MySQL並按下一步執行,就可以成功匯進去了

後記

由於匯出來的資料中文是BIG5編碼,因此若MySQL資料表規劃是以UTF-8為編碼格式

可以寫一程式讓他全部轉換成UTF-8,可利用iconv函數去轉換中文的部份 

2007年8 月 posted by admin in Linux and have Comments (7)

Linux下也能讀取硬碟ntfs partition

其實這已經不是什麼新的東西了,在兩年前我就一直在使用

不過兩年前我的部落格還沒成立,所以一直沒有記錄下來

這幾天因為寫程式的需求,把逐漸快被我遺忘的linux找回來

為了娛樂方便,我幾乎也都運行在WIN下,除非工作或學業上需求才會開啟linux

而今天寫這篇主要就是為了更改kerne以方便讀取ntfs的檔案

下載與安裝

下載網址www.linux-ntfs.org,如果是使用RedHat系列的,可直接在此下載RPM

下載前先使用uname -r 指令觀看現行的linux版本 ,找符合您現在的版本

找到之後再來就是選擇CPU了,在CPU等級大多數不是Pentium III就是Pentium 4以上,所以下載i686的

NTFS掛載

mount -t ntfs /dev/hda5 /mnt/windisk/

我是把硬碟的partition掛載在mnt底下的windisk目錄

若不知道你要掛載的ntfs  partition代號是說少可用fdisk -l查詢

 

再來切換到windisk的目錄底下就可以看到winxp的檔案了

 

2007年8 月 posted by admin in Linux and have Comments (8)

vsftpd安裝

由於很忙越來越沒時間寫網誌了

最近要寫一個轉換資料庫的程式

卻發現在校外無法直接連結到SQL Server

因此架設ftp以方便直接上傳後執行!! 

1.下載與安装
wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.5.tar.gz
tar zxvf vsftpd-2.0.5.tar.gz
cd vsftpd-2.0.5
make
make install

2.配置與編輯
cp vsftpd.conf /etc/;
cp RedHat/vsftpd.pam /etc/pam.d/ftp
/etc/vsftpd.conf
新增:listen=YES
ps.無新增會出現not configured for standalone, must be started from inetd錯誤訊息
 
3.啟動服務
/usr/local/sbin/vsftpd &
ps.若出現500 OOPS: could not bind listening IPv4 socket訊息請確認是否有其他的ftp程序正在執行
確認方式可用telnet 127.0.0.1 21

mkdir /var/ftp
chmod og-w /var/ftp
 
4.vsftpd.conf 設定值
設定方式可參閱man vsftp.conf,還有更多的客制化設定,在此只列出站長使用的設定

與主機較相關的設定值
listen=YES #vsftpd以standalone 的方式來啟動
listen_port=21 #可在此設定使用非正規埠號(只能用stand alone 的方式啟動,super daemon 無效)
pasv_enable=YES #啟動被動式連線模式(passive mode)
write_enable=YES #如果你允許使用者上傳資料時,就要啟動這個設定值
use_localtime=YES #是否使用本地時間?vsftpd 預設使用 GMT 時間(格林威治),所以會比台灣晚 8 小時
與實體用戶相關設定值
local_umask=022 #新增目錄、檔案權限為 775,因為 umask 為 002
local_enable=YES #在 /etc/passwd 內的帳號才能以實體用戶的方式登入vsftpd 主機
與系統安全相關設定值 
xferlog_enable=YES #使用者上傳與下載檔案都會被紀錄起來。記錄的檔案與下一個設定項目有關
xferlog_file=/var/log/vsftpd.log #如果上一個 xferlog_enable=YES 的話,這裡就可以設定了
pam_service_name=vsftpd #這個是 pam 模組的名稱,我們放置在 /etc/pam.d/vsftpd
 
2007年7 月 posted by admin in Linux and have Comments (2)

XAMPP for Linux 安裝步驟

慣用了Appserv後,這次接學校的moodle系統

學長推薦是使用XAMPP這套整合的軟體

而且它的功能與方便性似乎比Appserv好很多!!

因此就轉貼一下官方的4大安裝步驟,資料來源為XAMPP官方

    * 步驟 1: 下載

只要點選下面的連結之一就可以了。下載最新的版本應該是比較好的。

也可以在 SourceForge,取得完整的下載列表(包含較舊的版本)。

你可以在 發佈說明 ,取得關於所有XAMPP版本的變更和內容的詳細概要。

* 步驟 2: 安裝

下載完成後,只要輸入下列命令:

  1. 進入Linux命令模式,切換成為系統管理者:

    su

  2. 將下載的壓縮檔解壓縮到 /opt下:

    tar xvfz xampp-linux-1.6.2.tar.gz -C /opt

    注意:請使用這些指令來安裝XAMPP,不要使用任何微軟作業系統底下的工具程式來解壓縮檔案, 它會使得程式無法正確執行。

    注意2:這個指令會覆蓋掉舊有的XAMPP版本。

這樣就完成了。XAMPP現在已經安裝在 /opt/lampp 目錄下了。

* 步驟 3: 啟動

要啟動XAMPP只要執行下列的指令:

/opt/lampp/lampp start

現在在你的畫面上,你會看到類似下方的這些訊息:

Starting XAMPP 1.6.2...
LAMPP: Starting Apache...
LAMPP: Starting MySQL...
LAMPP started.

Apache 和 MySQL 現在已經啟動了。

如果有任何錯誤訊息,請先到 Linux FAQ 查看是否有相關資料。

自XAMPP 1.4.7起的補充說明

因為一些非常新的版本如PHP 5也值得關注,因此我們決定將PHP 5.x和 PHP 4.x兩個版本都整合進XAMPP中。 因此如果你發現你的PHP應用程式無法在PHP 5下執行,那麼你可以輕易的將PHP切換回4.x的版本。

使用下列指令你可以將PHP切換回 4.x:

/opt/lampp/lampp php4

當然使用下列指令你可以在把PHP切換回 5.x:

/opt/lampp/lampp php5

如果你忘記了現在的PHP是那個版本,只要使用phpinfo()或是透過下列的指令就可以得知:

/opt/lampp/lampp phpstatus

* 步驟 4: 測試

好了,看起來好像很簡單,但是你要怎樣知道是否所有的軟體都正確的執行呢? 只要在網址列輸入下面的URL:

http://localhost

現在你應該會看到XAMPP的起始畫面,裡面包含一些檢查系統狀態的連結和一些簡單的範例程式。

即時藝術範例:一個小型的PHP/GD程式(自0.9.6prel版起,同時也有一個PHP/Ming的Flash範例,請參考截取畫面) 特別感謝 Anke Arnold所提供的»AnkeCalligraph«字型。

使用說明

* 關於系統安全(一定要閱讀)

如同前面所提,XAMPP並不建議用在實際上線運作系統,它的目地只是提供程式開發者一個開發的環境。 XAMPP設定的方式是盡可能的開放和允許所有程式開發者所想要的功能。 這樣的設定對於開發環境來說是很棒的,但對一個實際上線運作系統卻是非常危險的。

 

這裡是一份XAMPP缺乏安全防護的列表:

  1. MySQL的系統管理者(root)沒有密碼。
  2. MySQL可以透過任何網段加以存取。
  3. ProFTPD 的使用者"nobody",預設密碼是"lampp"。
  4. PhpMyAdmin可以透過任何網段加以存取。
  5. 範例程式也可以透過任何網段加以存取。

要修正大部份的系統安全弱點,只要執行下面的指令:

/opt/lampp/lampp security

它會開始一些系統安全檢查,同時使XAMPP的安裝環境變得更安全些。

* 進階的啟動和停止參數

0.9.4版的 /opt/lampp/lampp只能單獨啟動和停止XAMPP。但自0.9.5版後它可以執行許多進階的指令。

 

進階的啟動和停止參數
參數 描述
start 啟動XAMPP。
stop 停止XAMPP。
restart 重新啟動XAMPP。
startapache 單獨啟動Apache。
startssl 以SSL模式啟動Apache。這個指令將會使SSL的模式一直持續下去, 例如:如果你以SSL的模式啟動過XAMPP,那麼每一次都將以SSL的模式啟動Apache。
startmysql 單獨啟動MySQL資料庫
startftp startftp 啟動ProFTPD伺服器。你可以使用FTP來上傳檔案到網頁伺服器中(帳號"nobody",密碼"lampp")。 這個參數將會使ProFTPD每次都自動啟動,因此未來每次你啟動XAMPP,FTP的功能也會跟著啟動。
stopapache 停止Apache。
stopssl 停止以SSL模式執行的Apache。這個指令會持續的將SSL功能停用, 因此如果你重新啟動XAMPP,SSL功能仍然是處於停止狀態的。
stopmysql 停止MySQL資料庫。
stopftp 停止ProFTPD伺服器。這個命令會使ProFTPD持續停用,因此如果你重新啟動XAMPP,FTP功能仍然是處於停止狀態的。
security 啟動檢查系統安全的小程式。
舉例說明:如果你要以SSL模式啟動Apache,只要輸入下列指令(以root的身份):

/opt/lampp/lampp startssl

現在你可以透過SSL的方式來存取Apache伺服器 https://localhost

* 什麼程式在那裡?

在典型的Unix系統裡並沒有所謂的系統設定或管理介面,而僅有所謂的設定檔案, 下表是包含在XAMPP中的相關軟體設定檔案概要。

 

重要檔案和目錄
檔案/目錄 用途
/opt/lampp/bin/ XAMPP指令的家目錄。例如 /opt/lampp/bin/mysql 用來執行MySQL。
/opt/lampp/htdocs/ Apache 文件根目錄。
/opt/lampp/etc/httpd.conf Apache設定檔案。
/opt/lampp/etc/my.cnf MySQL設定檔案。
/opt/lampp/etc/php.ini PHP設定檔案。
/opt/lampp/etc/proftpd.conf ProFTPD設定檔案。(從 0.9.5版後才有)
/opt/lampp/phpmyadmin/config.inc.php phpMyAdmin設定檔案。

* 停止 XAMPP

要停止XAMPP只要執行下列指令:

/opt/lampp/lampp stop

你應該會看到:

Stopping LAMPP 1.6.2...
LAMPP: Stopping Apache...
LAMPP: Stopping MySQL...
LAMPP stopped.

這樣XAMPP就已經停止了。

* 移除

使用下面指令來移除XAMPP:

 

rm -rf /opt/lampp

這樣就完成了。

2007年7 月 posted by admin in Linux and have Comment (1)