在mysql数据库中存储撇号,感叹号等

问题描述:

我从latin1更改为utf8。虽然各种文本都显示正常,但我注意到非英文字符作为奇怪的符号存储在数据库中。我花了一天时间试图解决这个问题,最后现在非英文字符在数据库中显示为非英文字符,并在浏览器中显示相同的内容。但是我注意到,我看到撇号存储为',感叹号存储为!。这是正常的,还是应该显示为'和!在数据库中呢?如果是这样,我需要做些什么才能解决这个问题?在mysql数据库中存储撇号,感叹号等

+1

你是如何改变字符集的?使用[转换为字符集](http://dev.mysql.com/doc/refman/5.1/en/alter-table.html#id2295176)或其他?你是如何检查“非英文”字符是否被奇怪地存储的?你是如何改变数据库中的这些角色的?使用'htmlspecialchars' /'htmlentities'? – outis 2010-05-09 05:26:18

+0

我用phpmyadmin手动更改了数据库,几个表和列。这是一种乏味,然后我用这个脚本来做其余的事情: http://*.com/questions/105572/a-script-to-change-all-tables-and-fields-to-the- utf-8-bin-collat​​ion-in-mysql – rein 2010-05-09 14:58:51

这实际上取决于您打算如何处理数据库的内容。如果你的不变是“数据库的内容被消毒了,并且可以直接放在网页上而不需要进一步的验证/消毒”,那么就有& amp;和数据库中的其他html实体非常有意义。另一方面,如果您的数据库仅存储原始原始数据,并且您打算对其进行处理并对其进行处理,则在将其显示为HTML代码之前,您应该将这些实体替换为使用UTF编码的原始字符-8。所以,这实际上取决于你如何解释你的数据库内容。

+0

该应用程序是付费的论坛软件脚本。在这种情况下,你认为有必要存储这些实体吗? – rein 2010-05-09 15:08:28

&#XX;表格为HTML character entities,这意味着您通过函数(如PHP的htmlspecialcharshtmlentities)传递了存储在数据库中的值。如果这些值是在HTML文档(或者任何HTML处理器,不管它们是什么)中处理的,它们应该显示正常。除此之外,他们不会。

这意味着您可能不希望将它们编码为HTML实体。您可以使用与您对其进行编码的函数(例如html_entity_decode)的函数对应的方式将值返回,该函数应该将参数转换为要编码的编码。完成之后,请检查一些以前存在问题的条目,确保使用正确的编码查看它们。

如果您仍然遇到问题,那么存储值应该使用的编码与实际使用的值之间不匹配。你必须弄清楚他们实际使用的是什么,然后将它们从数据库中拉出来,然后将它们转换为目标编码,然后重新插入它们,或者用它们实际使用的编码重新插入它们。与后者类似,将列转换为BLOB,然后更改列字符集,然后将列类型更改回文本类型,然后直接将列转换为所需的字符编码。这个难以处理的序列的原因是在更改字符编码时转换文本类型,但二进制类型不是。

阅读“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”以了解更多关于字符编码的内容,以及关于如何在MySQL中使用编码的§ 9.1.4. of the MySQL manual, "Connection Character Sets and Collations"

+0

我正在使用的应用程序是论坛脚本,我不太熟悉代码。这是否意味着他们做错了什么?换句话说,这是应用程序的问题,还是我如何设置我的数据库?有没有简单的方法来检查它是否是应用程序,数据库,服务器等,这是问题。 – rein 2010-05-09 15:03:27