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

2015年7月29日 星期三

[AWS][RDS] time_zone 時區設定

自架的MySQL因為有ADMIN權限
設定上沒有什麼太大的問題 

但自從用AWS的RDS後
它竟然沒有辦法設定時區
所以就用偷吃步的方向,做一個PROCEDURE

然後再每次SQL 交易前先CALL一下這個PROCEDURE


DEFINER=`root`@`%`

如果出現沒SUPER權限,記得把上面語法拿掉

DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `store_time_zone`()
IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
SET SESSION time_zone = '+8:00';
END IF//
DELIMITER ;

2015年5月25日 星期一

[mysql] RDS 中文 全文檢索

我使用的版本是5.6.XX

一開始也是一樣,先建FULLTEXT

ALTER TABLE 表名 ADD FULLTEXT(欄位1, 欄位2...)

然後就可以開始搜尋了…

SELECT *
FROM TABLE
WHERE MATCH (欄位1) AGAINST ('旅行*' IN BOOLEAN MODE)

word* 列出所有以word開頭的字,這個星號不能改變位置只能放最後

因為無法判定文字斷句,只好用 * 來補強…
但對中文字來說,還是非常不足…

如果大大有其他方法,請不要吝嗇告知一下,非常感謝QQ

2015年5月21日 星期四

[mysql] utf9mb4 4byte utf8

中文字其實是很麻煩的

今天就遇到了一個,越南的一個城市

北"𣴓"省,中間這字就是用utf8 4byte存的
導至一般的utf8 會有問題

一開始以為把mysql的字符集改成 utf8mb4

結果手動新增還是錯誤

最後查了一下,改完字符集後

還要再執行

SET NAMES utf8mb4;

2015年3月19日 星期四

[mysql] 之於MSSQL XML PATH

在MSSQL中,要合併多筆資料到同一個欄位

可以用 XML PATH來實現

SELECT T1.id, T1.type
          ,(SELECT [DESC] + ''
          FROM   @TABLE AS T2
          WHERE  T2.id = T1.id  FOR XML PATH('')) AS [DESC]
FROM @TABLE AS T1
GROUP BY id, type


而在MYSQL中,可以用GROUP_CONCAT來實現

SELECT date_format(T.T1,'%Y%m') AS d
              ,GROUP_CONCAT(T.ID) AS id
FROM @TABLE AS T
GROUP BY date_format(T.T1,'%Y%m')

2015年3月17日 星期二

[php] CI 同時連MSSQL與MYSQL

在\application\config\database.php裡加上

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

怎麼連接MSSQL請看[php]CI 連接 MSSQL(使用apache)

第一個為預設
$this->load->database();

第二個就要改成
$this->load->database("資料庫名稱",TURE);

接下來

在你要轉換資料庫的語法上面加
$this->msdb= $this->load->database('資料庫名稱', TRUE);
$this->msdb->query('SELECT top 10 * FROM test_db')->result();

原本的就
$this->load->database();
$this->db->query('SELECT top 10 * FROM test_db')->result();

2014年12月11日 星期四

[MYSQL]子查詢使用LIMIT

在MySQL4.1中子查詢是不能使用LIMIT的


錯誤碼:
SQL錯誤(1235):
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

指出是不能用的。
也就是
SELECT *
FROM TABLE
WHERE ID IN ( SELECT ID
              FROM TABLE
              LIMIT 10
             )

是不行的。
但,凡事也都有例外,
只要在子查詢再加一層就解決了!

SELECT *
FROM TABLE
WHERE ID IN ( SELECT a.ID
              FROM (
                  SELECT ID
                  FROM TABLE LIMIT 10
              ) AS a
           )

就可以用啦!

2014年11月13日 星期四

MSSQL 到 MYSQL

MSSQL MYSQL
都是SQL DATABASE
只要會 SQL 語法 (insert, update, delete, select) 就可以執行基本的資料庫操作
不過使用起來還是有些微差距:

1.    CREATE

MSSQL

MYSQL


從上下兩張圖MSSQL=>MYSQL,我們可以看出:
(1)   拿掉 [dbo]
(2)   [ ] ` `` 符號是 TAB鍵上面那個 ~ 鍵,不是單引號
(3)   IDENTITY(1,1) AUTO_INCREMENT
(4)   nvarchar varchar
(5)   UNIQUE的用法跟位置 PRIMARY KEY 一樣
(6)   FOREIGN KEY 用法些許不同
(7)   CHECK (TEST_id > 0) 用法與位置跟 PRIMARY KEY 一樣
(8)   如果在MSSQL有用 numeric 型別,請更改為 integer
(9)   Unix 版本的 MySQL table 有大小寫區分,為避免困擾,建議 table 名稱小寫




2.    常見語法

在語法方面,幾乎是一樣的。
SELECTDISTINCTWHERE
SELECT DISTINCT column_name,column_name
FROM table_name
WHERE column_name operator value;

ORDER BY
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

INSERT INTO
INSERT INTO table_name
VALUES (value1,value2,value3,...);
and
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

UPDATE
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

DELETE
DELETE FROM table_name
WHERE some_column=some_value;




語法順序
SELECT  -- 想要查詢的欄位     |
FROM    -- 想要查詢的表格     |
WHERE   -- 查詢條件         
GROUP BY-- 分組設定          
HAVING  -- 分組條件          |
ORDER BY-- 排序設定          |
LIMIT   -- 限制設定          V
上到下,順序是不可變的

就算你每一個子句的寫法都沒有出錯,如果順序不對了:
EX1
SELECT DISTINCT column_name,column_name
WHERE column_name operator value;
FROM table_name
EX2
SELECT DISTINCT column_name,column_name
FROM table_name
LIMIT 1
WHERE column_name operator value;
以上兩個執行起來都是會錯誤的。

數學運算
優先順序
運算子
說明
範例
運算結果
1
%
餘數
7 % 3
1
1
MOD
餘數
7 MOD 3
1
1
*
7 * 3
21
1
/
7 / 3
2.333
1
DIV
(整數)
7 DIV 3
2
2
+
7 + 3
10
2
-
7 – 3
4






3.    取前幾筆

MSSQL


MYSQL

兩者最大差異,就在一個用TOP,一個用LIMIT

MYSQL取區間,比MSSQL好一點是,可以直接在 LIMIT做應用

EX
46筆,LIMIT 3,3 ,從第三筆 + 1 筆開始取三筆資料




4.    註解

MSSQL


MYSQL


(1)   MSSQL 註解只有 -- 來表示
(2)   MYSQL 註解有四種方式
‘-- ,sort’ 這註解持續到行尾
-- MSSQL一樣,但 -- 接註解文字中間需要空格 “-- 註解
‘#,create_date’ 這註解持續到行尾
/*這是一行註解*/
/*

這是
多行註解

*/

5.    型態
參考

6.    Stored Procedure
MYSQL 5.0後新增了這個功能
CREATE PROCEDURE 名稱(變數) 來建立PROCEDURE
MySQL每條語句的末尾,都要加上分號“;

EX1

建立完後,使用方式為:
CALL test(3,5) ,即時沒有參數呼叫時也要加 CALL test() 括號

PROCEDURE的變數除了型態設定外,還有三種應用方式:
IN:「輸入、input」用的參數。這種參數與functions中的參數完全一樣,在呼叫procedures時傳送資料給procedures用的

OUT:「輸出、output」用的參數。在呼叫procedures時,不能接收傳送的資料,不過在執行procedures時,可以設定這類參數的值,新的值在執行完成後,可以回傳給呼叫的地方使用

INOUT:「輸入與輸出、inputoutput」用的參數。同時具有「IN」與「OUT」兩種用途

EX2

上圖紅框處可以看到,三種應用方式。
呼叫方式為:
SET @DDDD = 1;
CALL test(1,3,@AAAA,@DDDD);
SELECT @AAAA,@DDDD
結果為@AAAA=3,@DDDD=0

第一個與第二個變數為IN,需要輸入值
第三個變數為OUT,需用變數去接
第四個有INOUT,所以變數可設定值帶入。




7.    Stored Function
CREATE FUNCTION 名稱(變數) 來建立FUNCTION
RETURNS (回傳型態)」與「RETURN (回傳值)」兩個是FUNCTION的關鍵字
MySQL每條語句的末尾,都要加上分號“;

EX1

建立完後,使用方式為:
SELECT test('AAA')

EX2

紅框框內的變數名稱 var1 不能與欄位名稱 content 一樣,
content = content 這樣是會錯誤的。


8.    VIEW的應用


建立完,使用方式為:
SELECT * FROM view_test

上圖紅框框內,可自行修改需要的資料。



9.    MYSQL 排程(事件)

建成一個從”2014-11-13 19:14:00”開始每天執行一次的排程
通常在MYSQL的工具裡都有介面可以建立
不用自己在寫CREATE


需要修改的話,把CREATE改成ALTER即可。