将特殊字符保存到MySQL数据库

6

我目前遇到一个问题,无法将特殊字符(® & ©)保存到MySQL数据库中。

在本地堆栈(本地开发机器)上,操作顺利进行,并且在前端输入的内容可以按预期保存。

在集中式服务器上使用相同的前端代码保存到数据库时,字符会与其他字符一起被处理,保存为®。在前端查看记录时,这不是问题,因为它会反转其操作并正确显示。

问题来自另一个单独的系统,该系统利用相同的数据库并且不做任何修改,因此显示为®而不是简单的®。

让我困惑的原因是,在我的本地堆栈上似乎按要求工作,但在集中式服务器上却没有。

我正在寻找有关要查找什么可能导致服务器配置与我的本地计算机不同的想法。

提前感谢您的帮助。 Mark


忘记提到前端是用PHP编写的。 - MarkJWiggins
1
请检查php默认编码、mysql连接编码以及mysql表和字段的排序规则是否相同。 - Pranav Hosangadi
+1 Pranav涵盖了大多数的事情 - 肯定需要做这些。 - therobyouknow
+1 @MarkJWiggins - 很好的问题 :) 由于Web应用程序可以由多个独立组件组成:MySQL数据库、PHP代码、HTML客户端以及它们之间的链接,因此开发可能会受到编码设置不集中的影响。 - therobyouknow
2个回答

2

@Pranav Hosangadi(感谢)提供了三个检查编码一致性的领域。以下解决方案增加了这一点。也可以考虑(不同于)@Soaice Mircea的答案(也要感谢)用于某些情况,其中此答案无法解决问题,尽管在我能够重现并找到解决方案时不需要这样做。@Pranav的思路对于这个问题似乎很成功,因为它关注的是使用相同字符集的一致性,而不是特定字符集。

五件事要做:

  1. ensure database charset and tables use same charset throughout, inspect this in phpmyadmin for example, note and this charset for use below

  2. use php header() function with database charset e.g.:

    header('Content-Type: text/html; charset=latin1_swedish_ci');
  3. insert meta tag in html header e.g.:

    <meta http-equiv="content-type"
    content="text/html;charset=latin1_swedish_ci">
  4. add charset-accept in form tag

    <form action=\"testsubmit.php\" method=\"post\" accept-charset=\"latin1_swedish_ci\">
  5. set charset of mysql connection e.g.:

    $con = mysql_connect("localhost","test","test");      
    mysql_set_charset ( "latin1_swedish_ci", $con );
    

观察到的一个奇怪的事情是,在同一台服务器上的其他地方可能无法设置mysql连接,错误消息为“无法初始化字符集latin1”。在这里看到了与不相关的软件:http://bugs.kde.org/226960。该讨论中的建议是:你们中的一个人能否查看/usr/share/mysql/charsets并报告是否有一个'latin1.xml'文件?但是不要因此而放弃这个答案,因为这可能是我设置的孤立特异性。 - therobyouknow

1

在 PHP 代码中选择数据库后添加以下内容:

mysql_query("set names 'utf8'"); 

同时请检查您存储文本的列是否具有UTF8编码。


+1 @Soaica Mircea,谢谢。在某些情况下值得考虑。尽管这可能不是OP的原始问题所需的,因为我能够重现并提供解决方案而无需mysql_query(“set names'utf8'”)但这可能对其他情况有用。再次感谢。 - therobyouknow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接