2015年8月31日 星期一

MySQL insert into和replace into以及insert ignore


MySQL中常用的三種插入數據的語句:
insert into表示插入數據,資料庫會檢查主鍵,如果出現重複會報錯
replace into表示插入替換數據,需求表中有PrimaryKey,或者unique索引,如果資料庫已經存在數據,則用新數據替換,如果沒有數據效果則和insert into一樣;
insert ignore表示,如果表中如果已經存在相同的記錄,則忽略當前新數據; (不會報錯)

create table testtb(  
id int not null primary key,  
name varchar(50),  
age int  
);  
insert into testtb(id,name,age)values(1,'bb',13);  
select * from testtb;  
insert into testtb(id,name,age)values(1,'bb',13);  -- 第二次會報錯 #1062 - Duplicate entry '1' for key 'PRIMARY' 
select * from testtb;  
insert ignore into testtb(id,name,age)values(1,'aa',13);   -- 忽略,不插入
select * from testtb;  
replace into testtb(id,name,age)values(1,"aa",12);  -- 取代
select * from testtb;  


參考資料:
http://qiang106.iteye.com/blog/648467

解決PHP JSON 中文亂碼的問題

直接用json_encode()顯示會有亂碼

程式:
$arr['a'] = '小灰狼';
echo json_encode($arr);

輸出:
{"a":"\u5c0f\u7070\u72fc"}

改使用 urlencode()/ urldecode()
程式:
$arr['a'] = urlencode('小灰狼');
echo urldecode(json_encode($arr));

輸出:
{"a":"小灰狼"}

但是通常沒這個必要,因為在瀏覽器或java中,javascript和java會自動識別為中文

PHP5.4之後可使用 JSON_UNESCAPED_UNICODE
$arr['a'] = '小灰狼';
echo json_encode($arr, JSON_UNESCAPED_UNICODE);
輸出:
{"a":"小灰狼"}



參考資料:
http://phpwolf.blogspot.com/2012/04/php-json.html
http://outsidenote.blogspot.tw/2013/03/jsonencodeunicode.html 解決json_encode中文UNICODE轉碼問題

MySQL import sql檔很慢

在導入很大的sql檔(5.1GB)時,導入很久

$ time mysql -u root -p db < xxx.sql
real    108m29.157s
user    0m58.932s
sys     0m3.011s

rellik: 加速沒辦法喔
rellik: 它實際上就是把裡面的資料 replay 一次
rellik: 你要增加你的 disk IO
rellik: 因為像是資料庫都是吃 disk io
rellik: 你要安裝 sysstat 這個工具
rellik: 然後利用  iostat -x 1
rellik: 他會顯示出你的 disk utiliazation
rellik: 最左邊不是有個 %util
rellik: 這個看到如果一直在  90~ 100% 的話就表示吃滿 IO 了
rellik: disk IO 是看當下硬碟是不是滿載了
rellik: 他如果是 100% util
rellik: 就沒辦法再快了
rellik: 你只能等他
rellik: 唯一加快的做法就是加硬碟
rellik: 組成 raid 0
rellik: 或是 raid 10
rellik: 反正資料庫的 disk 都不建議跑 raid5


rellik: 看硬碟寫入或是讀取速度用 dstat
rellik: dstat -at


尋找MySQL中順序編號的間隙

尋找MySQL中順序編號的間隙

SELECT (t1.column_name + 1) as gap_starts_at, 
       (SELECT MIN(t3.column_name) -1 FROM table_name t3 WHERE t3.column_name > t1.column_name) as gap_ends_at
FROM table_name t1
WHERE NOT EXISTS (SELECT t2.column_name FROM table_name t2 WHERE t2.column_name = t1.column_name + 1)
HAVING gap_ends_at IS NOT NULL

Ex. 假設有張表內容是如下圖,分別找出當bank_id為1, 2, 3時,bank_number的間隙
mysql> SELECT (t1.bank_number + 1) AS gap_starts_at, (SELECT MIN(t3.bank_number) -1 FROM bank_card t3 WHERE t3.bank_number > t1.bank_number AND bank_id = 1) AS gap_ends_at FROM bank_card t1 WHERE NOT EXISTS (SELECT t2.bank_number FROM bank_card t2 WHERE t2.bank_number = t1.bank_number + 1 AND bank_id = 1) AND bank_id = 1 HAVING gap_ends_at IS NOT NULL ;
+---------------+-------------+
| gap_starts_at | gap_ends_at |
+---------------+-------------+
|             2 |           4 |
|             6 |           8 |
+---------------+-------------+

mysql> SELECT (t1.bank_number + 1) AS gap_starts_at, (SELECT MIN(t3.bank_number) -1 FROM bank_card t3 WHERE t3.bank_number > t1.bank_number AND bank_id = 2) AS gap_ends_at FROM bank_card t1 WHERE NOT EXISTS (SELECT t2.bank_number FROM bank_card t2 WHERE t2.bank_number = t1.bank_number + 1 AND bank_id = 2) AND bank_id = 2 HAVING gap_ends_at IS NOT NULL;
+---------------+-------------+
| gap_starts_at | gap_ends_at |
+---------------+-------------+
|             5 |           7 |
+---------------+-------------+

mysql> SELECT (t1.bank_number + 1) AS gap_starts_at, (SELECT MIN(t3.bank_number) -1 FROM bank_card t3 WHERE t3.bank_number > t1.bank_number AND bank_id = 3) AS gap_ends_at FROM bank_card t1 WHERE NOT EXISTS (SELECT t2.bank_number FROM bank_card t2 WHERE t2.bank_number = t1.bank_number + 1 AND bank_id = 3) AND bank_id = 3 HAVING gap_ends_at IS NOT NULL;
+---------------+-------------+
| gap_starts_at | gap_ends_at |
+---------------+-------------+
|             3 |           8 |
+---------------+-------------+

結論:
1. 當bank_number起始不為1,且前面有間隙時,會找不到。
2. 會找到多個間隙

附上表結構和資料:
CREATE TABLE IF NOT EXISTS `bank_card` (
  `id` int(11) NOT NULL,
  `bank_id` int(11) NOT NULL,
  `bank_number` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `bank_card` (`id`, `bank_id`, `bank_number`, `name`) VALUES
(1, 1, 1, 'bear1'),
(2, 1, 5, 'bear5'),
(4, 2, 8, 'ted8'),
(5, 1, 9, 'bear9'),
(6, 3, 9, 'ss9'),
(7, 3, 2, 'ss2'),
(8, 2, 4, 'ted4');

附上sqlfiddle範例:
http://sqlfiddle.com/#!9/34cb0/1/0

參考資料: http://stackoverflow.com/questions/4340793/how-to-find-gaps-in-sequential-numbering-in-mysql

jQuery Validate 使用心得

官網:

自定義預設值
Overriding jQuery validation highlight / unhighlight methods
Ex. 讓jQuery validate和 act-bootstrap錯誤顯示能相容
jQuery.validator.setDefaults({
 errorElement: 'div',
 errorClass: 'help-block',
 highlight: function(e) {
  $(e).closest('.form-group').removeClass('has-info').addClass('has-error');
 },
 success: function(e) {
  $(e).closest('.form-group').removeClass('has-error');
  $(e).remove();
 }
});


依據別欄位的值而決定是否必填
jquery validate plugin require field if another field has a value and vice versa
http://stackoverflow.com/questions/10406089/jquery-validate-plugin-require-field-if-another-field-has-a-value-and-vice-versa
Ex. 在 $("form select[name='status']") 值為4時,remark必填
$('form').validate({
 rules: {
  remark: {
   required: {
    depends: function(element) {
     return $("form select[name='status']").val() === "4"
    }
   }
  }
 },
 messages: {
  remark: {
   required: "備註必填" // 只有在 $("form select[name='status']") 值為4時才必填
  }
 }
});

客製化驗證方法
http://stackoverflow.com/questions/17561615/creating-a-custom-rule-in-jquery-validate
Ex. 輸入日期不能為未來日期
jQuery.validator.addMethod("endDateToday", function(value, element) {
 //Your Validation Here
 var open_time = new Date(value);
 var today = new Date();
 if (open_time > today) {
  return false; // return bool here if valid or not.
 } else {
  return true; // return bool here if valid or not.
 }
}, "不能輸入未來日期");  // 預設的錯誤訊息


$('form').validate({
 rules: {
  open_time: {
   endDateToday: true
  }
 }
});




IE 關閉附加元件


有些附加元件會影響網頁正常執行,如 使用 銀行的附加元件 在網頁輸入該銀行卡號時,會被附加元件檢查

http://windows.microsoft.com/zh-TW/internet-explorer/manage-add-ons#ie=ie-11
IE關閉附加元件
1. 開啟桌面,然後點選或按一下工作列的 Internet Explorer 圖示。
2. 點選或按一下 [工具] 按鈕    ,然後點選或按一下 [管理附加元件]。
3. 在 [顯示] 下,點選或按一下 [所有附加元件],然後選取您要關閉的附加元件。
4. 點選或按一下 [停用],然後點選或按一下 [關閉]。

暫時停用所有附加元件
依序按一下 [開始] 按鈕  、[所有程式]、[附屬應用程式]、[系統工具],然後按一下 [Internet Explorer (沒有附加元件)]。

使用純flash網頁( ex. http://www.wechoosethemoon.org/ )檢測 , Internet Explorer (沒有附加元件) 跑不動




2015年8月21日 星期五

Outlook 2013使用心得


複製特定郵件規則到特定資料夾
1. 對郵件點右鍵 -> 規則 ->建立規則
2. 勾選寄件者
3. 點"進階選項"
3.1.1 設定"選取條件"(2. 已勾選,這邊不用再勾)
3.1.2 設定"選取動作":勾選"停止處理其他規則"、"移動副本到 已指定 資料夾",
3.1.3 下方"步驟2" 編輯規則描述(在加上底線的值上按一下),點一下 已指定 設定你要複製到的目標資料夾
4. 點"完成"
5. 在郵件上點右鍵 -> 規則 -> 規則管理及通知
6. 勾選你要執行的規則 -> "立即執行規則"

複製單一郵件到指定資料夾(無規則)
直接選擇後 ctrl+c 複製、ctrl+v 貼上

新郵件自動執行規則
1. 在郵件上點右鍵 -> 規則 -> 規則管理及通知
2. 你所建立的規則前面要打勾




2015年8月10日 星期一

解決php5-fpm ( nginx ) "Call to undefined function json_encode" 錯誤

系統:
ubuntu 14.04

用nginx跑php時找不到json_encode()函數報錯:
Call to undefined function json_encode ... 

但使用apache2跑則正常

檢查:
# dpkg --get-selections | grep php5-json
有安裝php5-json

# apt-get install php5-json
Reading package lists... Done
Building dependency tree
Reading state information... Done
php5-json is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
已安裝,所以沒新東西被裝

但是
# php5-fpm -m | grep json
(無結果)

root@ubuntu:/etc/php5/fpm/conf.d# ls -l
total 0
lrwxrwxrwx 1 root root 32 Jul  3 11:11 05-opcache.ini -> ../../mods-available/opcache.ini
lrwxrwxrwx 1 root root 28 Jul  3 11:11 10-pdo.ini -> ../../mods-available/pdo.ini
lrwxrwxrwx 1 root root 29 Jul  3 11:11 20-curl.ini -> ../../mods-available/curl.ini
lrwxrwxrwx 1 root root 27 Jul  3 11:11 20-gd.ini -> ../../mods-available/gd.ini
lrwxrwxrwx 1 root root 31 Jul  3 11:11 20-mcrypt.ini -> ../../mods-available/mcrypt.ini
lrwxrwxrwx 1 root root 31 Jul  3 11:11 20-mysqli.ini -> ../../mods-available/mysqli.ini
lrwxrwxrwx 1 root root 30 Jul  3 11:11 20-mysql.ini -> ../../mods-available/mysql.ini
lrwxrwxrwx 1 root root 34 Jul  3 11:11 20-pdo_mysql.ini -> ../../mods-available/pdo_mysql.ini
lrwxrwxrwx 1 root root 33 Jul  3 11:11 20-readline.ini -> ../../mods-available/readline.ini
原來json.ini不在php5-fpm的設定裡面

把php5-fpm的conf.d備份,然後重建
root@ubuntu:/etc/php5/fpm# mv conf.d/ conf-old.d
root@ubuntu:/etc/php5/fpm# ln -s /etc/php5/mods-available /etc/php5/fpm/conf.d

然後重啟
# service nginx restart
# service php5-fpm restart  // 注意:重啟nginx是無效的,要重啟動php5-fpm

檢查:
# php5-fpm -m | grep json
json

最後打開網頁,json_encode()可以正常使用