Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据库编码问题?显示带问号的双引号和单引号_Php_Mysql_Linux - Fatal编程技术网

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

Php 数据库编码问题?显示带问号的双引号和单引号,php,mysql,linux,Php,Mysql,Linux,旧服务器db=MySQL v4.0.21 新服务器db=MySQL v5.0.45 我正在将一个应用程序移动到一个新服务器上,并在数据库上进行了复制 应用程序会发送当天的日程安排,每当出现双引号和单引号时,它们都会显示为问号 在服务器上出现这样的消息,它被移动到?种族的恐怖:HBO的真爱? 这就是它在最初构建的服务器应用程序上的样子:“种族的恐怖:HBO的真血” 带有phpmyadmin(原始服务器mysql v4.0.21)和(新服务器mysql 5.0.45)的数据库截图 数据存储在其中的表

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

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

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

在服务器上出现这样的消息,它被移动到
?种族的恐怖:HBO的真爱?

这就是它在最初构建的服务器应用程序上的样子:
“种族的恐怖:HBO的真血”

带有phpmyadmin(原始服务器mysql v4.0.21)和(新服务器mysql 5.0.45)的数据库截图

数据存储在其中的表的屏幕截图:(仅在正文列中发生)

新服务器表中数据的屏幕截图:(您会注意到问号吗?)

原始服务器表中数据的屏幕截图:

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

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


关于为什么在双引号和单引号处显示?标记的任何帮助都将非常有用-非常感谢。

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

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
并检查列级别的字符集是否仍然相同 mysql>

编辑
或者,正如Martin在评论中指出的那样,您可能正在处理一个SQL转储,该转储的编码方式是您没有预料到的。以下是有关该方面的更多信息:。在这种情况下,您可以尝试使用类似iconv()的工具对转储文件重新编码

这很可能是由于字符编码设置不同。这可能在几个地方起作用。我建议您登录这两个服务器并执行以下操作:

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
并检查列级别的字符集是否仍然相同 mysql>

编辑
或者,正如Martin在评论中指出的那样,您可能正在处理一个SQL转储,该转储的编码方式是您没有预料到的。以下是有关该方面的更多信息:。在这种情况下,您可以尝试使用类似iconv()的工具对转储文件重新编码

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

$var=addslashes(htmlspeicalchars($var,ENT_QUOTES));
或者更好的方法:

$var=mysql_real_escape_string($var);

老实说,我认为这个问题的描述还缺少另一个谜团,因为所有的东西看起来都是有效的。还有两个函数可以用来防止SQL注入,这可能会解决您的奇怪问题

$var=addslashes(htmlspeicalchars($var,ENT_QUOTES));
或者更好的方法:

$var=mysql_real_escape_string($var);

您是如何将数据从一个版本复制到另一个版本的?您应该使用新版本的mysqldump。我在mac上使用SQL Pro进行MySQL转储,然后将数据库导入新服务器。您是如何将数据从一个版本复制到另一个版本的?您应该使用新版本的mysqldump。我在mac上使用SQL Pro进行MySQL转储,然后导入d将数据库转换到新服务器。+1-如果旧表是utf-8,而新表是latin-1,则可能有许多utf-8字符在latin-1中没有等效字符,将映射到“?”。如果按字节而不是按字符进行转换,则情况会更糟。Ran查询,旧服务器数据库新服务器数据库表信息服务器-旧服务器+1的表信息-如果旧表是utf-8,而新表是latin-1,则可能有许多utf-8字符在latin-1中没有等效字符,将映射到“?”。如果按字节而不是按字符进行转换,则情况会更糟。Ran query,旧服务器数据库新服务器数据库表信息新服务器-旧服务器的表信息