PHP - Strlen行为非常奇怪,同样的事情 - 不同的结果,哈哈数字?

时间:2017-09-22 18:43:33

标签: php mysql unicode utf-8 strlen

enter image description here

tresctresc_pelna

相同类型,相同内容

enter image description here

The same content。总共876个字符。

取自...AS data_dodania, p.data_modyfikacji, p.tresc, p.tresc_pelna, p.url, count(k.id)...

的数据库

Echeon到<?= strlen($post['tresc_pelna']).'----'.strlen($post['tresc']) ?>

的网站

猜猜是什么?

这是输出

876----3248

什么......?

我完全不知道这里发生了什么xD。

请帮助伙伴:D

两个字段utf8_polish_ci和完全相同的内容

<?= mb_strlen($post['tresc_pelna'], 'utf-8').'----'.mb_strlen($post['tresc'], 'utf-8') ?>

结果还不错。

tresc超过3千...什么......怎么样?为什么?

2 个答案:

答案 0 :(得分:0)

MySQL有两个内置函数,用于确定可变长度项的长度。一个计算不同的unicode字符is called CHAR_LENGTH()。另一个计算八位字节(字节),并且是called LENGTH()

在PHP中,strlen()计算八位字节,例如MySQL LENGTH()。许多unicode字符串,特别是那些在utf8中编码的字符串,每个字符的八位字节数可变。您可以use grapheme_strlen()来计算这些。

我发现有时候SELECT HEX(unicode_column)有必要弄清楚MySQL中存在的问题。只需获取列数据就会使您受到使用的MySQL客户端的字符呈现的支配,并且可能会非常混乱。

您的数据库列也可以在其中授权数据(例如字符串&eacute;而不是Unicode字符é。如果该实体文本被发送到Web浏览器,它呈现为字母。

答案 1 :(得分:0)

LENGTHCHAR_LENGTH之间的差异可以解释大多数欧洲文字的比率低于1.2倍。它不会解释3248:876,差不多是4倍。

也许这些都是答案的一部分:

  • Htmlentities,例如&oacute;,它占用8个字节来表示2字节的utf8字符。我们无法看到其中一个是<而另一个是&lt;
  • 格式化标记,例如<p>。同样,可能&lt;p&gt;

尽管如此,这还不足以解释近4倍。例如,一个简单的字母,如a,将是一个字节,无论它是如何编码的。请为样本提供HEX。