代码之家  ›  专栏  ›  技术社区  ›  Brad

数据库编码问题?显示带问号的双引号和单引号

  •  1
  • Brad  · 技术社区  · 14 年前

    旧服务器db=mysql v4.0.21 新服务器db=mysql v5.0.45

    我正在将一个应用程序移动到一个新服务器上,并通过数据库进行复制。

    应用程序会发送一天的日程安排,每当有双引号和单引号时,它们会显示为问号?

    在移动到的服务器上出现这种情况 ?The Horror of Race: HBO?s True Blood?

    这就是它在最初的服务器应用程序上构建的样子: “The Horror of Race: HBO’s True Blood”

    带phpmyadmin的数据库截图 http://grab.by/2EsU (原始服务器mysql v4.0.21)和 http://grab.by/2EtN (新服务器mysql 5.0.45)

    存储数据的表的屏幕截图: http://grab.by/2Et2 (只在车身立柱上发生)

    新服务器表中数据的屏幕截图: http://grab.by/2Etb (你会注意到问号吗?)

    原始服务器表中数据的屏幕截图: http://grab.by/2Etl

    这个应用程序是用PHP构建的,它像打印身体一样 nl2br($body);

    在插入到db表之前,字符串与$body变量一起存储,如下所示: $body=addslashes($_POST['body']);

    有什么关于它为什么显示的帮助吗?标记代替双引号和单引号,将是有益的-非常感谢。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Roland Bouman    14 年前

    这很可能是由于字符编码设置的不同。这可能在一些地方有效。我建议您登录两台服务器并执行以下操作:

    mysql> show variables like '%character%';
    +--------------------------+-----------------------------------------------+
    | Variable_name            | Value                                         |
    +--------------------------+-----------------------------------------------+
    | character_set_client     | latin1                                        |
    | character_set_connection | latin1                                        |
    | character_set_database   | latin1                                        |
    | character_set_filesystem | binary                                        |
    | character_set_results    | latin1                                        |
    | character_set_server     | latin1                                        |
    | character_set_system     | utf8                                          |
    | character_sets_dir       | D:\Servers\MySQL\MySQL_5_1_36\share\charsets\ |
    +--------------------------+-----------------------------------------------+
    8 rows in set (0.00 sec)
    

    看看有没有什么不同。例如,如果新服务器的默认连接字符集不同,则可以得到这些结果。

    您还应该确保列的字符编码设置:执行 SHOW CREATE TABLE <table-name> 并检查列级别的字符集是否仍然相同 MySQL & GT;

    编辑 或者,正如Martin在注释中指出的那样,您可以处理一个SQL转储,它是用您没有预料到的编码进行编码的。以下是关于这方面的更多信息: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_default-character-set .在这种情况下,您可以尝试使用类似iconv的工具重新编码转储文件。( http://www.gnu.org/software/libiconv/documentation/libiconv/iconv.1.html )

        2
  •  1
  •   rook    14 年前

    老实说,我认为对这个问题的描述还缺少另一个难题,因为一切看起来都是有效的。您还可以使用另外两个函数来防止SQL注入,以解决您的奇怪问题。

    $var=addslashes(htmlspeicalchars($var,ENT_QUOTES));
    

    或者更好的方法:

    $var=mysql_real_escape_string($var);