1. 程式人生 > >python學習_day42_mysql表操作1

python學習_day42_mysql表操作1

過期 nod 必須 這也 年月日 b+ 括號 mvc 發布

一、配置文件

  服務端和客戶端的字符編碼不一樣時,可能會導致亂碼顯示等情況,為了統一兩端的字符編碼,可以通過配置文件進行實現,當然譬如登錄賬戶等信息也可以進行配置,在啟動mysql服務端時會自動讀取配置文件中的內容。配置文件(my.ini)必須建在解壓的mysql文件下,具體配置文件的格式如下:

#1. 在執行mysqld命令時,下列配置會生效,即mysql服務啟動時生效
[mysqld]
skip-grant-tables   #跳過授權表命令
port=3306
character_set_server=utf8  #設置字符編碼命令
default-storage-engine=innodb  #
設置存儲引擎命令 innodb_file_per_table=1 #2. 針對客戶端命令的全局配置,當mysql客戶端命令執行時,下列配置生效 [client] port=3306 default-character-set=utf8 user=root password=123 #3. 只針對mysql這個客戶端的配置,2中的是全局配置,而此處的則是只針對mysql這個命令的局部配置 [mysql] ;port=3306 ;default-character-set=utf8 user=egon password=4573 #!!!如果沒有[mysql],則用戶在執行mysql命令時的配置以[client]為準

二、存儲引擎

  存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因為在關系數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)。在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql數據庫提供了多種存儲引擎。用戶可以根據不同的需求為數據表選擇不同的存儲引擎,用戶也可以根據自己的需要編寫自己的存儲引擎。
1、mysql支持的存儲引擎

  查看mysql支持的存儲引擎的命令:show engines\G,查看正在使用的存儲引擎命令:show variables like ‘storage_engine%‘;。mysql默認使用的是InnoDB存儲引擎。

技術分享

  mysql支持的存儲引擎分別介紹如下:

#InnoDB 存儲引擎
支持事務,其設計目標主要面向聯機事務處理(OLTP)的應用。其
特點是行鎖設計、支持外鍵,並支持類似 Oracle 的非鎖定讀,即默認讀取操作不會產生鎖。 從 MySQL 5.5.8 版本開始是默認的存儲引擎。
InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒一樣由 InnoDB 存儲引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,可以將每個 InnoDB 存儲引擎的 表單獨存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持將裸設備(row disk)用 於建立其表空間。
InnoDB 通過使用多版本並發控制(MVCC)來獲得高並發性,並且實現了 SQL 標準 的 4 種隔離級別,默認為 REPEATABLE 級別,同時使用一種稱為 netx-key locking 的策略來 避免幻讀(phantom)現象的產生。除此之外,InnoDB 存儲引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。
對於表中數據的存儲,InnoDB 存儲引擎采用了聚集(clustered)的方式,每張表都是按 主鍵的順序進行存儲的,如果沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會為每一 行生成一個 6 字節的 ROWID,並以此作為主鍵。
InnoDB 存儲引擎是 MySQL 數據庫最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經證明了 InnoDB 存儲引擎具備高可用性、高性能以及高可擴展性。對其 底層實現的掌握和理解也需要時間和技術的積累。如果想深入了解 InnoDB 存儲引擎的工作 原理、實現和應用,可以參考《MySQL 技術內幕:InnoDB 存儲引擎》一書。

#MyISAM 存儲引擎
不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本之前是默認的存儲引擎(除 Windows 版本外)。數據庫系統 與文件系統一個很大的不同在於對事務的支持,MyISAM 存儲引擎是不支持事務的。究其根 本,這也並不難理解。用戶在所有的應用中是否都需要事務呢?在數據倉庫中,如果沒有 ETL 這些操作,只是簡單地通過報表查詢還需要事務的支持嗎?此外,MyISAM 存儲引擎的 另一個與眾不同的地方是,它的緩沖池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。

#NDB 存儲引擎
年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集群存儲引擎,類似於 Oracle 的 RAC 集群,不過與 Oracle RAC 的 share everything 結構不同的是,其結構是 share nothing 的集群架構,因此能提供更高級別的 高可用性。NDB 存儲引擎的特點是數據全部放在內存中(從 5.1 版本開始,可以將非索引數 據放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,並且能夠在線添加 NDB 數據存儲節點(data node)以便線性地提高數據庫性能。由此可見,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集群系統,其面向的也是 OLTP 的數據庫應用類型。

#Memory 存儲引擎
正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啟或發生崩潰,表中的數據都將消失。它非常適合於存儲 OLTP 數據庫應用中臨時數據的臨時表,也可以作為 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是通常熟悉的 B+ 樹索引。

#Infobright 存儲引擎
第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數據庫應用。其官方網站是 http://www.infobright.org/,上面有不少成功的數據 倉庫案例可供分析。

#NTSE 存儲引擎
網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的將來會實現面向內存的事務支持。

#BLACKHOLE
黑洞存儲引擎,可以應用於主備復制中的分發主庫。

MySQL 數據庫還有很多其他存儲引擎,上述只是列舉了最為常用的一些引擎。如果 你喜歡,完全可以編寫專屬於自己的引擎,這就是開源賦予我們的能力,也是開源的魅 力所在。

2、存儲引擎的使用

  方式一:在建表的時候指定

技術分享

  方式二:在配置文件進行配置

[mysqld]
default-storage-engine=INNODB
innodb_file_per_table=1

三、表數據類型

  存儲引擎決定了表的類型,而表內存放的數據也要有不同的類型,每種數據類型都有自己的寬度,但寬度是可選的。mysql中常見的數據類型包括數字、字符串、時間類型、枚舉類型及集合類型,分別介紹如下:

1、數字類型

技術分享(1)整數類型

  整數類型包括:TINYINT SMALLINT MEDIUMINT INT BIGINT,作用主要是存儲年齡、id及各種號碼,需要強調的是整數類型設置的數字為顯示的寬度。如下例:

技術分享

  可以看出設置寬度意義不大,能否正確存儲數字是由數字是否超過整數類型所能接收的範圍,通過設置zorefill可以看出顯示寬度的意義,如下:

技術分享

  默認為帶符號的,如下圖,當輸入數字超過有符號int類型所能接收的最大值時,存儲有符號範圍的最大值,如下例:

技術分享

  通過unsigned可以將int設置成不帶符號的形式,當輸入數字超過不帶符號int類型所能接受的最大值,則將數字儲存成不帶符號範圍的最大值,如下例。註意的是,如果設置為不帶符號的情況,輸入負數時,儲存為零。

技術分享(2)小數類型

   小數類型包括float、double和decimal三種類型,float類型支持的數字總個數最大為255,小數點後支持最大位數為30,隨著小數的增多,精度變得不準確;double類型支持的數字總個數最大為255,小數點後支持最大位數為30,隨著小數的增多,精度比float要高,但也會變得不準確;decimal類型支持的數字總個數最大為65,小數點後支持最大位數為30,隨著小數的增多,精度始終準確,因為其內部是按照字符串進行存儲的,對於精確數值計算需要用到。

create table t6(weight float(256,30);
create table t7(weight double(256,30);
create table t8(weight decimal(65,30);

insert into t6 values(1.1111111111111111111111111111111111111111111111111111111111111111);
insert into t7 values(1.1111111111111111111111111111111111111111111111111111111111111111);
insert into t8 values(1.1111111111111111111111111111111111111111111111111111111111111111);

  通過結果可以看到三者精度的差距如下:

技術分享

2、日期類型

  主要用於存儲用戶註冊時間,文章發布時間,員工入職時間,出生時間,過期時間等,包括如下幾種日期類型:

DATE:         年月日,如2017-11-11
TIME:         時分秒,如10:14:11  
DATETIME:     如2017-11-11 10:14:11,其中年的範圍為:1001-9999,存儲時間與時區無關,使用8字節的存儲空間,默認值為null
TIMESTAMP:    如2017-11-11 10:14:11,其中年的範圍為:1970-2038,存儲時間與時區有關,使用4字節的存儲空間,默認值為當前時間
YEAR : 表示年,支持的範圍為1901-2155

技術分享

3、字符類型

  字符類型包含char和varchar,具體不同如下:

#註意:char和varchar括號內的參數指的都是字符的長度

#char類型:定長,簡單粗暴,浪費空間,存取速度快
    字符長度範圍:0-255(一個中文是一個字符,是utf8編碼的3個字節)
    存儲:
        存儲char類型的值時,會往右填充空格來滿足長度
        例如:指定長度為10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲

    檢索:
        在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(SET sql_mode = PAD_CHAR_TO_FULL_LENGTH;)

#varchar類型:變長,精準,節省空間,存取速度慢
    字符長度範圍:0-65535,mysql行最大限制為65535字節,字符編碼為utf-8
    存儲:
        varchar類型存儲數據的真實內容,不會用空格填充,如果ab  ,尾部的空格也會被存起來
        強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
        如果真實的數據<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字為255)
        如果真實的數據>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字為65535)
    
    檢索:
        尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容

(1)寬度限制的區別

  當二者輸入的數據長度大於設置的長度,則均只從左到右保存設置長度數據部分:

技術分享

  當二者輸入數據的長度均小於設置的長度,則char按照設置的長度進行存儲,不夠位數用空格填充,varchar則儲存實際數據的長度,如按照如下創建完數據後,結果顯示為:

create table t16(name char(5));
create table t17(name varchar(5));


insert into t16 values(a); 
insert into t17 values(a); 


SET sql_mode = PAD_CHAR_TO_FULL_LENGTH;
select char_length(name) from t16;
select char_length(name) from t17;

技術分享

(2)存儲機制的區別

  如下表char存入數據是按照設定長度進行存儲的,不夠用空格站位,查詢時按照固定長度查詢,快速高效,但是占內存,varchar則是按實際字符長度進行存儲,但是為了方便查詢數據,需要在數據前加1-2個字節的前綴,該前綴表示真實數據的字節數,方便數據查詢。

技術分享

4、枚舉和集合類型

  枚舉:unum,字段的值只能在給定範圍中選一個,如性別:

技術分享

  集合:set,字段的值只能在給定範圍中選擇一個或多個,如愛好:

技術分享

python學習_day42_mysql表操作1