为什么Unicode数据以数字形式存储在mysql数据库中

时间:2013-03-31 06:14:57

标签: php mysql unicode

我有以下

$html = <div>ياں ان کي پرائيويٹ ليمٹڈ کمپنياں ہيں</div> 

但它存储在mysql数据库中,格式如下

&#1578;&#1608; &#1610;&#1729; &#1575;&#1587;&#1605;&#1576;
&#1604;&#1610; &#1605;&#1610;&#1722; &#1594;&#1585;
&#1610;&#1576; &#1705;&#1608; &#1570;&#1606;&#1746; 
&#1606;&#1729;&#1610;&#1722;

实际上,当我从mysql数据库中检索数据并在网页上显示它时,它显示正确。 但我想知道它是存储在数据库中的unicode的标准格式,还是unicode数据应该按原样存储(ياںانکيپرائيويٹليمٹڈکمپنياںںيں)

4 个答案:

答案 0 :(得分:2)

在数据库中存储unicode时......

首先,您的数据库必须设置为'utf-general',这不是默认值。使用MySQL,您必须将表格设置为utf格式,将各个列设置为utf。除此之外,您必须确保您的连接是utf-8连接,但这样做会根据您将unicode文本存储到数据库中的方法而有所不同。

要设置连接的字符集,如果您使用的是Mysqli,则可以这样做:

$c->set_charset('utf8'); where $c is a Mysqli connection.

但是,你必须改变你之前说过的数据库字符集。

编辑:老实说,我认为你的存储方式并不重要,尽管我将它存储为实际的unicode字符,因为如果某些用户输入'&amp; #1610;”在数据库中,它不会被错误地检索为unicode字符。

编辑:这是一个很好的例子,如果你删除&amp;之间的空格和#1610;在我的回答中,它将被错误地从服务器中检测为unicode字符,除非您希望用户能够使用类似的代码创建unicode字符。

不是一个完美的例子,因为stackoverflow是故意这样做的,它实际上并不像那样,但概念是一样的。

答案 1 :(得分:1)

数据字符集有问题。我不知道到底是什么。 这是解决方法。在插入/更新之前执行此操作:

$str = html_entity_decode($str, ENT_COMPAT, 'UTF-8');

答案 2 :(得分:0)

对我来说,这是HTML编码,PHP编码unicode的方式,以确保它在网页上显示OK,无论页面编码。

您是否尝试使用MySQL Workbench获取相同的数据?

答案 3 :(得分:0)

似乎PHP代码htmlentities中的某个地方正在文本上使用 - 而不是htmlspecialchars。与htmlentities的区别在于它以您在那里看到的形式转义了许多非ASCII字符。然后,结果存储在数据库中。这不是MySQL的做法。

从理论上讲,这不是必要的。如果正确设置页面的字符集,则可以输出普通字符。例如,使用UTF-8,使用header('Content-Type: text/html; charset=utf-8');<meta http-equiv="Content-Type" value="text/html; charset=utf-8">

如果您直接查看数据库 (虽然它会在网页上显示正常),这可能会导致乱码(mojibake),除非您还确保数据库的字符集设置正确。这意味着表列,表,数据库和连接字符集可能都是utf8mb4_general_binutf8_general_bin(或..._general_ci)。在实践中,让它全部工作可能有点令人讨厌。如果您没有编写此代码,那么代码库中的某个人可能会在某个时候决定使用htmlentities将奇异字符转换为ASCII HTML实体,以使存储更容易。或者,当merer htmlentities没问题时,人们有时会习惯htmlspecialchars