[ MySQL ] 18 元月, 2012 16:17

 http://dev.mysql.com/doc/refman/5.1/en/memory-use.html

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
SHOW VARIABLES LIKE 'thread_stack';
SET @kilo_bytes = 1024;
SET @mega_bytes = @kilo_bytes * 1024;
SET @giga_bytes = @mega_bytes * 1024;
SET @innodb_buffer_pool_size = 2 * @giga_bytes;
SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;
SET @innodb_log_buffer_size = 8 * @mega_bytes;
SET @thread_stack = 192 * @kilo_bytes;
SELECT
( @@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
) ) / @giga_bytes AS MAX_MEMORY_GB;

[ MySQL ] 27 八月, 2010 17:59

剛好有人問我這個問題

1.先停掉mysql

# /etc/init.d/mysql stop


2.以–skip-grant-table& 的參數啟動mysql

/usr/bin/mysqld_safe --skip-grant-table&


3. 更改root 密碼

# mysql mysql
mysql> UPDATE user SET password=password('123456') WHERE user='root';
mysql> exit


4.停掉mysql再重跑

# /etc/init.d/mysql stop
# /etc/init.d/mysql start
# mysql -u root -p

5.更改密碼只要使用mysq -u root -p , 然後執行step3的指令即可.

[ 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

[ MySQL ] 22 七月, 2009 14:57

select * from write_Art a join
 (SELECT wc_id, MAX(wa_date) AS aa FROM write_Art GROUP BY  wc_id)b where a.wa_date = b.aa

取出各分類的最新一筆資料,一句sql解決取出每個班級的第一名資料,也可用來取出每個產品分類中最新的商品

建議使用於MySQL 4.1以後的版本才有支援 

[ MySQL ] 18 六月, 2009 19:30

mysql 4.0 的資料庫移轉到 mysql 5.1的主機上, 還是可以使用最簡單的方法

  1. 將整個資料庫的MYI/MYD/frm 複製, 然後直接搬到新主機.
  2. 在新主機建立新的資料庫, 預設會看到資料夾裡面有一個db.opt, 先不管它, 然後才將4.0的檔案解壓縮到該目錄, 並確認資料的權限與擁有者沒有問題
  3. 這時候可以連到phpmyadmin看是否可以連到資料庫
  4. CHECK TABLE `xxxxx` 檢查全部的資料表看有沒有問題
  5. 如果有問題的話就必需修REPAIR TABLE `xxxxx`
  6. 修復後應該就沒以問題了