共计 3393 个字符,预计需要花费 9 分钟才能阅读完成。
MySQL 是 Web 世界中使用最广泛的数据库服务器。SQLite 的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而 MySQL 是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于 SQLite。
此外,MySQL 内部有多种数据库引擎,最常用的引擎是支持数据库事务的 InnoDB。
安装 MySQL
可以直接从 MySQL 官方网站下载最新的 Community Server 8.x 版本。MySQL 是跨平台的,选择对应的平台下载安装文件,安装即可。
安装时,MySQL 会提示输入 root
用户的口令,请务必记清楚。如果怕记不住,就把口令设置为password
。
在 Windows 上,安装时请选择 UTF-8
编码,以便正确地处理中文。
在 Mac 或 Linux 上,需要编辑 MySQL 的配置文件,把数据库默认的编码全部改为 UTF-8。MySQL 的配置文件默认存放在 /etc/my.cnf
或者/etc/mysql/my.cnf
:
[client]
default-character-set = utf8mb4
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8mb4
collation-server = utf8_general_ci
重启 MySQL 后,可以通过 MySQL 的客户端命令行检查编码:
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor...
...
mysql> show variables like '%char%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/local/mysql-8.x/share/charsets/ |
+--------------------------+--------------------------------------+
8 rows in set (0.00 sec)
看到 utf8mb4
字样就表示编码设置正确。
注意
如果 MySQL 的版本 <5.5.3,则只能把编码设置为 utf8
,utf8mb4
支持最新的 Unicode 标准,可以显示 emoji 字符,但 utf8
无法显示 emoji 字符。
用 Docker 启动 MySQL
如果不想安装 MySQL,还可以以 Docker 的方式快速启动 MySQL。
首先安装 Docker Desktop,然后在命令行输入:
$ docker run -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 --name mysql-8.4 -v ./mysql-data:/var/lib/mysql mysql:8.4 --mysql-native-password=ON --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
上述命令详细参数如下:
-e MYSQL_ROOT_PASSWORD=password
:传入 root 用户口令的环境变量,密码是password
;-p 3306:3306
:在本机3306
端口监听;--name mysql-8.4
:启动后容器的名称为mysql-8.4
,可任意设置;-v ./mysql-data:/var/lib/mysql
:把当前目录./mysql-data
映射到容器目录/var/lib/mysql
,此目录存放 MySQL 数据库文件,避免容器停止后数据丢失;mysql:8.4
:启动镜像名称为mysql:8.4
;--mysql-native-password=ON
:表示启用明文口令;--character-set-server=utf8mb4
:表示启用utf8mb4
作为字符集;--collation-server=utf8mb4_unicode_ci
:表示启用utf8mb4
作为排序规则。
运行命令后可看到如下输出:
2024-07-11 02:44:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.4.1-1.el9 started.
...
2024-07-11T02:44:16.874162Z 0 [System] [MY-015015] [Server] MySQL Server - start.
...
2024-07-11T02:44:17.120017Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-07-11T02:44:17.561242Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
...
2024-07-11T02:44:17.868691Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.4.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
看到最后一行 ready for connections
表示启动成功。
安装 MySQL 驱动
由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的 MySQL 驱动来连接到 MySQL 服务器。MySQL 官方提供了 mysql-connector-python 驱动:
$ pip install mysql-connector-python
我们演示如何连接到 MySQL 服务器的 test 数据库:
# 导入 MySQL 驱动:
>>> import mysql.connector
# 注意把 password 设为你的 root 口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()
# 创建 user 表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行记录,注意 MySQL 的占位符是 %s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
>>> cursor.rowcount
1
# 提交事务:
>>> conn.commit()
>>> cursor.close()
# 运行查询:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ('1',))
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 关闭 Cursor 和 Connection:
>>> cursor.close()
True
>>> conn.close()
由于 Python 的 DB-API 定义都是通用的,所以,操作 MySQL 的数据库代码和 SQLite 类似。
小结
- 执行 INSERT 等操作后要调用
commit()
提交事务; - MySQL 的 SQL 占位符是
%s
。
参考源码
do_mysql.py