首先,MySQL是关系型数据库,它将数据以表格的形式表现,每行为各种记录的名称,每列为记录名称所对应的数据域。行和列构成一张数据表,许多的表组成一个数据库。MySQL把数据存储在表格中,使用结构化查询语言SQL来访问数据库。
MySQL的特点:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
关于环境变量配置之类的在此不再累述,请自行百度。
如果没有配置环境变量,请cd到MySQL的安装目录,然后输入以下命令:
mysql -u root -p 你的密码
MySQL默认用户名为root,密码为空。如果在安装过程中修改了账号密码,请输入设置的账号和密码。
在使用MySQL数据库时,经常会涉及到创建、展示、选择和删除MySQL数据库的操作,建议熟记这些命令的格式及使用方法。
创建数据库
语法格式:
CREATE DATABASE database_name;
其中database_name为要创建的数据库的名称,该名称不能与已经存在的数据库重名。
SQL语句不区分大小写,创建数据库的语句也可以使用小写的
create database database_name
,数据库名称可以由任意字母、数字、下划线或者$
组成,但不能使用纯数字作为数据库的名称,也不能使用mysql关键字作为数据库名。
【示例】
使用命令创建一个名为db_test的数据库:
CREATE DATABASE db_test;
运行结果:
显示数据库
数据库创建好之后,可以使用SHOW CREATE DATABASE
声明查看数据库的定义。
选择数据库
在对一个数据库操作之前,需要先选择数据库,MySQL中使用use选择数据库,语法如下:
USE db_name;
删除数据库
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。语法如下:
DROP DATABASE db_name;
在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类型,有相同的长度和存储需求,但不能存储二进制文件。
创建数据表
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检查表是否存在,因为在删除一个不存在的表的情况下会报错。
也就是我们通常说增删改查。
插入数据
插入数据有两种方法:
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 | 模糊查询 |
数据备份与还原是数据库管理员非常重要的工作。
使用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 -u user -p [dbname] < filename.sql;
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支持面向过程和面向对象两种风格的操作数据库的形式。操作数据库分3个步骤:
面向过程风格的连接数据库语法如下:
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
面向过程风格
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中插入一行数据,代码如下:
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更新数据的示例代码如下:
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删除表中的数据也很简单,示例代码如下:
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也提供了多种传方式。示例代码如下:
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 ""
;
while($arr=$res->fetch_assoc()) {
var_dump($arr);
}
echo "
";
$res->free(); // 释放结果集
$db->close(); // 关闭连接
从以上代码的结果可以看到,结果数组中的索引是字段名称,值是字段的值。这是通过fetch_assoc
方式得到的结果,如果将fetch_assoc
换成fetch_array
,那么查询到的结果将同时包含索引数组和关联数组,其中索引数组的值为表中字段的值,如果换成row()
就只会得到索引数组。
PDO扩展为PHP访问数据库定义了一个轻量级、一致性的接口。它提供了一个数据访问抽象层,无聊使用什么数据库,都可以通过一致的函数执行查询和获取数据。
使用PDO创建一个数据库连接语法如下:
PDO::__construct(string $dsn[, string $username[, string $password[, array $driver_options]]])
其中,数据源名称或叫做DSN包含了请求连接到数据库的信息。连接成功就返回一个PDO对象,如果试图连接到请求的数据库失败就抛出一个PDO异常。
使用PDO连接数据库的示例代码如下:
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();
}
向test_table中插入数据的代码如下:
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 "插入成功
";
} else {
var_dump($db->errorInfo()); // 错误信息
exit();
}
}
使用PDO更新表中的内容与mysqli差不多,也很简单,代码如下:
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查询数据表代码如下:
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 ""
;
$res = $db->prepare($sql); // 预处理SQL语句
$res->execute();
$arr = $res->fetchAll(); // 获取所有查询结果
var_dump($arr);
echo "
";
在以上代码中,除了使用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 | 返回一个属性名对应结果集列名的匿名对象 |
【示例】
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 ""
;
$res = $db->prepare($sql); // 预处理SQL语句
$res->execute();
while ($arr=$res->fetch(PDO::FETCH_OBJ)) {
// 将结果集以匿名对象形式返回
var_dump($arr);
}