桐木舟学英语人工智能

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 160|回复: 0

服务器知识网站基础 建站基础用数据库实现PHP编程 及常见字符编码的选择 UTF8和UTF8MB4区别 网站视频教程 如何建站视频号创作内容 桐木舟可视化学习

[复制链接]

70

主题

7

回帖

282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
282
发表于 2024-10-4 22:54:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
使用数据库实现PHP编程网站的原理及常见字符编码的选择
桐木舟专业知识简单通俗讲解。

一、PHP编程与数据库的关系
在现代网站开发中,PHP 是一种常用的服务端编程语言,它主要用于动态生成网页内容。而数据库则是存储和管理网站数据的核心组件。在一个 PHP 驱动的网站中,PHP 通过与数据库交互来处理用户数据、动态展示内容和管理后台功能。

PHP与数据库的交互原理
当用户访问一个 PHP 网站时,以下是基本的工作流程:
  • 用户请求:用户通过浏览器发出请求,访问特定的网页或提交表单。
  • PHP处理请求:服务器上的 PHP 脚本根据用户的请求,决定是否需要从数据库获取数据。
  • 数据库查询:如果需要数据,PHP 脚本会通过 SQL(Structured Query Language)向数据库发送查询请求。
  • 数据返回:数据库根据查询返回相关数据,PHP 脚本对数据进行处理。
  • 生成动态页面:PHP 将数据整合到 HTML 中,生成用户在浏览器中看到的动态网页。
  • 存储用户数据:如果用户提交表单(例如注册、评论),PHP 脚本会将用户的数据保存到数据库中。
数据库选择
在 PHP 网站开发中,最常用的数据库系统之一是 MySQL(或其分支 MariaDB)。PHP 通过扩展(如 mysqli 或 PDO)与 MySQL 进行通信。在开始开发之前,需要为网站创建一个数据库,它将用于存储网站的所有数据,例如用户信息、产品列表、订单、评论等。

二、字符编码在数据库中的作用
当我们创建数据库时,选择适当的字符编码至关重要。字符编码决定了数据库如何存储和解释数据,特别是处理多语言或特殊字符时,选择不当的编码可能导致数据存储错误或显示异常。
常见的字符编码
在数据库中,字符编码有多种选择,以下是常见的编码类型及其特点:
1. UTF-8 (utf8)
  • 简介:UTF-8 是一种广泛使用的字符编码,它能够表示世界上大多数文字,包括拉丁字母、中文、阿拉伯文等。
  • 字节数:每个字符使用 1 到 3 字节存储。
  • 限制:MySQL 的 utf8 实现实际上是一个不完整的 UTF-8 版本,只能表示最多 3 个字节的字符,这意味着它无法处理 4 字节的字符,例如 emoji 或某些古文字。
2. UTF-8 (utf8mb4)
  • 简介:utf8mb4 是 MySQL 中的完整 UTF-8 实现,能够支持最多 4 个字节的字符。因此,能够存储更多的字符集,包括 emoji、特殊符号等。
  • 字节数:每个字符最多使用 4 字节存储。
  • 优势:utf8mb4 是目前最兼容的字符集,建议优先使用它,以避免字符丢失的问题。
3. GBK 和 GB2312
  • 简介:GBK 和 GB2312 是中国国家标准的字符集,专门用于简体中文的编码。GB2312 是早期的字符集,GBK 是 GB2312 的扩展,能够支持更多中文字符。
  • 使用场景:这些编码在处理简体中文时比较高效,但对于多语言或其他字符集的支持较差。
  • 字节数:每个字符使用 2 个字节存储。
4. Big5
  • 简介:Big5 是台湾和香港地区使用的一种字符编码,主要用于繁体中文的表示。
  • 字节数:每个字符使用 2 个字节存储。
  • 局限性:与 GBK 类似,Big5 主要用于中文,跨语言支持不佳。
5. Latin1 (ISO-8859-1)
  • 简介:Latin1 是一种较老的编码,主要用于表示西欧语言的字符集。它是 MySQL 的默认编码之一。
  • 字节数:每个字符使用 1 个字节存储。
  • 局限性:只能存储 256 个字符,无法处理非西欧字符集(如中文、阿拉伯文)。对于全球化网站,latin1 显然是不够的。
6. 其他字符集
  • Shift-JIS:日本使用的一种字符编码,用于日文处理。
  • EUC-KR:用于处理韩文的字符集。

选择合适的编码

在选择数据库编码时,应根据网站的需求进行选择。如果网站只处理特定的语言(如中文、英文),可以选择简化的编码如 GBK 或 Latin1;但如果网站需要支持多语言或包含特殊字符(如表情符号),utf8mb4 是最佳选择。它不仅能处理全球大多数语言,还能存储 4 字节的字符,避免未来扩展时遇到问题。

三、数据库迁移中的编码问题
在网站运营过程中,可能需要迁移数据库。在迁移时,字符编码的一致性非常重要。例如:
  • 从 utf8 迁移到 utf8mb4:由于 utf8mb4 完全兼容 utf8,因此从 utf8 迁移到 utf8mb4 通常不会有问题。utf8mb4 能处理更多字符,可以安全地存储和显示所有 utf8 数据。
  • 从 utf8mb4 迁移到 utf8:这是有风险的。如果原始数据库中包含 4 字节字符(如 emoji),这些字符在 utf8 中无法存储,可能会导致数据丢失或显示错误。
因此,在建立数据库时,建议尽量使用 utf8mb4 以确保未来的兼容性和扩展性。

四、总结
在 PHP 网站开发中,数据库是数据存储和管理的核心,而字符编码的选择对网站的多语言支持、字符处理能力有着直接影响。utf8mb4 是目前最广泛推荐的字符集,它能够兼容 utf8,并提供更强的字符存储能力。在创建新网站和迁移现有网站时,优先选择 utf8mb4,可以有效避免字符集不兼容导致的潜在问题。
选择合适的数据库和编码方案,将为你的网站提供更好的用户体验和全球化支持。

选择utf8还是utf8mb4?
utf8mb4 编码兼容 utf8,但兼容性是单向的。
具体来说:
  • utf8mb4 向后兼容 utf8
    • utf8mb4 是 utf8 的扩展版本,支持最多 4 字节的字符,而 utf8 仅支持 3 字节的字符。因此,所有能存储在 utf8 中的字符也能存储在 utf8mb4 中,utf8mb4 可以向后兼容 utf8。
  • 从 utf8 迁移到 utf8mb4
    • 如果你从 utf8 编码的数据库迁移到 utf8mb4,通常不会遇到问题,因为 utf8mb4 可以处理所有 utf8 字符。
  • 从 utf8mb4 迁移到 utf8
    • 如果你有 4 字节的字符(如 emoji 或其他特殊字符),那么它们在迁移到 utf8 数据库时会出现问题,因为 utf8 无法存储这些字符。这个过程会导致数据丢失或显示错误。
总结:
  • utf8mb4 可以兼容 utf8,但是从 utf8mb4 到 utf8 可能会导致部分数据丢失。因此,如果没有特殊需求,建议直接使用 utf8mb4,它可以处理更多类型的字符,并且兼容 utf8。

mysqli 或 PDO
当我们说“PHP 通过扩展(如 mysqli 或 PDO)与 MySQL 进行通信”时,意思是 PHP 需要使用特定的库(即扩展)来连接和与 MySQL 数据库进行数据交换。
具体解释:
  • PHP 扩展:扩展是 PHP 提供的额外功能模块,用来增强 PHP 的功能。为了让 PHP 能够与 MySQL 数据库交互,我们需要使用专门的扩展库来执行数据库的操作,例如查询、插入、更新等。最常用的两个 PHP 扩展用于与 MySQL 数据库通信:
    • mysqli(MySQL Improved Extension):这是 MySQL 的改进版扩展,提供了面向过程和面向对象的接口,用于连接和操作 MySQL 数据库。
    • PDO(PHP Data Objects):这是一个通用的数据库访问接口,它不仅支持 MySQL,还支持多种其他数据库系统(如 PostgreSQL、SQLite 等)。PDO 提供了一致的 API,可以让开发者通过同一套代码与不同的数据库系统进行交互。
  • 通信的过程
    • 建立连接:PHP 使用 mysqli 或 PDO 来建立与 MySQL 数据库的连接。连接成功后,PHP 就能够与数据库交互。
    • 发送 SQL 查询:通过 PHP 代码,你可以向数据库发送 SQL 查询(如 SELECT、INSERT、UPDATE、DELETE 等),这些查询由 PHP 扩展处理,并通过 MySQL 服务器执行。
    • 接收结果:数据库执行查询后,会返回查询结果给 PHP 扩展。PHP 程序可以通过 mysqli 或 PDO 获取查询结果并在网页上展示给用户。

举例
使用 mysqli 连接 MySQL 数据库
$mysqli = new mysqli("localhost", "username", "password", "database");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

// 发送 SQL 查询
$result = $mysqli->query("SELECT * FROM users");

// 处理结果
while ($row = $result->fetch_assoc()) {
    echo "User: " . $row["name"] . "<br>";
}

$mysqli->close();

使用 PDO 连接 MySQL 数据库
try {
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 发送 SQL 查询
    $stmt = $pdo->query("SELECT * FROM users");

    // 处理结果
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "User: " . $row["name"] . "<br>";
    }

} catch (PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}

总结:mysqli 和 PDO 都是 PHP 用于与 MySQL 数据库通信的工具,负责处理 PHP 与数据库之间的连接、查询和数据交换。通过这些扩展,PHP 能够灵活地管理和操作数据库中的数据。

专业知识简单通俗化
这些内容还是有点高深。如果我们把上述这些内容做成视频,我相信很多观众仍然是不懂。桐木舟网站,让专业的知识简单通俗化,让更多的学习爱好者学到真正的知识。桐木舟不妨这样更简单形象地理解。

可以把网站比作一个空房子,而数据库就是用来往房子里添加内容的地方,比如家具、物品等。当你访问网站时,数据库中的内容会被取出来,展示给你看。

现在来解释一下 MySQLmysqliPDO,我们继续用房子的比喻:
  • MySQL:这就是存放内容的仓库(或者说储物间)。所有你想放在网站里的数据(比如用户信息、文章、图片链接等)都存放在 MySQL 这个数据库系统里。它负责整理、存储和提供这些数据。
  • mysqliPDO:这两个是搬运工。他们负责把仓库里的东西搬到房子里(即网站上展示)。但他们有不同的方式和风格。
    • mysqli:这是一种专门为 MySQL 仓库设计的搬运工。他非常熟悉 MySQL 的内部结构,知道怎么最快地找到东西。他既可以按传统的方式工作,也可以按现代的方式工作,比较灵活。
    • PDO:这是一种通用搬运工,不仅能搬运 MySQL 仓库的东西,还能去别的仓库(比如 PostgreSQL、SQLite 等)取货。他工作方式更统一,所以如果以后你需要换个仓库,他也能轻松适应。
它们之间的关系:
  • MySQL 是仓库,存储所有数据。
  • mysqliPDO 是用来把数据从 MySQL(或其他数据库)取出来的工具。你在编程的时候可以选择使用 mysqli 还是 PDO,但最终它们都帮助你从 MySQL 取数据并展示在你的网站上。
通过这个比喻,你可以把它们之间的关系简单理解为:MySQL 是存储数据的地方,mysqli 和 PDO 是拿到数据并展示出来的搬运工或工具。

更多问题
有同学问:在建立数据库的时候,会不会给出一个选择,是选择mysql 还是 mysqli?
回答:在建立数据库的时候,其实不会让你选择 MySQL 还是 mysqli。因为 MySQL 是数据库系统,而 mysqli 是连接和操作这个数据库的工具,它们不是同一个类型的东西,所以不会让你在这两者之间做选择。
如何理解:
  • MySQL 是一个数据库系统,用来存储和管理数据。你在网站后台或者服务器上创建数据库时,通常会选择 MySQL(或者其他数据库系统,比如 PostgreSQL)。
  • mysqliPDO 是编程时用来与 MySQL 数据库交互的工具。也就是说,当你在写 PHP 代码时,需要选择用 mysqli 还是 PDO 来连接和操作已经创建好的 MySQL 数据库。
举个例子:
  • 当你通过 cPanel、phpMyAdmin 等工具创建数据库时,你创建的是 MySQL 数据库,它是用来存储数据的。
  • 当你编写 PHP 代码来管理数据库中的数据时,你可以选择用 mysqliPDO 来连接和操作这个 MySQL 数据库。
因此,创建数据库和选择 mysqli 或 PDO 是两个不同的步骤。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|桐木舟论坛

GMT+8, 2024-12-4 00:36 , Processed in 0.040956 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表