2017-09-22 72 views
1

enter image description herePHP - strlen的行为很奇怪,同样的事情 - 不同的结果,洛尔号码?

tresctresc_pelna

相同类型,相同的内容

enter image description here

The same content876字符总数。

通过...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成千上万...什么...如何?为什么?

+0

这些字段的排序规则是什么? – tkausl

+0

@tkausl都是'utf8_polish_ci'并且两者的内容完全相同 –

+0

字符集不会被手动更改吗?即,它们都是'utf8'? – tkausl

回答

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浏览器,它呈现为信。

0

LENGTHCHAR_LENGTH之间的差异可以解释下,1.2倍于大多数欧洲语言文本的比例将不能解释3248:876,这是近4倍。

或许这些是答案的一部分:

  • ヶ辆,如&oacute;其服用8个字节来表示一个2字节UTF8字符。我们无法看到其中一个是否有<,另一个是&lt;
  • 格式标签,如<p>。再次,可能&lt;p&gt;

但是,这还不足以解释近4倍。例如,一个简单的字母(如a)将是一个字节,无论它是如何编码的。请提供十六进制的小样样品。