首页 > 解决方案 > PHP 中正确 utf-8 编码的性能成本

问题描述

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

1)你真的应该检查每个传入的数据(apis、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\nutf-8 文本?在这种情况下,是否有理由将 phpMyAdmin 替换\r\n为界面中的可见换行符?

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

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

6)utf8mb4_unicode在 mysql 列上使用(或它的变体)时,VARCHAR()可能的最大大小是多少?显然 255 不是一个选项。当该字段是索引的一部分时,我也对性能保持警惕。

7)始终考虑到足够好的性能以应用最佳实践,您能否确认(或纠正)以下是在 php/mysql 环境中处理编码的正确方法,或者是否缺少元素;始终与软件保持同步并未列出,因为这是常识。

希望这个线程成为在 php/sql 环境中以可接受的性能了解最佳编码实践的最后也是最全面的地方。

标签: phpmysqlencodingutf-8utf8mb4

解决方案


我要说的一切都是次要的:一直到UTF-8

  1. 您应该始终事先知道输入的编码,无论是遵循上述内容,还是因为您已经向外部数据提供者提供了标准,或者从外部数据提供者那里获得了标准。猜测编码是个坏主意,因此尝试检测编码也是如此。这包括使用这样的函数,因为没有真正检测编码的好方法,而且归根结底,它充其量mb_detect_encoding()只是一个有根据的猜测。

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

  3. 如果你的输入是一个字符串,你应该按照上面的方法处理它。如果它是一个数字,它或多或少是普遍的。这有一些极端情况,但如果没有更深的麻烦,任何人都不太可能遇到它们。

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

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

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

  7. 一直到UTF-8


推荐阅读