一般來說,mysqldump 會出 dbname.mytable 的語法大致如下:
mysqldump dbname mytable -u root -p
如果 table 中的資料太多,只想匯出較新的項目,如 id 大於特定數值,則可使用 --where:
mysqldump dbname mytable \
--where 'id > 10000' \
-u root -p
--where 使用時要注意引號,如果有字串時記得要 escape 掉
軟體開發、伺服器和生活瑣事
MySQL 上可用 cast() 做資料型態轉換,不過 data type 的 reserve word 和一般 CREATE TABLE 時用的不太一樣。詳細參考 MySQL cast funtion 的說明。
轉數字:
SIGNED、UNSIGNED:相當於 `BIGINT`FLOAT(N)、DOUBLE、REAL:浮點數,FLOAT 要指定精確度,用 DOUBLE 比較快DECIMAL[M, D]:要指定資料長度轉字串:
CHAR[N]、NCHAR[N]:要指定字串長度TEXT、LONGTEXT:不支援,只能使用前一項的 reserve word若資料不是要在 DBMS runtime 處理,而是要輸出以後由其他程式語言處理的話,是可以考慮直接轉 JSON 型態。但若要在 DBMS 裡面使用的話,還是乖乖轉支援的資料型態比較不會出錯。
發現如果 MySQL 中的變數未指定資料型態,會出現一些很雷的行為。
這邊用 JSON 型態:
select json_array( 100, JSON_ARRAY(1, 2) ); # 輸出: [100, [1, 2]]
先除存到 @list 以後在讀取,資料型態就會亂掉:
SET @list = json_array(1, 2); select json_array( 100, @list ); # 輸出: [100, "[1, 2]"]
若需要用到變數,建議先宣告變數型態:
DECLARE list JSON; SET list = json_array(1, 2);
用以下的 SQL 來建立新的 function:
CREATE FUNCTION myfunc(IN str TEXT) RETURNS TEXT RETURN '123';
執行以後會出現錯誤訊息:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN str TEXT) returns TEXT return '123'' at line 1
將 function parameter 中的 IN 刪除以後就不會再出現錯誤訊息。
問題是按照 MySQL 官方文件中 create function statements 中的說明,IN 參數是 optional 的,可加可不加,但實際執行時加上 IN 就會出現上面的錯誤。
所以問題來了,是 MySQL 沒有按照文件中的規範實作?還是文件並沒有跟著 MySQL 的實作更新?
使用變數的方式主要有二種,一是使用在變數名稱地一個字元加上 @ ,二是使用 DECLARE 宣告再 SET。
要注意的是 @ 開頭的變數 scope 為整個 session,也就是在不同 function / store procedure 都可以讀取數值、設定數值。如以下範例:
DELIMITER ;;
CREATE FUNCTION hello() RETURNS text
BEGIN
SET @str = 'hello';
RETURN @str;
END ;;
DELIMITER ;
DELIMITER ;;
CREATE FUNCTION world() RETURNS text
BEGIN
SET @str = 'world';
SET @str = CONCAT(hello(), ' ', @str);
RETURN @str;
END ;;
DELIMITER ;
SELECT world() as result;
因為會讀、寫到同一個變數,所以輸出會是 hello hello。
若使用 DECLARE 宣告變數,則開變數的 scope 僅在 loop、function、store procedure 中才有效。相同的範例,改使用 DECLARE :
DELIMITER ;;
CREATE FUNCTION hello() RETURNS TEXT
BEGIN
DECLARE str TEXT;
SET str = 'hello';
RETURN str;
END ;;
DELIMITER ;
DELIMITER ;;
CREATE FUNCTION world() RETURNS TEXT
BEGIN
DECLARE str text;
SET str = 'world';
SET str = CONCAT(hello(), ' ', str);
RETURN str;
END ;;
DELIMITER ;
SELECT world() AS result;
輸出結果為 hello world。