为PHP选择MySQL编码:带解决方案的教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 MySQL 中的排序规则问题至今仍有意义?



如果你曾经为 PHP 应用程序配置过 MySQL 数据库,很可能在 phpMyAdmin 或配置文件中见过诸如 utf8mb4_general_ci 或 latin1_swedish_ci 这样令人困惑的术语。问题"在 MySQL 与 PHP 搭配使用时,最佳的排序规则是什么?"是 Stack Overflow 上最热门的问题之一,这并非没有原因。



选择错误的编码可能会导致俄文字母变成乱码、数据排序出现错误,甚至表情符号(没错,就是那些笑脸)根本无法保存到数据库中。在本教程中,我们将彻底弄清楚现代 PHP 项目应该选择哪种排序规则,并且我会一步步向你展示配置代码。



什么是 MySQL 中的排序规则?为什么它对 PHP 如此重要?



排序规则是 MySQL 用于比较字符串的一套规则。它决定了:



  • 大小写不敏感性——搜索时 'A' 是否等于 'a'。
  • 排序顺序——字符串在查询结果中如何排列。
  • 字符支持——可以存储哪些特定字符(包括西里尔字母、象形文字、表情符号)。


这对 PHP 开发者来说至关重要,因为:

  • 你需要处理用户输入(表单、评论、文章)。
  • 现代应用程序必须支持 Unicode(表情符号、特殊字符)。
  • 不正确的排序规则会破坏 WHERE 条件中的字符串比较。


排序规则的主要类型:热门选项详解



1. utf8_general_ci——久经考验的旧标准

很长一段时间里,这曾是事实上的标准。它速度很快,但有一个严重缺点:不支持基本多文种平面(BMP)以外的字符。这意味着表情符号 🚀、古代语言字符以及罕见的中文象形文字将无法保存。此外,比较规则也过于简化(例如,在德语中,'ß' 可能无法匹配 'ss')。



2. utf8mb4_general_ci——改进版

这里的 mb4 代表"多字节 4"——即支持 4 字节字符。这已经解决了表情符号的问题。但是,比较规则依然简化。如果你对语言精确度要求不高(例如,对于普通博客来说),这是一个不错的选择。



3. utf8mb4_unicode_ci——黄金标准(我的选择)

这是大多数现代 PHP 项目的最佳排序规则。它使用了 Unicode 排序算法(UCA),能够:

  • 正确处理西里尔字母、拉丁字母以及亚洲语言。
  • 正确按字母顺序排序字符串(例如,'ё' 和 'е' 会相邻,而不是分散在不同的位置)。
  • 支持表情符号和所有 Unicode 字符。

唯一的缺点是它比 general_ci 稍慢,但在 99% 的情况下,这种差异是察觉不到的。



4. utf8mb4_unicode_520_ci 和 utf8mb4_0900_ai_ci——最新版本

在 MySQL 8.0 中出现了改进的选项。utf8mb4_0900_ai_ci 是基于 Unicode 9.0 的最现代化标准。它更加精确,但需要 MySQL 8.0+。如果你的托管环境支持它,请使用这个。对于较旧的版本(MySQL 5.7 及以下),请使用 utf8mb4_unicode_ci。



分步教程:为 PHP 项目配置排序规则



现在进入实践环节。我将向你展示如何正确配置 MySQL 连接,使你的 PHP 应用程序能够与 utf8mb4_unicode_ci 协同工作。



步骤 1:为数据库和表选择编码

在创建数据库时明确指定编码。你可以通过 SQL 或 phpMyAdmin 来执行此操作:



CREATE DATABASE my_database    CHARAC

博客

书籍推荐