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

2010/03/31

MySQL 如何在所有的 TABLES 當中尋找特定的欄位名稱

To get all tables with columns 'columnA' and 'ColumnB' in the database 'YourDatabase'

SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';

參考 : http://stackoverflow.com/questions/193780/how-to-find-all-the-tables-in-mysql-with-specific-column-names-in-them

2009/08/06

MySQL 的匯入匯出, 使用 mysqldump

(發表於 2009-07-03 )

如果可以直接在 console 介面下操作 mysql, 使用 mysqldump 是最好的備份方法

假設我們要備份的資料庫名稱是 db_name , 帳號是 username
直接打入 :

2009/08/05

GMail + MySqlDump + PHPMailer 自動備份重要資料庫

(撰寫於 2009-04-30 )

由於公司經營線上遊戲網站,必須對會員的虛擬貨幣餘額進行每日歷史紀錄備份
所以參考以下網站的教學,找到了這個辦法:

MySQL 欄位相減後產生天文數字

(發表於 2009-04-20 )

playerwinsloses
Tom12
Jerry20

假設有個如上的表格,裡面有兩個欄位 wins, loses,我們想要算出 wins - loses 的結果
並且按照大小排序,我們可以這樣作:

得知 Table 中總筆數最快的方法

(撰寫於 2009-03-17 )

參考網址1

重點:
According to the MySQL documentation this is most efficient if you're using a MyISAM table (which is the most usual type of tables used):

$result = mysql_query("SELECT COUNT(*) FROM table");

參考網址2

重點:
SELECT COUNT(*) FROM test_table;
SELECT COUNT(id) FROM test_table;
SELECT COUNT(1) FROM test_table; => 最快


MySQL 的匯入匯出 (版本 > MySQL 5)

(撰寫於 2009-01-27 )

目的 :
  1. 備份正式主機的 MySQL 資料庫
  2. 在工作用 PC ( Windows 環境) 架設測試用的 MySQL 資料庫
匯入和匯出都是 MySQL 5 以上版本
要匯入的資料庫,編碼環境要設定成和匯出的一樣

匯出 :
  • 主機代管,無法直接使用 mysql console 下指令
  • 使用 phpMyAdmin 匯出為 *.sql
    匯出選項 : SQL 兼容模式 => NONE
匯入 :
  • 在 Windows 環境,使用console 登入 mysql
  • 匯入之前,先執行 mysql > SET NAMES 'UTF8'; (很重要,避免亂碼)
  • 假設下載的 *.sql 檔案放在 C:\database\ myTable.sql
    執行 : mysql > source C:\database\ myTable.sql 就OK了

MySQL vs MySQLi (效能實測)

(撰寫於 2009-01-12 )

原文出處:http://www.johnjawed.com/benchmarks/
直接翻譯一下結論,大意如下:

結論:
上述測試結果顯示 mysql_query 和 mysqli_query 整體效能上其實勢均力敵。但在插入約10萬筆資料的情況下,使用 mysqli_multi_query 反爾讓執行時間增加約兩倍。你可能會想,既然原來的 MySQL 效率比較好,那我們幹麻要改用 MySQLi。

然而在某些情況下,MySQLi 是會勝出的。記得 MySQLi 查詢語法是 "pre-escaped" 的 (就是說遇到特殊字元,MySQLi 會自己處理),這就是說不需要你自己加上
mysql_real_escape_string ( ) 來特別處理這類變數。

假設我們要 insert 的語法當中有很多這類變數,都需要加上 mysql_real_escape_string ( ) 做額外處理,那麼必定會大量增加執行時間,這時候 MySQLi 就發揮了他的特長。

雖然以上原因可能還不足以讓大家升級目前舊版的 SQL 查詢到 MySQLi,不過基於安全性和效能雙重考量,MySQLi 在未來還是大有可為 (MySQLi 支援 SSH 加密連線)。
----------


個人的感想:沒特別需求還是都用舊版的 MySQL 就好 ~_~

2009/08/04

mysql 裡 utf8_general_ci 跟 utf8_unicode_ci 連線校對的差異

(撰寫於 2007-03-20)

轉載自 : http://blog.pixnet.net/origin2/post/1244682
------------------------------------------------------------------------------

有用過 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 你就不需要擔心貼上去之後資料在轉換間遺失了。

-------------------------
以下是個人實際測試的結果:
如果你使用 phpMyAdmin 並且在新增文字資料的時候內容 "中英文混雜"
當 Collation 是 utf8_xxxxxxx 的時候,都會有文字破損並且出現亂碼
建議 Collation 選擇 latin1_general_ci,個人測試項目如下,都不會出問題
  • 中英文混雜
  • 多國語言,如日文
  • 大五碼惡名昭彰的"許功蓋"

PHP 處理許功蓋問題的 Function

(撰寫於 2006-12-08 )

本函式轉載自 PHP + MySQL 程式設計研習
這個作者的網站是我目前看過,最淺顯易懂,也最實用的

目前這個函式,在 MySQL 各個版本使用上都沒問題
當然,MySQL 4.1 之後和 4.1 之前的版本,在 Big5 Coding 環境的設定上
有所不同,請看此篇

function Fix_Backslash($org_str)
{
// ----------------------------------------
// mysql_client_encoding() 這個 PHP 函數目前是有 bug 的 (PHP version < 5, 2006-12)
// 它總是回傳 latin1,而無法正確得知 mysql 的 character-set
// 雖然無法釐清是 PHP 還是 MySQL 的責任
// 不過在 MySQL 官網的討論區已經有人提出說明了:
//
// http://forums.mysql.com/read.php?103,14397,25128#msg-25128
// http://forums.mysql.com/read.php?52,56632,57821#msg-57821
//
// 所以這裡的函數我略加修正
// ----------------------------------------

// if ( mysql_client_encoding() != "big5" ) return $org_str;

$tmp_length = strlen($org_str);

for ( $tmp_i=0; $tmp_i<$tmp_length; $tmp_i++ )
{
$ascii_str_a = substr($org_str, $tmp_i , 1);
$ascii_str_b = substr($org_str, $tmp_i+1, 1);

$ascii_value_a = ord($ascii_str_a);
$ascii_value_b = ord($ascii_str_b);

if ( $ascii_value_a > 128 )
{
if ( $ascii_value_b == 92 )
{
$org_str = substr($org_str, 0, $tmp_i+2) . substr($org_str,$tmp_i+3);
$tmp_length = strlen($org_str);
}
$tmp_i++;
}
}

$tmp_length = strlen($org_str);
if ( substr($org_str, ($tmp_length-1), 1) == "\\" ) $org_str .= chr(32);

$org_str = str_replace("\\0", "\ 0", $org_str);
return $org_str;
}
// 本函式轉載自 http://chensh.loxa.edu.tw/php/X_1.php
?>

許功蓋問題,在不同的 MySQL 版本之下,如何解決

(撰寫於 2006-12-08 )

經過實地測試,終於找出方法,針對不同的 MySQL 版本
PHP 該如何應對,才不會出現許功蓋的問題...


MySQL 4.0.X 版本以下:

my.ini (windows), my.cnf (Unix) 設定 : default-character-set=latin1
ASCII92 處理 : 不需加上

my.ini (windows), my.cnf (Unix) 設定 : default-character-set=big5
ASCII92 處理 : 加上


MySQL 4.1.X 版本以上:

WIndows 版本 :
  • (MySQL方面) 首次安裝 MySQL Server的時候請把所有和 character-set 有關的部份,都設定成 utf8
  • (PHP方面) mysql_connect() 之後,先加上 mysql_query("SET NAMES 'big5'");
  • (PHP方面) 對於所有需要存取中文的資料,需要加上 ASCII92 的特別處理,有關 ASCII92 處理的函數請看此篇

從4.1這個版本之後,MySQL 加上了多語系支援的功能
MySQL 4.1 對於字元集支援 (Character Set Support) 分為兩個方面:
字元集 (Character set) 和文字校對 (Collation)

2007/08/20

在連線的時候自動判別 MySQL 版本

由於在 MySQL 4.1 以後,如果是使用 UTF-8 編碼建立的資料表,
都必須在所有查詢前透過
mysql_query('SET NAMES utf8') 這段語法,才能正常運作

如果你的程式必須同時在兩種不同版本的 MySQL 運作
比方說,測試 server 是較新的 4.1.xxx ,
而正式對外營運的 server 則是舊的 3.2.xxx
這時候可以藉由下面這段程式,來自動判別要不要加上 'SET NAMES utf8'

$rs = mysql_query('SELECT VERSION() AS mysql_version');
list($mysql_version) = mysql_fetch_row($rs);
if($mysql_version >= 4) mysql_query('SET NAMES utf8');

參考資料 : PHP Manual

2007/07/21

mysql_fetch_assoc 和 mysql_fetch_row 的不同

來源 : 藍色小舖

內文 :
關於mysql_fetch_assoc的用途,一般而言跟mysql_fetch_row是差不多的,不過,在以下的例子中,其傳回值是有所不同的....
if you use this SQL query:
$result = mysql_query("SELECT a.name,b.name from school as a,home as b")

mysql_fetch_assoc只會傳回一個欄位的值
 while($rs = mysql_fetch_assoc($result)) {
 $rs['name']
 }
而mysql_fetch_row則會取得兩個欄位的值
 while($rs = mysql_fetch_row($result)) {
 $rs[0] & $rs[1]
 }

Web 技術中的 Session 是什麼?

轉載原文:  Web 技術中的 Session 是什麼? 本文目標 在 Web 的世界裡,Session 已經是被廣泛使用的一種技術,大多數的 Web 開發者,肯定都能運用自如。在現今的各類 Web 應用程式的開發框架和工具中,Session 也已經被包裝成容易使用的模...