一些經常使用的mysql語句實例-之後照寫2

specification: 規範, 規格, 產品規範, 產品規格, 技術規範, 產品說明書.
如: create_specification, 等等php

  1. 建立數據庫時, 顯式地指明, 字符集: create database if not exists db_name [ create_specification]
    create_specification: 只包括: 字符集和 校驗規則的指定: [default] character set [=] charset_name [default] collate [=] collation_namehtml

  2. 在mysql中, 不少建立命令 的 create_specification中, 都有不少 [缺省的] keys, 包括: [default,] 等號[=] 是最多見的 缺省項.
    即:
    create schema db_name character set utf8mysql

synonym: 同義詞: 建立數據庫的另外一個 同義詞是: create schemalinux

安裝好mysql後, 會有四個默認的數據庫:

performance_schema , 關於性能檢測監視的數據庫;
information_schema, 關於數據的數據,叫元數據, 就是關於mysql中有哪些表, 哪些數據庫, 哪些權限的數據, 基本上是 視圖, 來自基本表, 沒有與之相關的 表文件;
mysql , 這個是mysql系統的核心, 不少信息都放在mysql中, 包括: user表. db表等等;
test; 這個是建立的一個 測試數據庫.sql

schema : 框架, (word中 的結構圖, 模式, 流程圖), 在mysql中, 表示 數據庫的意思: 跟 database基本上是同樣的.shell


總結這麼多 的 mysql數據庫中文亂碼的 解決文章, 最終只有兩點:

  1. 不要依賴於 mysql服務器的配置, 由於 在不少實際場合, 你 不能(沒有權限)和能力/機會接觸到 mysql服務器的配置, 因此 你 根本就不能要求/奢望服務器上的配置 怎麼樣, 你只能 本身規定/本身 規範/ 顯式的 指明 本身建立的數據庫的字符集編碼;
  2. 爲了 數據庫的移植和升級, 你顯式地指明瞭 數據庫的編碼字符集後, 移植和升級基本上沒有 後顧之憂
  3. 其次, 就是 在每次 鏈接 字符串/ 鏈接數據庫的時候, 要 顯式地指明 你使用的 client/connect(鏈接層)/result的字符集爲 utf8, 即: 顯式地寫一句: mysql_query('set names utf8');
  4. 可是, 若是你是要在數據庫自己上進行操做, 好比建立函數, 建立存儲過程, 事件和觸發器等, (前提固然是 你可以接觸數據庫服務器, 並且你還能在上面進程一系列操做), 那麼,你最好仍是將 關於鏈接的 相關字符集 都設置成跟數據庫的字符集同樣的: 好比所有都設置成 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; 數據庫

  5. 若是你有機會/有能力 去 設置 mysql的字符集, 你最好在 項目一開始的時候, 就去把 全部的 字符集進行設置, 讓他們都一致, 一般推薦 統一的 設置成 utf8.vim


注意, 在建立/查詢等 使用/引用 數據庫/表/字段等的時候, 能夠不加符號, 若是要加, 就要加 反引號, 而不是 單引號或雙引號! 加單引號或雙引號會報錯!


顛倒, 倒置, invert: grep --invert-match, (-v, 由於-i已經使用爲: 忽略大小寫)

fedora中, 有一個 yum/dnf包的管理/更新工具: /usr/libexec/packagekitd, 當 dnf在後臺 更新 /makecache 的時候, 它會鎖定新加入的 dnf命令請求. 能夠將 /usr/libexec/packagekitd 服務包卸載, 就可以禁止軟件的自動更新.segmentfault

dnf/yum的使用, 是獨佔的, 同時只能運行一個dnf進程. 因此若是在後臺更新的時候, 你不能使用dnf去下載安裝軟件的.windows

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的天天 備份?

  1. 性能方面, mysqldump默認的導出選項已經能夠了,單進程的工具不要指望太多
  2. date命令: date 支持格式化輸出: date '+format' , 其中, format包括: %D: %y%m%d, 而時間 就要 所有用大寫字母: %H:%M:%S = %T
  3. 要修改/etc/crontab文件: 共有5個星號, 分爲: 分鐘 小時 | 日 月 | 星期, 注意沒有 年. (年過久遠了, 沒有什麼實際意義!).
  4. 要重啓 crond 服務? crond.service 一般在安裝時, 就被系統設置爲 開機啓動了: 位置在: /etc/systemd/system/ " multi-user.target.wants " / crond.service
  5. 大體的腳本內容能夠本身寫:

使用crontab完成mysql的天天備份?

  1. crontab 中表示時間的字段能夠分爲 min hour | day month | week.
    爲了更好的, 更全面的, 更強大的 表示全部完成的任務, 時間的表示方法有多種:
  • 可使用* 通配符, 表示的是天天的每小時和每分鐘, 間隔 「每」
  • 可使用逗號, 表示多個時間的列表, 如: 1,2,3,10分鐘
  • 可使用橫槓, 表示 時間的範圍, 好比: 1-10, 20-30
  • 可使用/, 表示「每」的意思, 好比: */10表示每10分鐘。
  1. 調用的腳本, 應該是linux的腳本 即: *.sh, 能夠是linux中的自帶命令, 也能夠是linux腳本中調用其餘存在於
    本地機器上的其餘程序, 好比php命令, mysql命令。

  2. 因爲 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的 字節流, 可是在發生存儲 編碼轉換的時候, 可能就形成了信息的丟失 和 損壞, 甚至有時候, 對輸出到 瀏覽器的編碼是正常的, 可是 對於控制檯倒是亂碼的情形, 因此, 爲了統1、保險、省心起見, 最好是將 「數據庫的內部操做字符集」 和外部的 鏈接字符集和輸出結果字符集 相一致, 推薦的作法是都設置成utf8。

mysql的存儲是以字符爲單位進行存儲的。 不是按字節來存儲的, 也就是 對於相同個數的字符, 存儲時的字節佔用數並不必定相同。 它是按 表示字符串的 「字節流」來進行存儲的, 字節流有/佔 幾個字節,(通過字符集轉換後client-> connect -> database. ) 最終 存儲時就會花耗幾個字節

無論是什麼編碼, 都是以字符爲單位的

即:無論編碼如何改變轉換, 最終表現出來的 「字符的總的個數 老是不變的」。


  1. mysql和php的關係?
    mysql是作sql查詢的 , 至關於作菜的廚師,而php至關於 點菜的顧客, 若是你要吃的是很是複雜的滿漢全席, 那就要由廚師在後臺作好菜後, 纔給你端出來 上好菜後, 你在吃。 就至關於php申請查詢的mysql的存儲過程。 一般是針對比較複雜的處理過程, 才使用存儲過程 。可是若是你只是點一盤小菜,青菜的話, 就不須要廚師事先去準備作好後, 再給你端上來, 直接在店裏喊一聲就能夠了,也就是若是是簡單的查詢請求, 直接使用php的mysql_query('查詢字符串'); 就能夠了.

mysql的臨時表?

  1. 使用場合: 凡是須要建立 "會話級" 的表, 即這個表不須要永久存在 , 而只是在 創建會話的時候, 才 "動態"地生成. 並且會話結束, 這個表就自動刪除. 而後再次創建會話連接的時候, 這個表又從新動態生成;
    因此, 在不一樣的會話期間, 可使用 相同的 臨時表名稱, 相互之間不會影響;
    臨時表也能夠建立在內存中, 只要你在最後的時候, create_table_specification中, 指明type=heap就能夠了 好比: `create temporary table tmp1 select* from t1 type=heap;

    臨時表的大小 , 受配置文件中的 tmp_table_size的限定

  2. 使用臨時表最須要注意的是, 臨時表中的數據的刷新和清除. 要注意表中的數據的清理 和無效垃圾數據的影響.最好的預防方法 就是要 顯式的先刪除 drop, 而後再建立, 再插入數據等操做..

  3. 在一個會話期, 同一個鏈接內, 臨時表能夠連續使用, 因此再次使用前, 應該注意之前的數據清理問題.

  4. 儘可能避免臨時表和 普通表的同名, 由於一旦臨時表由於誤操做等導致鏈接斷開後, 你操做的就是普通表了. 因此這時候的刪除等操做就很是危險, 從而對普通表中的數據產生危險!

很須要注意的一個問題是: 當使用一些 框架的時候, 因爲鏈接是 permanent 持久鏈接的.因此, 使用臨時表的時候, 若是你在多個鏈接間共享的時候, 臨時表中的數據就會重複積累! 要注意這個問題!

臨時表和內存表的區別?

  1. 臨時表的存在位置 : 臨時表的 結構frame和 數據data, 都是 存在於內存中的!!! 所以, 建立臨時表tmp1後, 你在 磁盤上是找不到對應的 表文件的; 相反, 所謂的 內存表 create table mem_table(id int(10) not null ) type=heap ; 它的結構存在於磁盤上的 mem_table.frm中, 只是數據存在於內存中的..
  2. 臨時表的默認存儲引擎是myisam 而內存表的默認engine 是memory.

實際中, 應該儘可能避免/減小使用臨時表??? 參考: http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7383.html

  1. 臨時表, 分爲內存臨時表和磁盤臨時表, 一般mysql會首先建立使用 內存臨時表, 當臨時表超過設置值的時候, 會 導出到磁盤臨時表;
  2. 使用臨時表意味着 性能低...?
  3. 儘可能避免使用臨時表, 優先考慮 對 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就意味着使用了臨時表。


爲何要使用視圖? 主要仍是爲了安全:

  1. 避免誤操做, 好比delete, truncate等危險操做.若是在視圖上操做的話, 即便誤刪除了, 真實的基礎表中的數據是不會受到影響的.
  2. 權限開放: 一般基礎表中的數據是整個的,所有的, 好比是學校全部專業的學生信息. 而後我建立視圖, 每個專業部/學院, 建立一個視圖, 讓專業部/學院頭頭只能看到 和修改 他本身這個部門的學生信息 , 而其餘部門的學生信息就沒法查看...

另外

  1. 視圖在磁盤上, 沒有對應的 數據文件的.只是從其餘表中取出來的數據
  2. 視圖至關於一個對 數據的 篩選, 過濾, 它是在使用視圖的時候, 才動態生成的...
  3. 視圖中的數據 能夠來源於:基礎表, 和其餘視圖.
  4. 視圖至關於窗口,提供多角度的 對數據的查看形式.

因此 視圖的使用, 就至關於普通表, 在不少重要應用上, 用戶操做的, 和所看到的, 其實不少都是視圖, 而不是基礎表.仍是很重要很必要的.

要生成表中的數據, 沒必要處處去找, 導入, 直接在mysql中,寫一個存儲過程, 來自動批量地插入數據. 批量插入"測試數據的存儲過程" 以下: 參考" https://segmentfault.com/q/1010000000137096

  1. 要修改存儲過程, 格式是 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

  1. 當在控制檯,用update user set password=password('root') where user='root' and 'host'='localhost';修改了用戶, 好比root的配置文件後 , 必定 要用 flush privileges; 來 刷新受權, 這時新設置的密碼 才能生效. 不然, 如不刷新權限,即便你設置了新密碼, 再次登陸時,仍然會認爲沒有密碼, 或是以前的密碼, 這樣的話, 就會報錯! 這是實踐 經歷過的.

  2. 經過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簡單密碼
僞裝忘記密碼?
同時開啓兩個字符終端?

  1. linux桌面版確實不如windows穩定, 但服務器就不是一個水平了
    linux穩定說的是內核穩定, 不是說圖形界面穩定, 應該極少出現像windows那樣完全死機那樣的問題, gui掛掉,貌似內核還能夠正常運行?
    linux的優點再也不桌面
    linux系統和圖形界面沒有必然的聯繫
    linux內核和圖形界面是經過接口鏈接的, 不是內核的一部分。 而windows的圖形界面是內核的一部分, 因此圖形界面的穩定性不如windows。 可是同時也正因如此, windos內核的穩定性受到gui的影響不如linux穩定。

  2. 強行關機後, fedora就不能啓動了, 根本緣由是: 分區表的邏輯錯誤? 使用PQ就是定時炸彈?

  3. 強行關機後 當check到根路徑的時候, 就check到錯誤而沒法繼續下去了??

  4. 要查看linux的啓動信息, 啓動時一閃而過, 能夠在 啓動後, 經過命令dmesg來查看: dmesg: dump message.

  5. 如何把man和info的信息存儲爲文本文件? 如: man tcsh | col -b > tcsh.txt info tcsh -o tcsh.txt -s

  6. linux如何強行退出x: 有時候, 由於程序錯誤, 使鼠標和鍵盤都沒法響應和反應時, 能夠強制退出圖形界面,按ctrl+alt+backspace(不是shift)

    9. 要設置 禁用: linux的快捷鍵爲disabled, 不要按delete鍵(delete鍵是一個 合法的/有用的鍵), 要按backspace.


gzip 的壓縮和 解壓縮使用方法?

  1. Usage: zip [OPTION]... [FILE]... 格式用法: 一般來講, 冒號,引號,分號等標點符號要緊跟前面的單詞, 後面要隔一個空格, 像省略號也要緊跟前面的單詞, 當作是一個單詞總體好比: [file]... 英語中的省略號是 3個圓點,而不是中文的6個
  2. 壓縮是gzip, 解壓是: gzip -d 或 gunzip. 其中的-d表示 --decompress. 或 uncompress
  3. 壓縮自己考慮了 壓縮的時間, 和 壓縮後文件的大小 之間的平衡關係, 固然你能夠本身指定 壓縮的大小(better) 或 壓縮的快慢(faster). 數字選項從-1, 到-9...
  4. 壓縮時, 會直接將原文件更名, 即源文件不保留, 固然 能夠用 -k --keep 保留原來的文件.
  5. 解壓時, 能夠不指定後面 的 .gz, 好比: 直接適用 gzip -d foo 就表示 解壓 foo.gz這個壓縮包.
  6. 若是不指定 輸入文件, 則是 對stdin 進行 壓縮, 這個在 不少 管道 操做 中頗有用!
  7. 使用, -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異常的語句和 寫法?

  1. 基本處理流程是: 先聲明異常處理方式, 而後再寫事務, 最後 根據 _err 值來 決定 提交仍是 回滾...
  2. 異常處理方式有兩種, 一是continue 一是 exit
  3. 異常的 狀況有不少, 在for子句中聲明, 聲明的時候, 能夠用 籠統的'所有"的聲明,如: sqlexception, 也能夠用具體的 某一條異常的名稱或代號來表示:
    如: for not found , for sqlstate '0200' , 或直接用 mysql的內部錯誤號 for 1200 等
  4. 異常的處理方式有 設置某個標識變量的值, 或直接輸出 提示語句
    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

  1. 4.1版本如下, varchar的字節長度是 255, 而5.0以上版本的varchar的字節長度最大是 65535字節, 即 64KB.
  2. 一樣的 varchar(20) 的含義不一樣, 4.1版本之前, 表示的是 varchar 20個字節, 若是存儲utf8漢子, 則只能存放6個漢字, 而對於5.0以上的版本 varchar(20)則表示最多能夠存儲 20個 字符! 注意是字符, 再也不是字節了.
  3. 所以, 在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

  1. 一般不要去指定什麼 definer~ 由於默認的就是 'root'@'localhost', 沒有什麼問題, 並且定義definer也沒用什麼意義! 最重要的是, 容易出錯, 容易把 'definer'寫出'define' 而很難排錯!
  2. 存儲過程當中, 可使用 'if not exists', 可是在函數中 就不能使用 if not exists!
  3. 在存儲過程當中, 的參數,不能使用 帶@的, 並且不能設置默認值, 若是是字符串類型,必須指定長度
  4. 調用存儲過程時, 必須使用用戶變量帶 @的, 不能使用沒有@的變量, 由於那是局部變量, 局部變量和 函數調用中的 不帶@ 的變量不能區分. 這個自沒必要然說, 你若是直接輸入不帶@的變量, 會提示沒有那樣的 "field" 錯誤.
  5. 調用函數的時候, 參數個數要 正確, 即便你不用 這個參數的值, 你也要輸入null 來佔位.

  6. 一個mysql語句, 能夠是簡單的 insert/select語句, 也能夠是 begin...end 的複合語句, 複合語句中, 能夠包含 變量聲明, 和其餘條件/選擇/循環結構語句等.

1) function與procedure的區別:一個有返回值,一個沒有,僅此而已。上述說法是錯誤的,function和procedure的用法有不少不一樣,整體來講procedure受到的限制較少,function的限制較多;並且procedure可使用out參數返回值,所以儘可能採用procedure

誠如上面所說 的同樣, 函數有太多的限制了, 最好 仍是用存儲過程吧, 由於函數,出問題的時候, 好多時候你還不知道到底 是哪裏出問題了, 你認爲能夠的地方, 它函數其實卻認爲不能夠作了不少 的 限制!! 好比這裏的函數的 參數, 不少地方/文章說, 能夠指定 存儲類型方式in/out/inout可是這裏指定in則是錯誤的, 去掉in 則正確!


在mysql中 定義表中的字段的時候, not null 仍是 要放在 default的前面, 即便你 寫代碼的時候, 把default放在not null的前面, 可是在show的時候, 仍是看到 not null 在 default的前面。

在mysql中的一個通用的 錯誤編號: ERROR 1064 (42000), 表示的是 你的 sql語句中 , 有關鍵字、 單詞,的 拼寫書寫錯誤了, 而不是你的 邏輯錯誤! 因此 要注意不要在你的 sql語句中 的書寫literal 寫錯了,這種低級錯誤要儘可能避免!

相關文章
相關標籤/搜索