specification: 規范, 規格, 產品規范, 產品規格, 技術規范, 產品說明書.
如: create_specification, 等等
-
創建數據庫時, 顯式地指明, 字符集:
create database if not exists db_name [ create_specification]
create_specification: 只包括: 字符集和 校驗規則的指定: [default] character set [=] charset_name [default] collate [=] collation_name -
在mysql中, 很多創建命令 的 create_specification中, 都有很多 [缺省的] keys, 包括: [default,] 等號[=] 是最常見的 缺省項.
即:
create schema db_name character set utf8
synonym: 同義詞: 創建數據庫的另一個 同義詞是: create schema
安裝好mysql后, 會有四個默認的數據庫:
performance_schema , 關於性能檢測監視的數據庫;
information_schema, 關於數據的數據,叫元數據, 就是關於mysql中有哪些表, 哪些數據庫, 哪些權限的數據, 基本上是 視圖, 來自基本表, 沒有與之相關的 表文件;
mysql , 這個是mysql系統的核心, 很多信息都放在mysql中, 包括: user表. db表等等;
test; 這個是創建的一個 測試數據庫.
schema : 框架, (word中 的結構圖, 模式, 流程圖), 在mysql中, 表示 數據庫的意思: 跟 database基本上是一樣的.
總結這么多 的 mysql數據庫中文亂碼的 解決文章, 最終只有兩點:
-
不要依賴於 mysql服務器的配置, 因為 在很多實際場合, 你 不能(沒有權限)和能力/機會接觸到 mysql服務器的配置, 所以 你 根本就不能要求/奢望服務器上的配置 怎么樣, 你只能 自己規定/自己 規范/ 顯式的 指明 自己創建的數據庫的字符集編碼;
-
為了 數據庫的移植和升級, 你顯式地指明了 數據庫的編碼字符集后, 移植和升級基本上沒有 后顧之憂
-
其次, 就是 在每次 連接 字符串/ 連接數據庫的時候, 要 顯式地指明 你使用的 client/connect(連接層)/result的字符集為 utf8, 即: 顯式地寫一句:
mysql_query('set names utf8'); -
**但是, 如果你是要在數據庫本身上進行操作, 比如創建函數, 創建存儲過程, 事件和觸發器等, (前提當然是 你能夠接觸數據庫服務器, 而且你還能在上面進程一系列操作), 那么,你最好還是將 關於連接的 相關字符集 都設置成跟數據庫的字符集一樣的: 比如全部都設置成 utf8. 因為 在存儲過程/function 中, 可能牽涉到 某些字符串的 連接/操作函數, 比如 concat 函數, 如果 connection / client/ results(注意是 results復數) 等字符集跟 數據庫不一致的時候, 比如在 win系統中, 默認的就是 gbk字符集和 gbk_chinese_ci的collation, 這就跟數據庫的utf8不同, 就會報錯: illegal operation: mixed different charset... 操作是: set character_set_connection/client/results = utf8; **
-
如果你有機會/有能力 去 設置 mysql的字符集, 你最好在 項目一開始的時候, 就去把 所有的 字符集進行設置, 讓他們都一致, 通常推薦 統一的 設置成 utf8.
注意, 在創建/查詢等 使用/引用 數據庫/表/字段等的時候, 可以不加符號, 如果要加, 就要加 反引號, 而不是 單引號或雙引號! 加單引號或雙引號會報錯!

顛倒, 倒置, invert: grep --invert-match, (-v, 因為-i已經使用為: 忽略大小寫)
fedora中, 有一個 yum/dnf包的管理/更新工具: /usr/libexec/packagekitd, 當 dnf在后台 更新 /makecache 的時候, 它會鎖定新加入的 dnf命令請求. 可以將 /usr/libexec/packagekitd 服務包卸載, 就能夠禁止軟件的自動更新.
dnf/yum的使用, 是獨占的, 同時只能運行一個dnf進程. 所以如果在后台更新的時候, 你不能使用dnf去下載安裝軟件的.
gnome的輔助工具有兩個: 一個是 tweak-tool, 另一個工具是dconf-editor. 基本上 tweak-tool 微調工具沒有多大用途, 主要還是在 dconf-editor中peizhi.
fedora 23 的 軟件自動更新, 是通過 gnome-software這個 軟件包中心 來 實現的, gnome-software: a software center for gnome. 所以 只要刪除 這個 包, 就沒有 自動 更新的提示... 當然如果你需要軟件自動更新提示的話, 你可以安裝 dnf install 'gnome-software' 這個包就行了. 注意的是, fc23中的軟件更新提示, 並不是 在 gnome-packagekit-installer包, 所以,不必安裝這個..
==============
如何自動實現 mysql的每天 備份?
- 性能方面, mysqldump默認的導出選項已經可以了,單進程的工具不要期望太多
- date命令: date 支持格式化輸出: date '+format' , 其中, format包括: %D: %y%m%d, 而時間 就要 全部用大寫字母: %H:%M:%S = %T
- 要修改/etc/crontab文件: 共有5個星號, 分為: 分鍾 小時 | 日 月 | 星期, 注意沒有 年. (年太久遠了, 沒有什么實際意義!).
- 要重啟 crond 服務? crond.service 通常在安裝時, 就被系統設置為 開機啟動了: 位置在: /etc/systemd/system/ " multi-user.target.wants " / crond.service
- 大致的腳本內容可以自己寫:
使用crontab完成mysql的每天備份?
- crontab 中表示時間的字段可以分為 min hour | day month | week.
為了更好的, 更全面的, 更強大的 表示所有完成的任務, 時間的表示方法有多種:
- 可以使用* 通配符, 表示的是每天的每小時和每分鍾, 間隔 “每”
- 可以使用逗號, 表示多個時間的列表, 如: 1,2,3,10分鍾
- 可以使用橫杠, 表示 時間的范圍, 比如: 1-10, 20-30
- 可以使用/, 表示“每”的意思, 比如: */10表示每10分鍾。
-
調用的腳本, 應該是linux的腳本 即: *.sh, 可以是linux中的自帶命令, 也可以是linux腳本中調用其他存在於
本地機器上的其他程序, 比如php命令, mysql命令。 -
由於 crontab最多是以 “每分鍾” 為時間間隔的, 所以如果要實現, 一分鍾以內, 每隔多少秒為單位的定時調用, 久需要自己寫代碼了: 比如:
#! bin/bash
step=2 # 間隔的秒數, 不能大於60
for ((i=0; i<60; i+=step)); do
$(php '/home/php/crontab/tolog.php')
sleep $step
done
exit 0
然后, 創建crontab, 調用ct.sh每分鍾執行一次, 這樣實際上就能達到每2秒鍾執行一次的要求了。
為了便於移植和升級, 和減少對服務器配置的依賴,在創建數據庫的時候,和寫php代碼的時候, 每次連接sql查詢的時候,都明顯的, 顯式的指定數據庫和連接的字符集。
這樣,就不用去管 服務器的配置問題了!!
在所有的平台(linux+win等),對於西文字符,你基本上不用考慮字符集的問題, 所謂的亂碼, 所謂的字符集的問題, 都只是針對 平台、軟件下的 “中文”的存儲和顯示問題.
基本上, 中文的Windows都是以gbk為系統編碼的, 也就是說, win下的軟件涉及中文編碼字符集問題的時候, 都是以gbk為編碼的。
實際上, 雖然latin1 本身可以“存儲/表示”gbk或utf8的 字節流, 但是在發生存儲 編碼轉換的時候, 可能就造成了信息的丟失 和 損壞, 甚至有時候, 對輸出到 瀏覽器的編碼是正常的, 但是 對於控制台卻是亂碼的情形, 所以, 為了統一、保險、省心起見, 最好是將 “數據庫的內部操作字符集” 和外部的 連接字符集和輸出結果字符集 相一致, 推薦的做法是都設置成utf8。
mysql的存儲是以字符為單位進行存儲的。 不是按字節來存儲的, 也就是 對於相同個數的字符, 存儲時的字節占用數並不一定相同。 它是按 表示字符串的 “字節流”來進行存儲的, 字節流有/占 幾個字節,(經過字符集轉換后client-> connect -> database. ) 最終 存儲時就會花耗幾個字節
不管是什么編碼, 都是以字符為單位的
即:不管編碼如何改變轉換, 最終表現出來的 “字符的總的個數 總是不變的”。
- mysql和php的關系?
mysql是做sql查詢的 , 相當於做菜的廚師,而php相當於 點菜的顧客, 如果你要吃的是非常復雜的滿漢全席, 那就要由廚師在后台做好菜后, 才給你端出來 上好菜后, 你在吃。 就相當於php申請查詢的mysql的存儲過程。 通常是針對比較復雜的處理過程, 才使用存儲過程 。但是如果你只是點一盤小菜,青菜的話, 就不需要廚師事先去准備做好后, 再給你端上來, 直接在店里喊一聲就可以了,也就是如果是簡單的查詢請求, 直接使用php的mysql_query('查詢字符串'); 就可以了.
mysql的臨時表?
- 使用場合: 凡是需要創建 "會話級" 的表, 即這個表不需要永久存在 , 而只是在 建立會話的時候, 才 "動態"地生成. 而且會話結束, 這個表就自動刪除. 然后再次建立會話鏈接的時候, 這個表又重新動態生成;
所以, 在不同的會話期間, 可以使用 相同的 臨時表名稱, 相互之間不會影響;
臨時表也可以創建在內存中, 只要你在最后的時候, create_table_specification中, 指明type=heap就可以了 比如: `create temporary table tmp1 select* from t1 type=heap;
臨時表的大小 , 受配置文件中的 tmp_table_size的限定
-
使用臨時表最需要注意的是, 臨時表中的數據的刷新和清除. 要注意表中的數據的清理 和無效垃圾數據的影響.最好的預防方法 就是要 顯式的先刪除 drop, 然后再創建, 再插入數據等操作..
-
在一個會話期, 同一個連接內, 臨時表可以連續使用, 所以再次使用前, 應該注意以前的數據清理問題.
-
盡量避免臨時表和 普通表的同名, 因為一旦臨時表因為誤操作等致使連接斷開后, 你操作的就是普通表了. 所以這時候的刪除等操作就非常危險, 從而對普通表中的數據產生危險!
**很需要注意的一個問題是: 當使用一些 框架的時候, 由於連接是 permanent 持久連接的.所以, 使用臨時表的時候, 如果你在多個連接間共享的時候, 臨時表中的數據就會重復積累! 要注意這個問題! **
臨時表和內存表的區別?
- 臨時表的存在位置 : 臨時表的 結構frame和 數據data, 都是 存在於內存中的!!! 因此, 創建臨時表tmp1后, 你在 磁盤上是找不到對應的 表文件的; 相反, 所謂的 內存表
create table mem_table(id int(10) not null ) type=heap ;它的結構存在於磁盤上的 mem_table.frm中, 只是數據存在於內存中的.. - 臨時表的默認存儲引擎是myisam 而內存表的默認engine 是memory.
實際中, 應該盡量避免/減少使用臨時表??? 參考: http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7383.html
- 臨時表, 分為內存臨時表和磁盤臨時表, 通常mysql會首先創建使用 內存臨時表, 當臨時表超過設置值的時候, 會 導出到磁盤臨時表;
- 使用臨時表意味着 性能低...?
- 盡量避免使用臨時表, 優先考慮 對 order by/ group by (排序/分組的) 字段 創建索引.
[臨時表相關配置】 tmp_table_size:指定系統創建的內存臨時表最大大小; http://dev..com/doc/refman/5.1/en/server-system-variables.html#sysvar_tmp_table_size max_heap_table_size: 指定用戶創建的內存表的最大大小; http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_heap_table_size 注意:最終的系統創建的內存臨時表大小是取上述兩個配置值的最小值。 【
表的設計原則】
使用臨時表一般都意味着性能比較低,特別是使用磁盤臨時表,性能更慢,因此我們在實際應用中應該盡量避免臨時表的使用。 如果實在無法避免,也應該盡量避免使用磁盤臨時表。 常見的方法有: 1)創建索引:在ORDER BY或者GROUP BY的列上創建索引,這樣可以避免使用臨時表; 2)分拆很長的列,可以避免使用磁盤臨時表:一般情況下,TEXT、BLOB,大於512字節的字符串,基本上都是為了顯示信息,而不會用於查詢條件,因此表設計的時候,應該將這些列獨立到另外一張表。 www.2cto.com 【如何判斷使用了臨時表】 使用explain查看執行計划,Extra列看到Using temporary就意味着使用了臨時表。
為什么要使用視圖? 主要還是為了安全:
- 避免誤操作, 比如delete, truncate等危險操作.如果在視圖上操作的話, 即使誤刪除了, 真實的基礎表中的數據是不會受到影響的.
- 權限開放: 通常基礎表中的數據是整個的,全部的, 比如是學校所有專業的學生信息. 然后我創建視圖, 每一個專業部/學院, 創建一個視圖, 讓專業部/學院頭頭只能看到 和修改 他自己這個部門的學生信息 , 而其他部門的學生信息就無法查看...
另外
- 視圖在磁盤上, 沒有對應的 數據文件的.只是從其他表中取出來的數據
- 視圖相當於一個對 數據的 篩選, 過濾, 它是在使用視圖的時候, 才動態生成的...
- 視圖中的數據 可以來源於:基礎表, 和其他視圖.
- 視圖相當於窗口,提供多角度的 對數據的查看形式.
所以 視圖的使用, 就相當於普通表, 在很多重要應用上, 用戶操作的, 和所看到的, 其實很多都是視圖, 而不是基礎表.還是很重要很必要的.
要生成表中的數據, 不必到處去找, 導入, 直接在mysql中,寫一個存儲過程, 來自動批量地插入數據. 批量插入"測試數據的存儲過程" 如下: 參考" https://segmentfault.com/q/1010000000137096
- 要修改存儲過程, 格式是 alter procedure sp_name [characteristic]
characteristic: adj: 獨有的, 獨特的; n. 特征, 特性. 復數是: characteristics
注意這個語句, 不能直接修改 存儲過程的 參數和過程體, 要修改參數和過程的實體內容, 你要先將sp, drop掉, 然后再重新創建, recreate.
1. 產生一個隨機小寫字母的函數: 首先要在全局// 設置 [mysqld] 中 定義 log-bin-trust-function-creators=1
1. 函數體: (產生隨機大寫字母的函數, ruc()就只是把 cs的默認值設置為 26個大寫字母 )
create definer='root'@'localhost'
function rlc() returns char(1)
begin
declare cs char(26) default 'abcdefghijklmnopqrstuvwxyz';
return substr(cs, floor(1+26*rand()), 1);
end//
-- 隨機產生1個大寫字母
create function ruc() returns char(1)
begin
declare cs char(26) default 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
return substr(cs, floor(1+26*rand()), 1);
end//
-- 生成隨機英文名字,並插入到表中
drop procedure if exists sp_genRandEnName;
delimiter //
create definer='root'@'localhost' procedure sp_genRandEnName(in persons int unsigned)
comment 'this is random test data generator'
begin
declare i int unsigned default 0;
declare j int unsigned default 0;
declare ename char(20) default '';
declare nl tinyint default 0; -- 英文名字的隨機長度值 , 這個地方看句首的 decalre就要出錯了: 會報錯:ERROR1064(42000)
while i<persons do
-- 先要將各個變量清0
set ename='';
set j=0; -- 如果j不清零,則j 一開始就會很大
-- 生成隨機名字 ### 這個地方要注意, 就是,mysql的注釋雙橫線
set ename=concat(ename, ruc());
set nl=floor(3+16*rand()); -- 16考慮了j循環從0開始的情況, j的最終值就不用再減1
repeat ### 注意, while循環用do 和 end while 來做大括號, 而repeat 循環中 是沒有 do的!
set ename=concat(ename, rlc());
set j=j+1;
until j>nl end repeat;
-- 插入到數據表中
insert into `user`(id, name) values('', ename);
set i=i+1;
end while;
end//
delimiter ;
-------------
最后 實測可用的 , 通過測試后的 代碼是:
truncate user;
drop procedure if exists sp_genRandEnName;
delimiter //
create definer='root'@'localhost' procedure sp_genRandEnName(in persons int unsigned)
begin
declare i int unsigned default 0;
declare j int unsigned default 0;
declare ename char(20) default ''; -- 這里規定 ename的最大長度, 比如為10
declare nl tinyint default 0;
while i<persons do
-- 先要將各個變量清0
set ename='';
set j=0; -- 如果j不清零,則j 一開始就會很大
set ename=concat(ename, ruc());
set nl=floor(3+16*rand()); -- nl表示的是 : name length: nl 那么這里要跟上面的ename的定義長度要保持一致。如果上面為10, 那么這里就應該是 3+6*rand()...
repeat
set ename=concat(ename, rlc());
set j=j+1;
until j>nl end repeat;
insert into `user`(id, name) values('', ename);
set i=i+1;
end while;
end//
delimiter ;
// 生成隨機中文名字的 姓和名: http://blog.csdn.net/gjq246/article/details/72771939
-- 生成姓氏和名字的 輔助函數rxing(), rming();
CREATE DEFINER=`root`@`localhost` FUNCTION `rxing`() RETURNS char(1) CHARSET utf8
begin
declare cs char(10) default '趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華金魏陶姜戚謝鄒喻柏水竇章雲蘇潘葛奚范彭郎魯韋昌馬苗鳳花方俞任袁柳酆鮑史唐費廉岑薛雷賀倪湯滕殷羅畢郝鄔安常樂於時傅皮齊康伍余元卜顧孟平黃和穆蕭尹姚邵堪汪祁毛禹狄米貝明臧計伏成戴談宋茅龐熊紀舒屈項祝董粱杜阮藍閔席季麻強賈路婁危江童顏郭梅盛林刁鍾徐邱駱高夏蔡田樊胡凌霍虞萬支柯咎管盧莫經房裘干解應宗丁宣賁鄧郁單杭洪包諸左石崔吉鈕龔'; -- 常用的姓氏漢字, 共190個
return substr(cs, floor(1+190*rand()), 1);
end
CREATE DEFINER=`root`@`localhost` FUNCTION `rming`() RETURNS char(1) CHARSET utf8
begin
declare cs varchar(500) default '明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝敏群波成榮新峰剛家龍德慶斌輝良玉俊立浩天宏子松克清長嘉紅山賢陽樂鋒智青躍元武廣思雄錦威啟昌銘維義宗英凱鴻森超堅旭政傳康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連勛祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯裕翰征謙航士堯標潔城壽楓革純風化逸騰岳銀鶴琳顯煥來心鳳睿勤延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦先聰朝善非恆晉汝丹為晨乃秀岩辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅玲蕾艷紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一'; -- 常用 的名字中的 名 漢字. 共400個
return substr(cs, floor(1+400*rand()), 1);
end
-- 生成隨機2~3個漢字的中文名字的存儲過程
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_genRandChName`(in persons int unsigned)
begin
declare i int unsigned default 0;
declare j int unsigned default 0;
declare cname char(3) default '';
declare nl tinyint default 0;
while i<persons do
set cname='';
set j=0;
set cname=concat(cname, rxing());
set nl=floor(1+2*rand());
repeat
set cname=concat(cname, rming());
set j=j+1;
until j>nl end repeat;
insert into `user`(id, name) values('', cname);
set i=i+1;
end while;
end
-
當在控制台,用
update user set password=password('root') where user='root' and 'host'='localhost';修改了用戶, 比如root的配置文件后 , 一定 要用flush privileges;來 刷新授權, 這時新設置的密碼 才能生效. 否則, 如不刷新權限,即使你設置了新密碼, 再次登錄時,仍然會認為沒有密碼, 或是之前的密碼, 這樣的話, 就會報錯! 這是實踐 經歷過的. -
通過help 可知, 修改數據庫的時候,語法格式是:
alter {database | schema } db_name
alter_specification
注意, 這里常見的通用方法是: 如果是create, 則是: create _key_ _name_ create_specification 如果是 alter的話,則是: alter _key_ _name_ alter_specification.
mysql> alter database test character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
要注意, 修改字符集的步驟和操作, 應該放在 創建表 等任何操作之前! 否則,原來數據庫/表中 的數據 就會出錯亂碼!
1.rescure筆記本
如何強制修改foo簡單密碼
假裝忘記密碼?
同時開啟兩個字符終端?
-
linux桌面版確實不如windows穩定, 但服務器就不是一個水平了
linux穩定說的是內核穩定, 不是說圖形界面穩定, 應該極少出現像windows那樣徹底死機那樣的問題, gui掛掉,貌似內核還可以正常運行?
linux的優勢不再桌面
linux系統和圖形界面沒有必然的聯系
linux內核和圖形界面是通過接口連接的, 不是內核的一部分。 而windows的圖形界面是內核的一部分, 所以圖形界面的穩定性不如windows。 但是同時也正因如此, windos內核的穩定性受到gui的影響不如linux穩定。 -
強行關機后, fedora就不能啟動了, 根本原因是: 分區表的邏輯錯誤? 使用PQ就是定時炸彈?
-
強行關機后 當check到根路徑的時候, 就check到錯誤而無法繼續下去了??
-
要查看linux的啟動信息, 啟動時一閃而過, 可以在 啟動后, 通過命令dmesg來查看: dmesg: dump message.
-
如何把man和info的信息存儲為文本文件? 如: man tcsh | col -b > tcsh.txt info tcsh -o tcsh.txt -s
-
linux如何強行退出x: 有時候, 因為程序錯誤, 使鼠標和鍵盤都無法響應和反應時, 可以強制退出圖形界面,按ctrl+alt+backspace(不是shift)
9. 要設置 禁用: linux的快捷鍵為disabled, 不要按delete鍵(delete鍵是一個 合法的/有用的鍵), 要按backspace.
gzip 的壓縮和 解壓縮使用方法?
- Usage: zip [OPTION]... [FILE]... 格式用法: 通常來說, 冒號,引號,分號等標點符號要緊跟前面的單詞, 后面要隔一個空格, 像省略號也要緊跟前面的單詞, 當做是一個單詞整體比如: [file]... 英語中的省略號是 3個圓點,而不是中文的6個
- 壓縮是gzip, 解壓是: gzip -d 或 gunzip. 其中的-d表示 --decompress. 或 uncompress
- 壓縮本身考慮了 壓縮的時間, 和 壓縮后文件的大小 之間的平衡關系, 當然你可以自己指定 壓縮的大小(better) 或 壓縮的快慢(faster). 數字選項從-1, 到-9...
- 壓縮時, 會直接將原文件改名, 即源文件不保留, 當然 可以用 -k --keep 保留原來的文件.
- 解壓時, 可以不指定后面 的 .gz, 比如: 直接適用 gzip -d foo 就表示 解壓 foo.gz這個壓縮包.
- 如果不指定 輸入文件, 則是 對stdin 進行 壓縮, 這個在 很多 管道 操作 中很有用!
- 使用, -r --recursive 選項, 可以對 目錄進行遞歸壓縮. 注意這時候, 不是對目錄本身進行壓縮, 而是對目錄中 的文件 進行一個一個的 壓縮.
在mysql中, 任何一個操作(包括, insert等dml, alter等 ddl, 都可以看做是一個事務, transaction(用名詞形式); 有可以用 commit或rollback來處理.
- 可以在命令行 shell中, 執行任意sql內容的腳本, 包括導出數據庫 包括插入數據, 包括定義和執行存儲過程等的 sql文件. 也就是, 執行 的內容不只是 限於 數據庫的導出和導入等
- 方式是: 執行mysql -uroot -p [password] < my.sql 注意這個password, 很多時候, 是不能直接給出來的, 但是在這里這個shell界面, 它是可以直接給出的. the password to use when connecting to server. If password is not given it's asked from tty
- 可以在mysql命令中, 直接用 -D 或 --database=.... 來指明所用的數據庫, 當然最好的方法是 直接在sql文件中, 指定要使用的數據庫...
關於delimiter的改變, 並不是 在定義/創建 所有的 sql語句, sql文件時, 都需要 使用 delimiter的! 即使是在同一個 腳本文件中, 也只有在定義 創建 包含begin...end 里面有多條語句的 procedure和function 過程和函數的時候, 才需要, 在procedure和function前后的 其他單條單條的語句, 只要不涉及 procedure和function的語句 還是 用分號. 而且 存儲過程和函數 兩端 首尾的 delimiter語句應該對應成對使用...
處理 mysql異常的語句和 寫法?
- 基本處理流程是: 先聲明異常處理方式, 然后再寫事務, 最后 根據 _err 值來 決定 提交還是 回滾...
- 異常處理方式有兩種, 一是continue 一是 exit
- 異常的 情況有很多, 在for子句中聲明, 聲明的時候, 可以用 籠統的'全部"的聲明,如: sqlexception, 也可以用具體的 某一條異常的名稱或代號來表示:
如: for not found , for sqlstate '0200' , 或直接用 mysql的內部錯誤號 for 1200 等 - 異常的處理方式有 設置某個標識變量的值, 或直接輸出 提示語句
set _err=1 , 或 : select 'not found...'
1 use test;
2 select * from `user`;
select round(rand()*1000) as '隨機數';
3 delimiter //
4 -- create definer='root'@'localhost' procedure gentd(in count int)
5 -- begin
6 -- select round(rand()*1000) as '隨機數';
7
/* mysql 不支持 # 注釋? */
8 drop procedure if exists foo//
9 create procedure foo()
10 begin
11 declare _err integer default 0;
12 declare continue handler for sqlexception set _err=1;
13
14
16 start transaction; -- 這是一條語句! start transaction 后面要加上 分號!
17 insert foo(id, name) values('', 'foo');
18 insert foo(id, name) values('', 'bar');
21
22 if _err=1 then
23 select 'ERROR! 回滾操作...';
24 rollback;
25 else
26 commit;
27 end if;
28
29 select _err as 'status';
30
31 end//
32 delimiter ;
33
34 call foo(); -- 這句話很重要@ 存儲過程 就跟函數一樣, 你光是 定義它, 創建它沒用, 如果你不執行它, 他是不會自動 執行的! 所以要顯式的 調用 去執行它!!
適用 vim的好處: 格式化代碼的命令, 是 等號 = , 取其 兩端 對齊 的 意思, == 格式化當前行, gg=G 格式化整個代碼, #= 比如: 4= 格式化當前行后面的4行.
mysql中, declare語句必須放在 function函數或 存儲過程中, 不能直接在 mysql控制台使用.
關於 在不同的 mysql版本中, 版本4.1 和 版本 5.0對 varchar的 規定的 變化: 參考 : http://www.cnblogs.com/doit8791/archive/2012/05/28/2522556.html
- 4.1版本以下, varchar的字節長度是 255, 而5.0以上版本的varchar的字節長度最大是 65535字節, 即 64KB.
- 同樣的 varchar(20) 的含義不同, 4.1版本以前, 表示的是 varchar 20個字節, 如果存儲utf8漢子, 則只能存放6個漢字, 而對於5.0以上的版本 varchar(20)則表示最多可以存儲 20個 字符! 注意是字符, 不再是字節了.
- 因此, 在5.0以上版本, varchar最多 可以存放: 65535/3 = 21845 個漢字, 實際使用時, 可以規定常見的 varchar(1000), varchar(1024), varchar(2000);
**雜項: 1. commit和 comment的區別, 都是mm 只是后面的兩個字母不同, 一個是i, 一個是 en; 查看數據庫中 有哪些函數和 存儲過程, 適用的命令 不是 show functions, show procedures, 而是 show function status, 和 show procedure status 注意 , 函數和 procedure都不要 帶 復數s! **
mysql 創建函數時經常遇到的問題? 參考: http://mamicode.com/info-detail-1841394.html
-
通常不要去指定什么 definer~ 因為默認的就是 'root'@'localhost', 沒有什么問題, 而且定義definer也沒用什么意義! 最重要的是, 容易出錯, 容易把 'definer'寫出'define' 而很難排錯!
-
存儲過程中, 可以使用 'if not exists', 但是在函數中 就不能使用 if not exists!
-
在存儲過程中, 的參數,不能使用 帶@的, 而且不能設置默認值, 如果是字符串類型,必須指定長度
-
調用存儲過程時, 必須使用用戶變量帶 @的, 不能使用沒有@的變量, 因為那是局部變量, 局部變量和 函數調用中的 不帶@ 的變量不能區分. 這個自不必然說, 你如果直接輸入不帶@的變量, 會提示沒有那樣的 "field" 錯誤.
-
調用函數的時候, 參數個數要 正確, 即使你不用 這個參數的值, 你也要輸入null 來占位.
-
**一個mysql語句, 可以是簡單的 insert/select語句, 也可以是 begin...end 的復合語句, 復合語句中, 可以包含 變量聲明, 和其他條件/選擇/循環結構語句等. **
1) function與procedure的區別:一個有返回值,一個沒有,僅此而已。上述說法是錯誤的,function和procedure的用法有很多不同,總體來說procedure受到的限制較少,function的限制較多;而且procedure可以使用out參數返回值,因此盡量采用procedure
誠如上面所說 的一樣, 函數有太多的限制了, 最好 還是用存儲過程吧, 因為函數,出問題的時候, 好多時候你還不知道到底 是哪里出問題了, 你認為可以的地方, 它函數其實卻認為不可以做了很多 的 限制!! 比如這里的函數的 參數, 很多地方/文章說, 可以指定 存儲類型方式in/out/inout但是這里指定in則是錯誤的, 去掉in 則正確!

