文章目錄
MySQL是一個小型關係型數據庫管理系統,與其他大型數據庫管理系統:Oracle、DB2、SQL Server等相比,MySQL規模小、功能有限,但是它的體積小、速度快、成本低,最重要的是它是免費的開源的,而MySQL幾乎也已經成爲了PHP的標配。關於MySQL的使用,包含的內容很多,這裏還是以PHP與MySQL的交互爲主,無法涉及到MySQL的方方面面,有關MySQL的知識,推薦一本書《MySQL必知必會》,有興趣的可以去看看。
MySQL數據庫基礎
首先,MySQL是關係型數據庫,它將數據以表格的形式表現,每行爲各種記錄的名稱,每列爲記錄名稱所對應的數據域。行和列構成一張數據表,許多的表組成一個數據庫。MySQL把數據存儲在表格中,使用結構化查詢語言SQL來訪問數據庫。
MySQL的特點:
- 開源
- 支持大型數據庫,可以處理千萬級數據。
- 使用標準的SQL數據語言形式。
- 跨平臺,並支持多語言。如:C、C++、Python、Java、Perl、Efffel、Ruby等。
- 對PHP有很好的支持。
- 運行速度快。
MySQL的安裝
- windows安裝
訪問MySQL官網,根據操作系統選擇合適的版本下載。
雙擊下載得到的安裝包,然後一路next,知道安裝完成。 - Linux安裝(以Ubuntu爲例)
依次執行以下命令:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
登陸MySQL
關於環境變量配置之類的在此不再累述,請自行百度。
如果沒有配置環境變量,請cd到MySQL的安裝目錄,然後輸入以下命令:
mysql -u root -p 你的密碼
MySQL默認用戶名爲root,密碼爲空。如果在安裝過程中修改了賬號密碼,請輸入設置的賬號和密碼。
MySQL數據庫的基本操作
在使用MySQL數據庫時,經常會涉及到創建、展示、選擇和刪除MySQL數據庫的操作,建議熟記這些命令的格式及使用方法。
-
創建數據庫
語法格式:CREATE DATABASE database_name;
其中database_name爲要創建的數據庫的名稱,該名稱不能與已經存在的數據庫重名。
SQL語句不區分大小寫,創建數據庫的語句也可以使用小寫的
create database database_name
,數據庫名稱可以由任意字母、數字、下劃線或者$
組成,但不能使用純數字作爲數據庫的名稱,也不能使用mysql關鍵字作爲數據庫名。【示例】
使用命令創建一個名爲db_test的數據庫:CREATE DATABASE db_test;
運行結果:
-
顯示數據庫
數據庫創建好之後,可以使用SHOW CREATE DATABASE
聲明查看數據庫的定義。
可以使用SHOW DATABASES;
查詢當前所有存在的數據庫。 -
選擇數據庫
在對一個數據庫操作之前,需要先選擇數據庫,MySQL中使用use選擇數據庫,語法如下:
USE db_name;
-
刪除數據庫
刪除數據庫是將已經存在的數據庫從磁盤空間上清除,清除之後,數據庫中的所有數據也將一同被刪除。語法如下:
DROP DATABASE db_name;
MySQL數據類型
在MySQL中定義數據字段的類型對數據庫的優化非常重要,MySQL支持三種類型:數值、日期/時間和字符串(字符)類型。
-
數值類型
MySQL支持所有標準SQL數值數據類型。如下表:類型 大小 範圍(有符號) 範圍(無符號) 說明 TINYINT 1字節 (-128, 127) (0,255) 小整數值 SMALLINT 2字節 (-32768,32767) (0,65535) 大整數值 MEDIUMINT 3字節 (-8388608, 8388607) (0,16777215) 大整數值 INT或INTEGER 4字節 (-2147483648,2147483647) (0,4294967295) 大整數值 BIGINT 8字節 (-2^63, -2^63 - 1) (0,2^64 - 1) 極大整數值 FLOAT 4字節 (-3.402823466 E+38, 1.175494351 E-38) (0,1.175494351E-38, 3.402823466 E+38) 單精度浮點數值 DOUBLE 8字節 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308) (0, (2.2250738585072014 E-308, 1.7976931348623157E+308) 雙精度浮點數值 DECIMAL 對DECIMAL(M,D),如果M>D,就爲M+2,否則爲D+2 依賴於M和D的值 依賴於M和D的值 小數值 -
日期和時間類型
每個時間類型都有一個有效值範圍和一個“零”值,當指定不合法的MySQL不能表示的值時使用“零”值。類型 大小 範圍 格式 說明 DATE 3字節 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3字節 -838:59:59’/'838:59:59 HH:MM:SS 時間值或持續時間 YEAR 1字節 1901/2155 YYYY 年份值 DATETIME 8字節 1000-01-01 00:00:00 / 9999-12-31 23:59:59 YYYY-MM-DD H:MM:SS 混合日期和時間值 TIMESTAMP 8字節 1970-01-01 00:00:00/2037年某時 YYYYMMDDHMMSS 混合日期和時間值時間戳 -
字符串類型
類型 大小/字節 說明 CHAR 0-255 定長字符串 VARCHAR 0-65535 變長字符串 TINYBLOB 0-255 不超過255個字符的二進制字符串 TINYTEXT 0-255 短文本字符串 BLOB 0-65535 二進制形式的長文本數據 TEXT 0-65535 長文本數據 MEDIUMBLOB 0-16777215 二進制形式的中毒長度文本數據 MEDIUMTEXT 0-16777215 中等長度文本數據 LONGBLOB 0-4294967295 二進制形式的極大文本數據 LONGTEXT 0-4294967295 極大文本數據 CHAR和VARCHAR類型相似,但它們保存和檢索的方式不同,它們的最大長度和是否尾部空格被保留等也不同。在存儲或檢索過程中不進行大小寫轉換。
BINARY和VARBINARY類似於CHAR和VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串,而不是字符字節串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值。
BLOB是一個二進制大對象,可以容納可變數量的數據。有4中BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同,支持任何數據,如文本、聲音和圖像等。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4中BLOB類型,有相同的長度和存儲需求,但不能存儲二進制文件。
MySQL數據表的基本操作
-
創建數據表
CREATE [TEMPRARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options][select_statement]
參數 說明 TEMPORARY 創建一個臨時表 IF NOT EXISTS 檢查表明是否已存在 create_definition 表的列屬性 table_options 表的一些特性參數 select_statement select 語句描述部分,可以快速創建表 其中,create_definition部分是經常使用到的部分,每一列的具體定義格式如下:
col_name type [NOT NULL| NULL][DEFAULT default_value][AUTO_INCREMENT][UNIQUE [KEY]|[PRIMARY] KEY][COMMENT 'string'][reference_definition]
關於create_definition參數的說明如下表:
參數 說明 col_name 字段名 type 字段類型 NOT NULL|NULL NOT NULL表示該列不允許爲空值,系統默認可爲空值 DEFAULT default_value 設置字段默認值 AUTO_INCREMENT 設置該列爲自動增長,一個表中只能有一個字段設置該屬性 UNIQUE KEY|PRIMARY KEY QNIQUE KEY表示唯一性索引,PRIMARY KEY表示設置該列爲主鍵 COMMENT ‘string’ 字段註釋 下面演示創建一個名爲test_table的表,該表包含id、title、anthor、content、submit_time、click字段。
CREATE TABLE `db_test`.`test_table`( `id` INT NOT NULL AUTO_INCREMENT, `title` VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, `author` CHAR(10) NULL, `content` VARCHAR(45) NOT NULL COMMENT '文章內容', `submit_time` VARCHAR(45) NOT NULL, `click` INT(4) NULL DEFAULT 0, PRIMARY KEY(`id`)) ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COMMENT='文章內容表'
注意:數據庫名、表名、字段名都是用反引號包裹起來的,不是單引號。
-
查看數據表結構
創建完一個表後,可以使用show columns
或者describe
語句查看指定數據表的結構。語法如下:
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name][LIKE 'pattern']
show columns顯示在一個給定表中各列的信息,也可以使用describe
語句查看錶結構,語法如下:
DESCRIBE table_name [column_name]
其中DESCRIBE可以簡寫爲desc,在查看錶結構時也可以只列出某一列的信息。 -
更改數據表結構
當我們需要修改數據表名或數據表字段名時,需要使用alter命令。其語法如下:ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification]...
其中,alter_specification定義的內容如下:
alter_spercification: // 添加新字段 ADD [COLUMN] create_definition [FIRST|AFTER column_name] // 添加索引名稱 | ADD INDEX [index_name] (index_col_name,...) // 添加主鍵名稱 |ADD PRIMARY KEY (index_col_name,...) // 添加唯一索引 |ADD UNIQUE[index_name](index_col_name,...) // 修改字段名稱 |ALTER [COLUMN] col_name(SET DEFAULT literal | DROP DEFAULT) // 修改字段類型 |CHANGE [COLUMN] old_col_name create_definition // 添加子句定義類型 |MODIFY [COLUMN] create_definition // 刪除字段 |DROP [COLUMN] col_name // 刪除主鍵 |DROP PRIMARY KEY // 刪除索引 |DROP INDEX index_name // 更改表名 |RENAME [AS] new_tbl_name |table_options |partition_options
alter table用於更改原有表的結構,可以增加或刪減列、創建或取消索引、更改原有列的類型、重命名列或表,還可以更改表的評註和表的類型。alter table運行時會對原表機型臨時複製,在副本上進行更改,然後刪除原表,再對新表進行重命名。在執行alter table時,其他用戶可以閱讀原表,但是對標的更新和修改的操作將被延遲,知道新表生成爲止。新表生成後,這些更新和修改信息會自動轉移到新錶行。
-
刪除字段
alter table test_table drop click
以上命令將刪除test_table表中的click字段。如果數據表中只剩餘一個字段則無法用drop來刪除字段。
-
添加字段
alter table test_table add click_times int(4)
以上命令將給表test_table添加字段click_times,其類型爲int。
新增字段會自動添加到數據表字段的末尾。如果你需要制定新增字段的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位於某個字段之後)。舉例如下:// 將字段i添加到數據表的第一列 alter table test_table add i int first; // 將字段click_times添加到click之後 alter table test_table add click_times int(4) after click;
first和after關鍵字只作用於add子句,如果想重置字段的位置,需要先drop字段後,使用add添加字段到特定的位置。
-
修改字段類型
alter table test_table modify submit_time datetime
以上命令將修改表test_table中submit_time字段類型爲datetime。
修改字段還可以使用change子句:
alter table test_table change submit_time submit_time datetime
使用change子句,在change關鍵字後,緊跟着的是你要修改的字段名,然後指定新字段的類型及名稱。 -
重命名錶名
alter table test_table rename to table_test
以上命令將修改表test_table表名爲table_test。 -
修改數據表類型
alter table test_table type = innobdb
以上命令將修改表test_table的類型爲innobdb。
-
-
刪除數據表
刪除數據表使用drop table語句,語法如下:
drop table table_name[if exists]
其中if exists檢查表是否存在,因爲在刪除一個不存在的表的情況下會報錯。
操作MySQL數據
也就是我們通常說增刪改查。
-
插入數據
插入數據有兩種方法:
insert into table_name(column_1, column_2,...) values (value_1, value_2,...)
另一種:
insert into table_name set column_1=value_1, column_2=value_2,...
【示例】
使用第一種方法向test_table中插入數據。insert into test_table(title, author, content, submit_time, click) values ('hello', 'ib-top', 'hello mysql', now(), 10), ('hello1', 'ib-top', 'hello mysql', now(), 1);
以上代碼中,now()是mysql函數,用於獲取當前系統時間。
在MySQL中,可以一次性插入多行記錄,各行記錄之間用逗號隔開即可。
-
更新數據
更新數據使用update語句,語法如下:
update table_name set col_name1=expr1[, col_name2=expr2...][where where_definition]
其中set重新設定指定列的值,where子句指定記錄中哪些行需要被更改,如果不設置where子句或where子句的值恆成立(如1=1),就將更新素有記錄行的數據。
【示例】
一下命令將test_table中id=1的行中click列值更新爲200。
update test_table set click=200 where id=1
-
刪除數據
刪除表中的數據使用delete語句,語法如下:
delete from tbl_name [where where_definition]
其中,where子句指定哪些行被刪除,如果沒有設置where子句或其恆成立,將會刪除所有記錄。
【示例】
delete from test_table where id=1
以上命令將刪除test_table中id爲1的行。
另外,MySQL還提供了一個可以清空數據表中所有數據的函數truncate,語法如下:
truncate table_name
-
查詢數據
MySQL中提供的查詢數據的語句非常強大,比如可以限定查詢數量和查詢起始位置、對查詢結果進行分組排序、使用函數和表達式查詢數據等。
select語法如下:SELECT [ALL|DISTINCT|DISTINCTROW] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT][SQL_BIG_RESULT[SQL_BUFFER_RESULT] [SQL_CACHE|SQL_NO_CACHE][SQL_CALC_FOUND_ROWS] select_expr,... [INTO OUTFILE 'file_name' export_options |INTO DUMPFILE 'file_name'] [FROM table_references] [WHERE where_definition] [GROUP BY {col_name|expr|position} [ASC|DESC],...[WITH ROLLUP]] [HAVING where_definition] [ORDER BY {col_name|expr|position} [ASC|DESC],...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [FOR UPDATE|LOCK IN SHARE MODE]
關於select語句參數說明如下:
參數 說明 all|distinct|distinctrow 使用DISTINCT可去除結果中重複的行 into outfile 將查詢結果導出到文件 from 被查詢的表 where 查詢條件 group by 將查詢結果分到不同的組中 having 可篩選成組後的各種數據 order by 對結果進行排序 limit 限定查詢結果行數 like 模糊查詢
MySQL數據庫的備份與還原
數據備份與還原是數據庫管理員非常重要的工作。
數據備份
-
使用mysqldump命令備份
該命令可以將數據庫備份成一個文本文件,該文件中實際上包含多個CREATE和INSERT語句,使用這些語句可以重新創建表和插入數據。
語法格式:
mysqldump -u user -h host -password dbname[tbname, [taname...]] > filename.sql
其中user表示數據庫用戶名,host表示主機名稱,password是登陸密碼,dbname爲需要備份的數據庫名稱,tbname爲需要備份的數據表,可以指定多個需要備份的表,filename.sql爲備份文件的名稱。
mysqldump命令還有一些其他選項可以用來制定備份過程:參數名 說明 使用格式(默認值) –add-drop-database 在 CREATE DATABLE
前添加DROP DATABASE
語句–add-drop-table 在 CREATE TABLE
前添加DROP TABLE
語句默認開啓 –add-drop-user 在 CREATE USER
前添加DROP USER
語句–add-drop-trigger 在 CREATE TRIGGER
前添加DROP TRIGGER
語句–add-locks 在每個表導出時添加 LOCK TABLES
並且之後進行UNLOCK TABLES
默認開啓 –all-databases 導出所有數據庫 –allow-keywords 允許創建以關鍵字爲列名的列 –apply-slave-statements 在 CHANGE MASTER
前添加STOP SLAVE
語句,在導出最後START SLAVE
–bind-address 使用指定的網絡接口連接MySQL數據庫 –character-sets-dir 指定安裝字符集的目錄 –comments 將註釋導入到dump文件中 默認開啓 –compact 產生更少的輸出信息 –compatible 導出的數據將與其它類型數據庫或舊版本的MySQL兼容,值可以爲ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等 –complete-insert 使用完整的包含列名的插入語句 –compress 在客戶端與服務器間壓縮傳遞所有的信息 –create-options 在CREATE TABLE語句中包含所有MySQL表特性選項 默認打開 –databases 輸入後的所有參數都作爲數據庫名 –debug 輸出debug日誌 –debug-check 當程序退出時,打印debug信息 –debug-info 當程序退出時輸出debug信息、內存和CPU信息 –default-auth 使用認證插件 –default-character-set 指定默認字符集 默認值爲utf8 –defaults-extra-file 讀取配置文件 –defaults-file 只讀命名文件 –defaults-group-suffix Option group suffix value –delete-master-logs 在master備份後刪除日誌 –disable-keys For each table, surround INSERT statements with statements to disable and enable keys –dump-date Include dump date as “Dump completed on” comment if --comments is given –dump-slave 該選項將導致主的binlog位置和文件名追加到導出數據的文件中 –enable-cleartext-plugin Enable cleartext authentication plugin 5.7.10啓用 –events 從數據庫導出event –extended-insert 使用多行插入語句 –fields-enclosed-by 輸出文件中的各個字段用給定字符包裹。與 --tab
選項一起使用–fields-escaped-by 輸出文件中的各個字段忽略給定字符。與–tab選項一起使用 –fields-optionally-enclosed-by 輸出文件中的各個字段用給定字符選擇性包裹。與–tab選項一起使用 –fields-terminated-by 導出文件中忽略的指定字段,與 --tab
一起使用–flush-logs 在開始導出前刷新日誌 –flush-privileges 在導出數據庫後,執行 FLUSH PRIVILEGES
–force 在導出表的過程中忽略出現的SQL錯誤 –get-server-public-key 從服務獲取RSA公共key 5.7.23 –help 展示幫助信息並退出 –hex-blob 使用十六進制格式導出二進制字符串字段 –host 要連接的遠程主機IP –ignore-error 忽略指定錯誤 5.7.1啓用 –ignore-table 不導出指定表 –include-master-host-port 在 --dump-slave
產生的CHANGE MASTER TO..
語句中增加MASTER_HOST=,MASTER_PORT=
–insert-ignore 用 INSERT IGNORE
替代INSERT
–lines-terminated-by 輸出文件的每行用給定字符串劃分。與–tab選項一起使用 –lock-all-tables 提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉 –lock-tables 在dump表之前鎖表 –log-error-file 導出警告和錯誤信息到指定文件 –login-path Read login path options from .mylogin.cnf –master-data 該選項將binlog的位置和文件名追加到輸出文件中 –max-allowed-packet 設置從服務接收或發送到服務的最大包長度 –net-buffer-length 設置TCP/IP 和socket連接的緩存大小 –no-autocommit 使用autocommit/commit 語句包裹表。 –no-create-db 不導出建庫語句 –no-create-info 不導出建表語句 –no-data 不導出表數據 –no-defaults Read no option files –no-set-names 等同於 --skip-set-charset
–no-tablespaces 不導入表空間信息 –opt 等同於–add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 該選項默認開啓, 可以用–skip-opt禁用. –order-by-primary 導出每個表的數據行時按照表的主鍵或者第一個唯一字段排序 –password 連接數據庫的密碼 –pipe 在Windows,使用命名管道連接mysql –plugin-dir 指定插件安裝的目錄 –port 數據庫連接的端口 –print-defaults 輸出默認參數 –protocol 連接所用的協議 –quick 不緩衝查詢,直接導出到標準輸出 默認打開 –quote-names 使用(`)引起表和列名 默認開啓 –replace 用 REPLACE
取代INSERT
語句–result-file 直接輸出到指定文件中 –routines 導出保存的routine(存儲過程和函數) –secure-auth 不以舊形式向服務發送密碼 5.7.4啓用,5.7.5棄用 –server-public-key-path Path name to file containing RSA public key 5.7.23 –set-charset 添加 SET NAMES default_character_set
到輸出文件默認開啓 –set-gtid-purged Whether to add SET @@GLOBAL.GTID_PURGED to output –shared-memory-base-name The name of shared memory to use for shared-memory connections –single-transaction 選項在導出數據之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB。本選項和–lock-tables 選項是互斥的,因爲LOCK TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用–quick 選項。 –skip-add-drop-table 不在 CREATE TABLE
前添加DROP TABLE
語句–skip-add-locks 導出時不加鎖 –skip-comments 不導出註釋 –skip-compact 不減少輸出信息 –skip-disable-keys 不disable key –skip-extended-insert 關閉extended-insert –skip-opt 關閉 --opt
設定的–skip-quick 進行數據緩衝Do not retrieve rows for a table from the server a row at a time –skip-quote-names 取消1–quote-names` –skip-set-charset 不設置字符集 –skip-triggers 不導出觸發器 –skip-tz-utc 關閉時區設置 –socket 指定連接mysql的socket文件位置 –ssl Enable encrypted connection –ssl-ca File that contains list of trusted SSL Certificate Authorities –ssl-capath Directory that contains trusted SSL Certificate Authority certificate files –ssl-cert File that contains X.509 certificate –ssl-cipher List of permitted ciphers for connection encryption –ssl-crl File that contains certificate revocation lists –ssl-crlpath Directory that contains certificate revocation list files –ssl-key File that contains X.509 key –ssl-mode Security state of connection to server 5.7.11 –ssl-verify-server-cert Verify host name against server certificate Common Name identity –tab爲每個表在給定路徑創建tab分割的文本文件 –tables 覆蓋–databases (-B)參數,指定需要導出的表名。 –tls-version Protocols permitted for encrypted connections 5.7.10 –triggers 導出觸發器 –tz-utc 添加 SET TIME_ZONE='+00:00'
到導出的文件中,保證導出數據的時區正確性–user 指定連接MySQL的用戶名 ----verbose 輸出多種平臺信息。 –version 顯示mysqldump的版本信息並退出 5.7.9 –where 只導出符合where條件的數據 –xml 導出XML格式. -
直接複製整個數據庫目錄
這是一種簡單、快速、有效的備份方式。要想保持備份的一致性,備份前需要對相關表執行LOCK TABLES操作,然後對錶執行FLUSH TABLES。這樣當複製數據庫目錄中的文件時,允許其他客戶繼續查詢表。需要FLUSH TABLES語句來確保開始備份前將所有激活的索引頁寫入硬盤。當然,也可以停止MYSQL服務再進行備份操作。 -
使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個Perl腳本,最初由Tim Bunce編寫並提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫。它是備份數據庫或單個表的最快途徑,但它只能運行在數據庫目錄所在的機器上,並且只能備份MYISAM類型的表。
數據還原
- 使用mysql命令還原
對於已經備份的包含CREATE、INSERT語句的文本文件,可以使用mysql命令導入到數據庫中。其命令語法如下:
mysql -u user -p [dbname] < filename.sql;
user是用戶名,-p表示輸入用戶密碼,dbname是數據庫名。如果filename.sql文件爲mysqldump工具創建的包含創建數據庫語句的文件,執行的時候不需要制定數據庫名。 - 直接賦值到數據庫目錄
如果數據庫通過複製數據庫文件備份,可以直接複製備份文件到MYSQL數據目錄下實現還原。通過這種方式還原時,必須保證備份數據局的數據庫和待還原的數據庫服務器的主版本號相同。而且這種方式只對MYISAM引擎的表有效,對於InnoDB引擎的表不可用。
執行還原前需要關閉MYSQL服務,然後將備份文件和目錄覆蓋MySQL的data目錄,然後啓動MySQL服務。對於Linux/UNIX操作系統來說,還需要將文件的用戶和組更改爲MySQL運行的用戶和組,通常用戶是MySQL,組也是MySQL。 - mysqlhotcopy快速恢復
使用mysqlhotcopy備份後的文件可以用來恢復數據庫,在MySQL服務器停止運行時,將備份的數據庫文件複製到MySQL存放數據的位置(MySQL的data文件夾),重新啓動MySQL服務即可。
PHP操作MySQL數據庫
PHP與MySQL是在編程中經常搭配使用的。在一般的網站架構模式中經常採用LAMP的形式,即Linux、Apache、MySQL、PHP,還有一種就是非常流行的LNMP,其中N代表Nginx服務器。
在PHP5.x的版本中支持三種PHP擴展方式連接數據庫:mysql、mysqli和PDO。在PHP7中去掉了純面向過程的mysql連接數據庫的方式。
從PHP5開始,默認情況下不再自動開啓對MySQL的支持,而是放到擴展函數庫中,所以,需要首先打開php.ini中的相關擴展,找到";extension=php_mysqli.dll",並去掉前面的分號。
mysqli連接操作數據庫
mysqli支持面向過程和麪向對象兩種風格的操作數據庫的形式。操作數據庫分3個步驟:
- 連接數據庫和選擇數據庫。
- 執行SQL語句。
- 關閉結果集。
連接和選擇數據庫
-
面向過程風格的連接數據庫語法如下:
mysqli_connect([string $host[, string $username[, string $passwd=[, stirng $dbname=""[, int $port[, string $socket]]]]]])
【示例】
$db = mysqli_connect('localhost', 'root', '123456', 'db_test');
-
面向對象化風格的連接語法如下:
mysqli::connect([string $host[, string $username[, string $passwd=[, string $dbname=""[, int $port[, string $socket]]]]]])
【示例】
$db = new mysqli('localhost', 'root', '123456', 'db_test');
更改默認的數據庫
連接到數據庫以後,如果需要更改默認的數據庫,就使用函數mysqli_select_db()
。語法爲:
-
面向過程風格
mysqli_select_db(mysqli $link, string $dbname):bool
-
面向對象風格
mysqli::select_db(string $dbname):bool
關閉數據庫連接
在完成了一次對服務器的使用的情況下,需要關閉此連接,以免對MySQL服務器中的數據進行誤操作並對資源進行釋放。
-
面向過程風格
mysqli_close(mysql $link):bool
-
面向對象風格
mysqli::close(void):bool
執行SQL語句
-
面向過程風格
mysqli_query(mysqli $link, string $query[, int $resultmode=MYSQLI_STORE_RESULT]):mixed
-
面向對象風格
mysqli::query(string $query[, int $resultmode=MYSQLI_STORE_RESULT]):mixed
示例
通過myslqi向表test_table中插入一行數據,代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "insert into test_table (title, author, content, submit_time, click) values(?,?,?,?,?)";
// 預設的SQL語句,表示需要綁定的參數
$title = 'titlemysqli';
$author = 'ib-top';
$content = 'test insert';
$submit_time = '2020-03-22 22:22:22';
$click = 100;
$stmt = $db->prepare($sql); // 預執行SQL語句
$stmt->bind_param("sssss", $title, $author, $content, $submit_time, $click);
// 綁定參數到SQL語句,注意第一個參數的字符數量要和後面的參數數量保持一致
if($stmt->execute()) { // 執行SQL語句
echo "數據插入成功!";
}
$db->close(); // 關閉連接
使用mysqli更新數據的示例代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "update test_table set title=? where id=1";
$title = 'mysqllititle';
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $title);
if($stmt->execute()) {
echo "數據更新成功!";
}
$db->close();
使用mysqli刪除表中的數據也很簡單,示例代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "delete from test_table where id=?";
$id = 1;
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $id);
if($stmt->execute()) {
echo "數據刪除成功!";
}
$db->close();
對於查詢數據表中的內容,mysqli也提供了多種傳方式。示例代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "select * from test_table where click>99";
$res = $db->query($sql);
echo "<pre>";
while($arr=$res->fetch_assoc()) {
var_dump($arr);
}
echo "</pre>";
$res->free(); // 釋放結果集
$db->close(); // 關閉連接
從以上代碼的結果可以看到,結果數組中的索引是字段名稱,值是字段的值。這是通過fetch_assoc
方式得到的結果,如果將fetch_assoc
換成fetch_array
,那麼查詢到的結果將同時包含索引數組和關聯數組,其中索引數組的值爲表中字段的值,如果換成row()
就只會得到索引數組。
PDO連接操作數據庫
PDO擴展爲PHP訪問數據庫定義了一個輕量級、一致性的接口。它提供了一個數據訪問抽象層,無聊使用什麼數據庫,都可以通過一致的函數執行查詢和獲取數據。
PDO連接數據庫
使用PDO創建一個數據庫連接語法如下:
PDO::__construct(string $dsn[, string $username[, string $password[, array $driver_options]]])
其中,數據源名稱或叫做DSN包含了請求連接到數據庫的信息。連接成功就返回一個PDO對象,如果試圖連接到請求的數據庫失敗就拋出一個PDO異常。
使用PDO連接數據庫的示例代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=db_test;host=127.0.0.1';
$user = 'root';
$password = '123456789';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo '連接失敗:'.$e->getMessage();
}
執行SQL語句
向test_table中插入數據的代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', '123456789');
$author = ['張三', '李四', '王五', '趙六', '孫七', '吳八'];
for ($i = 0; $i < 100; $i++) {
$sql = "insert into test_table(title, author, content, submit_time, click) values ('title" . $i . "','" . $author[rand(0, 5)] . "', 'content" . $i . "', '" . date('Y-m-d H:i:s') . "', " . rand(100, 1000) . ")";
// echo $sql;
if ($db->exec($sql)) { // 執行SQL語句
echo "插入成功<br />";
} else {
var_dump($db->errorInfo()); // 錯誤信息
exit();
}
}
使用PDO更新表中的內容與mysqli差不多,也很簡單,代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', '12346789');
$sql = "update test_table set title='titlepdo' where id>50";
if ($db->exec($sql)) {
echo "更新成功!";
} else {
var_dump($db->errorInfo());
exit();
}
刪除操作也類似於mysqli,再次不在累述。
使用PDO查詢數據表代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', 'zy801124@1980');
$sql = "select content from test_table where click>950";
echo "<pre>";
$res = $db->prepare($sql); // 預處理SQL語句
$res->execute();
$arr = $res->fetchAll(); // 獲取所有查詢結果
var_dump($arr);
echo "</pre>";
在以上代碼中,除了使用fetchAll()
以外還可以使用fetch
,語法如下:
PDOStatement::fetch([int $fetch_style[, int $cursor_orientation=PDO::FETCH_ORI_NEXT[, int $cursor_offset=0]]]):mixed
其作用是從一個PDOStatement對象相關的結果集中獲取下一行。fetch_style
參數決定PDO如何返回行。該參數的說明如下:
參數 | 說明 |
---|---|
PDO::FETCH_ASSOC | 返回一個索引爲結果集列名的數組 |
PDO::FETCH_BOTH(默認) | 返回一個索引爲結果集列名和以0開始的列號的數組 |
PDO::FETCH_BOUND | 返回 TRUE ,並分配結果集中的列值給 PDOStatement::bindColumn() 方法綁定的 PHP 變量。 |
PDO::FETCH_CLASS | 返回一個請求類的新實例,映射結果集中的列名到類中對應的屬性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE),則類名由第一列的值決定 |
PDO::FETCH_INTO | 更新一個被請求類已存在的實例,映射結果集中的列到類中命名的屬性 |
PDO::FETCH_LAZY | 結合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,創建供用來訪問的對象變量名 |
PDO::FETCH_NUM | 返回一個索引爲以0開始的結果集列號的數組 |
PDO::FETCH_OBJ | 返回一個屬性名對應結果集列名的匿名對象 |
【示例】
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', 'zy801124@1980');
$sql = "select content from test_table where click>950";
echo "<pre>";
$res = $db->prepare($sql); // 預處理SQL語句
$res->execute();
while ($arr=$res->fetch(PDO::FETCH_OBJ)) {
// 將結果集以匿名對象形式返回
var_dump($arr);
}