php - PHP 中正确 utf-8 编码的性能成本

标签 php mysql encoding utf-8 utf8mb4

在处理传入数据时,我未能找到绝对的最佳实践。其他一些线程有有用的信息,但我仍然有很多未解答的问题。我唯一确定的是 UTF-8 是唯一的现代标准。我的问题涉及 php 的使用,但也许有一些通用用途可以适用于其他语言。我愿意尊重公认的标准,假设性能成本可以忽略不计。 请随意指出基准来证明某些特定选择的合理性。

1) 您真的应该检查每个传入数据(api、get、post...),进行操作或存储吗?在 websocket 和 Rest API 的特定情况下,我看不出明智的性能...对每个传入数据和变量进行持续编码字符串检查,这真的是良好实践应该做的吗? 如果是,有什么方法不会占用服务器资源太多? 我见过它被用来确定变量是否为 UTF-8:

if(preg_match('!!u', $data))
{
   echo 'this is utf-8'; //use the var
}
else 
{
   echo 'definitely not utf-8'; //do something else
}

一直这样做感觉有点矫枉过正。这个函数不应该是 mb_ereg_match

2) 假设您应该始终检查传入的数据,可以使用什么可行的函数将数据转换为 UTF-8?

3) 从数据库或 get/post 获取的日期、整数、小数怎么样...它们与 UTF-8 有什么关系吗?您是否必须将它们编码为在将它们发送到 mysql 之前使用 UTF-8 吗? 至于换行符,它们在 utf-8 中“显示”为可见换行符,还是始终显示为 \r\n在 utf-8 文本中? phpMyAdmin 替换 \r\n 是否有原因?在这种情况下,通过界面中可见的换行符?

4) 对于数组(尤其是那些要编码为 json 的数组)有同样的问题:

  • 数组键应该编码为 utf-8 吗?
  • key 内的数据是否应该编码为 utf-8?
  • 所有变量数组本身都应该编码为 utf-8 吗?

5) 我们是否应该学习使用多字节版本的字符串函数而不是通常的非多字节字符串函数,如http://php.net/manual/en/ref.mbstring.php所示?这意味着获取所有键入的代码,并替换该函数以便于重用......

6) 当使用 utf8mb4_unicode 时(或其变体)在 mysql 列上,最大 VARCHAR() 是多少?尺寸可以吗?显然255不是一个选择。当该字段是索引的一部分时,我也对性能持谨慎态度。

7) 始终关注足够好的性能以应用最佳实践,您能否确认(或更正)以下是在 php/mysql 环境中处理编码的正确方法,或者如果缺少某个元素;始终保持软件最新状态并未列出,因为这是常识。

  • Mysql:使用utf8mb4_unicode_520_ci作为默认排序规则,并且在可以包含数字、日期或时间以外的任何内容的每一列上。
  • 网页:使用<meta charset="UTF-8">默认情况下。
  • PHP 服务器:使用扩展 mbstring并启用其多字节支持参数。 default_charset=UTF-8在 php.ini 中。
  • PHP 脚本:使用 mb_internal_encoding('UTF-8');接下来是 mb_http_output('UTF-8');在每个 .php 页面上,在 php 标签 <?php 之后的最开始处。 (这不能在php中设置为默认吗?)
  • PDO:使用参数 charset=utf8mb4创建新的 PDO 对象时。
  • 文本编辑器:如果使用 Notepad++,则从一开始就对每个页面使用“以 UTF-8 编码”参数,无论扩展名如何。

希望这个线程成为学习 php/sql 环境中最佳编码实践的最后一个也是最全面的地方,并且具有可接受的性能。

最佳答案

我要说的一切都是次要的:UTF-8 all the way through

  1. 您应该始终事先了解输入的编码,要么通过遵循上述规定,要么因为您已经向外部数据提供商提供了标准,或者从外部数据提供商那里获得了标准。猜测编码是一个坏主意,尝试检测编码也是一个坏主意。这包括使用像 mb_detect_encoding() 这样的函数,因为没有好的方法来实际检测编码,并且最终它最多只是一个有根据的猜测。

  2. mb_convert_encoding()由于 #1 而指定了输入和输出编码。

  3. 如果您的输入是字符串,您应该按照上述方式处理它。如果它是一个数字,那么它或多或少是通用的。这种情况存在一些边缘情况,但任何人都不太可能遇到这些情况而不陷入更深的麻烦。

  4. 数组是一种复杂的类型,如果没有某种形式的中间编码,就无法在系统之间传输,并且该编码的规则将定义如何处理字符串数据以及数据本身的字符串编码。例如:Read the JSON spec .

  5. 是的。如果您使用多字节编码,则应在适用的情况下使用多字节函数。

  6. IIRC 这取决于页面大小和列中数据的总体大小,因为所有数据都需要适合单个页面。您可以使用 TEXT 类型来弥补这一点,因为它们从技术上讲是存储在页外的,但它们也有自己的权衡。这本身就是一个完整的问题,可能在其他地方有答案。

  7. UTF-8 all the way through

关于php - PHP 中正确 utf-8 编码的性能成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054825/

相关文章:

mysql - 如何正确地将索引应用到我的 mysql 数据库

c# - LINQ:为什么我的 IQueryable.Intersect 抛出异常

python - Google Cloud SQL - 操作系统环境未设置为 Google App Engine

java - java从哪里提取默认编码?

java - java中编码被误解

php - gearman doBackground() 不使用 php

php - memcached.hash 策略有什么用?

php - 如何提取 Google Analytics 事件中的页面名称

php - 为什么我不能用 uwamp 连接到 mysql,

python - 在 Python 中使用编码进行防弹工作