创建数据库
MitSeek 发布于 阅读:20
在数据库bin目录下,
5.1cmd进入DOS命令模式
5.2进入数据库
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -uroot -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.7.26 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
5.3创建并选择数据库
5.3.1创建数据库
mysql> CREATE DATABASE mitseek_cms;
Query OK, 1 row affected (0.03 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mitseek_cms |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
5.3.2选择数据库
mysql> USE mitseek_cms;
No connection. Trying to reconnect...
Connection id: 21
Current database: *** NONE ***
Database changed
5.3.3创建管理人员表
mysql> CREATE TABLE cms_admin(
-> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(10) NOT NULL UNIQUE COMMENT 'yonghuming',
-> password VARCHAR(32) NOT NULL COMMENT 'mima'
-> ) DEFAULT CHARSET=utf8;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 23
Current database: mitseek_cms
Query OK, 0 rows affected (0.04 sec)
📚 关键字解释
1. UNSIGNED - 无符号整数
id INT UNSIGNED
作用:只允许存储非负整数 (0 到 4,294,967,295)
对比:
INT:-2,147,483,648 到 2,147,483,647
INT UNSIGNED:0 到 4,294,967,295
适用场景:ID、年龄、数量等不会为负的数值
2. DEFAULT CHARSET=utf8 - 默认字符集
DEFAULT CHARSET=utf8
作用:设置表的默认字符编码为UTF-8
重要性:支持中文、日文、韩文等多国语言
现代推荐:使用 utf8mb4(完全支持emoji表情)
🎯 完整语句解析
CREATE TABLE cms_admin(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -- 无符号自增主键
name VARCHAR(10) NOT NULL UNIQUE COMMENT '用户名', -- 唯一用户名
password VARCHAR(32) NOT NULL COMMENT '密码' -- 密码字段
) DEFAULT CHARSET=utf8; -- UTF-8编码
各字段说明:
字段 类型 属性 说明
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 无符号自增主键
name VARCHAR(10) NOT NULL UNIQUE 非空唯一用户名
password VARCHAR(32) NOT NULL 非空密码
💡 改进建议
1. 使用更现代的字符集
CREATE TABLE cms_admin(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码' -- 增加长度用于加密哈希
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2. 安全增强版本
CREATE TABLE cms_admin(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', -- 增加长度
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希', -- 存储加密后的密码
email VARCHAR(100) COMMENT '邮箱',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
status TINYINT UNSIGNED DEFAULT 1 COMMENT '状态:1正常,0禁用'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';
3. 防止连接超时的配置
在MySQL配置文件中调整:
ini
[mysqld]
wait_timeout = 28800
interactive_timeout = 28800
max_allowed_packet = 256M
🛡️ 安全注意事项
密码存储安全
当前设计 password VARCHAR(32) 可能用于存储MD5哈希,但不推荐:
// 不安全的做法
$password = md5($_POST['password']);
// 推荐的做法 - 使用password_hash()
$password_hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
// 验证密码
if (password_verify($input_password, $stored_hash)) {
// 密码正确
}
📊 字符集对比
字符集 支持范围 推荐程度
utf8 基本多语言平面 ⭐⭐
utf8mb4 全部Unicode(包括emoji) ⭐⭐⭐⭐⭐
gbk 简体中文 ⭐
latin1 西欧语言 ⭐
🚀 总结
UNSIGNED:确保数值字段只存储正数,扩大正数范围
DEFAULT CHARSET=utf8:设置表级字符编码,确保中文正常存储
连接超时问题:可通过调整MySQL配置解决
最佳实践:在新项目中建议使用 utf8mb4 字符集和 password_hash() 进行密码加密。
5.3.4创建栏目表
mysql> CREATE TABLE cms_category(
-> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> pid INT UNSIGNED NOT NULL COMMENT 'fujiid',
-> name VARCHAR(15) NOT NULL COMMENT 'mingcheng',
-> sort INT NOT NULL COMMENT 'paixu'
-> ) DEFAULT CHARSET=utf8;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 25
Current database: mitseek_cms
Query OK, 0 rows affected (0.04 sec)
5.3.5创建文章表
mysql> CREATE TABLE cms_article(
-> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> cid INT UNSIGNED NOT NULL COMMENT '',
-> title VARCHAR(80) NOT NULL COMMENT '',
-> author VARCHAR(15) NOT NULL COMMENT '',
-> thumb VARCHAR(255) NOT NULL COMMENT '',
-> `show` ENUM('yes','no') NOT NULL DEFAULT 'yes' COMMENT '',
-> views INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '',
-> time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
-> content TEXT NOT NULL COMMENT '',
-> keywords VARCHAR(150) NOT NULL COMMENT '',
-> description VARCHAR(255) NOT NULL COMMENT ''
-> ) DEFAULT CHARSET=utf8;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 28
Current database: mitseek_cms
Query OK, 0 rows affected (0.03 sec)
我们逐行解释这些代码:
is_show ENUM('yes','no') NOT NULL DEFAULT 'yes' COMMENT '是否发布',
字段名:is_show
数据类型:ENUM('yes','no'),表示枚举类型,只能取 'yes' 或 'no' 两个值之一。
约束:NOT NULL 表示该字段不能为NULL。
默认值:DEFAULT 'yes' 表示如果没有提供值,则默认为 'yes'。
注释:COMMENT '是否发布' 表示该字段的注释是“是否发布”,即用这个字段来表示文章是否发布。
views INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '点击量',
字段名:views
数据类型:INT UNSIGNED,无符号整数,即非负整数。
约束:NOT NULL 表示不能为NULL。
默认值:DEFAULT 0 表示如果没有提供值,则默认为0。
注释:COMMENT '点击量' 表示该字段记录文章的点击量。
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
字段名:created_time
数据类型:TIMESTAMP,时间戳类型,用于记录日期和时间。
约束:NOT NULL 表示不能为NULL。
默认值:DEFAULT CURRENT_TIMESTAMP 表示如果没有提供值,则使用当前的时间戳(即当前时间)。
注释:COMMENT '创建时间' 表示该字段记录文章的创建时间。
content TEXT NOT NULL COMMENT '内容',
字段名:content
数据类型:TEXT,长文本类型,用于存储大量文本内容(如文章正文)。
约束:NOT NULL 表示不能为NULL。
注释:COMMENT '内容' 表示该字段存储文章的内容。
总结:
这些代码定义了文章表的几个字段,分别用于控制文章发布状态、记录点击量、记录创建时间和存储文章内容。
每个字段都设置了适当的数据类型、约束和默认值,以确保数据的完整性和合理性。
我来详细解释这几行代码,它们定义了文章表的核心字段:
📝 字段逐行详解
- 发布状态字段
sql
is_show ENUM('yes','no') NOT NULL DEFAULT 'yes' COMMENT '是否发布',
详细解析:
is_show - 字段名称,表示"是否显示"
ENUM('yes','no') - 枚举类型,只允许存储预设的值
只能取 'yes' 或 'no' 两个值
比 VARCHAR 更节省空间,数据更规范
NOT NULL - 该字段不能为空
DEFAULT 'yes' - 默认值为 'yes'(新文章默认发布)
COMMENT '是否发布' - 字段注释,说明用途
应用场景:
php
// 发布文章
UPDATE cms_article SET is_show = 'yes' WHERE id = 1;
// 下架文章(存为草稿)
UPDATE cms_article SET is_show = 'no' WHERE id = 1;
// 查询已发布的文章
SELECT * FROM cms_article WHERE is_show = 'yes';
- 点击量字段
sql
views INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '点击量',
详细解析:
views - 字段名称,表示"浏览量/点击量"
INT UNSIGNED - 无符号整数
范围:0 到 4,294,967,295
不可能有负的点击量,所以用无符号
NOT NULL - 该字段不能为空
DEFAULT 0 - 默认值为 0(新文章初始点击量为0)
COMMENT '点击量' - 字段注释
应用场景:
php
// 每次访问增加点击量
UPDATE cms_article SET views = views + 1 WHERE id = 1;
// 查询热门文章(按点击量排序)
SELECT * FROM cms_article ORDER BY views DESC LIMIT 10;
// 获取文章点击量
SELECT views FROM cms_article WHERE id = 1;
- 创建时间字段
sql
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
详细解析:
created_time - 字段名称,表示"创建时间"
TIMESTAMP - 时间戳类型
存储格式:YYYY-MM-DD HH:MM:SS
范围:'1970-01-01 00:00:01' 到 '2038-01-19 03:14:07'
NOT NULL - 该字段不能为空
DEFAULT CURRENT_TIMESTAMP - 默认值为当前时间
插入新记录时自动设置为服务器当前时间
COMMENT '创建时间' - 字段注释
应用场景:
php
// 插入新文章时自动记录时间(无需手动设置)
INSERT INTO cms_article (title, author, content)
VALUES ('文章标题', '作者', '内容');
-- created_time 会自动设置为当前时间
// 按时间排序查询
SELECT * FROM cms_article ORDER BY created_time DESC;
// 查询最近一周的文章
SELECT * FROM cms_article
WHERE created_time >= DATE_SUB(NOW(), INTERVAL 7 DAY);
- 内容字段
sql
content TEXT NOT NULL COMMENT '内容',
详细解析:
content - 字段名称,表示"文章内容"
TEXT - 文本类型
最大存储约 65,535 个字符(64KB)
适合存储文章正文、富文本内容
NOT NULL - 该字段不能为空(每篇文章必须有内容)
COMMENT '内容' - 字段注释
应用场景:
php
// 存储文章内容(支持长文本)
$content = "这是一篇很长的文章内容...
包含HTML标签等";
// 插入文章
INSERT INTO cms_article (title, content) VALUES ('标题', '$content');
// 查询文章内容
SELECT content FROM cms_article WHERE id = 1;
🎯 字段设计思想总结
字段 设计思想 实际用途
is_show 状态控制 - 二元选择,确保数据一致性 文章上下架管理
views 计数统计 - 无符号整数,从0开始 流量分析,热门排行
created_time 时间记录 - 自动记录,不可篡改 时间排序,归档管理
content 内容存储 - 大容量文本,必须存在 存储文章主体内容
💡 使用示例
完整的文章操作流程
sql
-- 1. 创建文章(自动设置发布时间和默认值)
INSERT INTO cms_article (cid, title, author, content, keywords, description)
VALUES (1, 'PHP教程', '张三', '详细的PHP学习内容...', 'PHP,编程', 'PHP入门教程');
-- 2. 查询文章列表(显示已发布的)
SELECT id, title, author, views, created_time
FROM cms_article
WHERE is_show = 'yes'
ORDER BY created_time DESC;
-- 3. 更新点击量
UPDATE cms_article SET views = views + 1 WHERE id = 1;
-- 4. 下架文章
UPDATE cms_article SET is_show = 'no' WHERE id = 1;