-->

MySQL的窒息花(智能)报价(MySQL choking on curly (smart) quo

2019-08-02 05:46发布

我将一些数据从一种形式的数据库。 我使用addslashes逃脱文本(也尝试过mysql_real_escape_string具有相同的结果)。

定期引号逃过一劫,但一些其他的报价都没有。 例如,字符串:

荷马的血液变得在教育部的新啤酒的秘方。

被转换为:

荷马\的血液变得在教育部的新啤酒的秘方。

我没想到花报价将此事转义,但只有这个文本插入到数据库:

荷马的血液成为萌的秘诀

所以PHP认为卷曲的报价是好的,但MySQL是失去的字符串。 MySQL是不给任何错误,但。

Answer 1:

我会看在你的Web界面使用的字符编码,并且在数据库级别使用的不匹配。 如果您的Web界面使用UTF-8,例如,你的数据库使用的MySQL默认编码latin1 ,那么你需要设置你的表有DEFAULT CHARSET=utf8

使用mysql_real_escape_string()或mysqli的,顺便说一句。 addslashes() 不是针对SQL注入足够的保护。



Answer 2:

“关于在Moe的是你的榜样串唯一的字符,如果该字符串是latin1的编码,但你的MySQL服务器预计UTF8这将是无效的。

简单的例子:

<?php
function foo($s) {
    echo 'len=', strlen($s), ' ';
  for($i=0; $i<strlen($s); $i++) {
    printf('%02X ', ord($s[$i]));
  }
  echo "\n";
}

 // my file is latin1 encoded and so is the string literal
foo('Moe’s');
// now try it with an utf8 encoded string
foo( utf8_encode('Moe’s') );

版画

LEN = 5 4D 6F 65 92 73
LEN = 6 4D 6F 65 92 C2 73

因此,问题是:你喂的“错误”编码的MySQL服务器的东西吗?
每个连接有一个连接字符集和MySQL服务器期待您的客户端(PHP脚本)发送了在该字符集编码数据。 你可以找到连接字符集是什么

SHOW VARIABLES LIKE '%character%'

$mysql = mysql_connect('..', '..', '..') or die(mysql_error());
mysql_select_db('..', $mysql) or die(mysql_error());

$query = "SHOW VARIABLES like '%character%'";
$result = mysql_query($query, $mysql) or die(__LINE__.mysql_error());
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
  echo join(', ', $row), "\n";
}

这应打印像

character_set_client, utf8
character_set_connection, utf8
character_set_database, latin1
character_set_filesystem, binary
character_set_results, utf8
character_set_server, utf8
character_set_system, utf8

并且character_set_connection, utf8表示“我的”连接字符集是UTF8,即MySQL服务器预计从客户端(PHP)UTF8编码的字符。 什么是“你的”连接字符集?

然后,如果你不得不看看你的参数字符串的实际编码,即

$foo = mysql_real_escape_string($_POST['foo'], $mysql);

替换由

echo '<div>Debug hex($_POST[foo])=';
for($i=0; $i<strlen($s); $i++) {
    printf('%02X ', ord($_POST['foo'][$i]));
}
echo "</div>\n";
$foo = mysql_real_escape_string($_POST['foo'], $mysql);

并检查您输入的字符串的实际编码是什么。 它是否会给92或C2 92?



文章来源: MySQL choking on curly (smart) quotes