MySQL在特殊字符处切断字符串

时间:2009-09-04 21:06:56

标签: php mysql encoding insert special-characters

我正在尝试使用PHP将远程POST数据(iSnare发送的文章)插入MySQL。数据来自远程POST发件人,我可以毫无问题地将其写入纯文本文件。

不幸的是,当它将它插入MySQL时,MySQL会在特殊字符处切断字符串(文章)。我尝试过很多东西但是我还是不成功!

我试过了:

  • 使用mysql_real_escape_string()
  • 转义字符
  • 使用htmlentities()htmlspecialchars()(包含所有参数..)
  • 在执行其他操作之前将SET NAMES utf8查询发送到MySQL
  • 所有表格和列均采用UTF-8编码且utf8_general_ci(也已尝试utf8_unicode_ciutf8_bin作为整理)
  • 将所有PHP文件保存为UTF-8

我仍然无法找到解决方案。如果有人能帮助我解决这个问题,我将非常感激。


这是我的表定义和PHP代码:

PHP

function guvenlik_sql($x){

    // Cleans inputs agains sql injection
    return mysql_real_escape_string(htmlentities(stripslashes($x)), ENT_QUOTES);
}    

// Check if data really comes from an Isnare.com server (Address hidden)
if ($_SERVER['REMOTE_ADDR'] == $isnareIP || $_SERVER['REMOTE_ADDR'] == "xxx.xxx.xxx.xxx") {

    $title = guvenlik_sql($_POST["article_title"]);
    $first_name = guvenlik_sql($_POST["article_author"]);
    $description = guvenlik_sql($_POST["article_summary"]);
    $category = guvenlik_sql($_POST["article_category"]);
    $article = guvenlik_sql($_REQUEST["article_body_text"]);
    $article_html = guvenlik_sql($_POST["article_body_html"]);
    $resource_box = guvenlik_sql($_POST["article_bio_text"]);
    $resource_box_html = guvenlik_sql($_POST["article_bio_html"]);
    $keywords = guvenlik_sql($_POST["article_keywords"]);
    $email = guvenlik_sql($_POST["article_email"]);

    $fp = fopen('test.txt', 'a');
    fwrite($fp, $title."\n");
    fwrite($fp, $article."\n\n\n\n");
    fclose($fp);

mysql_query("INSERT INTO articles " . 
            "(" . 
                "first_name, " . 
                "email, " . 
                "title, " . 
                "description, " . 
                "article, " . 
                "article_html, " . 
                "category, " . 
                "resource_box, " . 
                "resource_box_html, " . 
                "keywords, " . 
                "distributor, " . 
                "distributor_host" . 
            ") VALUES (" . 
                "'$first_name', " . 
                "'$email', " . 
                "'$title', " . 
                "'$description', " . 
                "'$article', " . 
                "'$article_html', " . 
                "'$category', " . 
                "'$resource_box', " . 
                "'$resource_box_html', " . 
                "'$keywords', " . 
                "'$isnare', " . 
                "'$_SERVER['REMOTE_ADDR']', " . 
            ")") or die(mysql_error());

} //end if security

表格定义

CREATE TABLE `articles` (
   `article_ID` int(11) NOT NULL auto_increment,
   `first_name` varchar(100) NOT NULL,
   `last_name` varchar(100) NOT NULL,
   `email` varchar(100) NOT NULL,
   `password` varchar(100) NOT NULL,
   `author_url` varchar(255) NOT NULL,
   `company_name` varchar(100) NOT NULL,
   `address1` varchar(100) NOT NULL,
   `address2` varchar(100) NOT NULL,
   `state_2digit` varchar(100) NOT NULL,
   `state` varchar(100) NOT NULL,
   `zip_code` varchar(100) NOT NULL,
   `country` varchar(100) NOT NULL,
   `phone` varchar(100) NOT NULL,
   `newsletter` varchar(100) NOT NULL,
   `title` varchar(255) NOT NULL,
   `description` text NOT NULL,
   `article` longtext NOT NULL,
   `article_html` longtext NOT NULL,
   `category` varchar(100) NOT NULL,
   `cat` varchar(100) NOT NULL,
   `resource_box` text NOT NULL,
   `resource_box_html` longtext NOT NULL,
   `keywords` varchar(255) NOT NULL,
   `publish_date` timestamp NOT NULL default CURRENT_TIMESTAMP,
   `distributor` varchar(255) NOT NULL default '',
   `distributor_host` varchar(255) NOT NULL,
   PRIMARY KEY  (`article_ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

8 个答案:

答案 0 :(得分:7)

我刚刚处理了相同的情况,条目被截断,特殊字符(ä,ö,è等)应该是。我的所有文件都是UTF8编码,连接是UTF8编码,表格归类是UTF8,但条目仍被截断。

我的解决方案是:更多UTF编码! :)对可能包含特殊字符的条目使用utf8_encode()

mysql_query("INSERT INTO articles (first_name, email, title, description, article, article_html, category, resource_box, resource_box_html, keywords, distributor, distributor_host) values (
                                  '" . utf8_encode($first_name) . "',
                                  '" . $email . "',
                                  '" . utf8_encode($title) . "',
                                  '" . utf8_encode($description) . "',
                                  // etc

答案 1 :(得分:0)

“Set names utf8”只设置表名和列名的字符集,你也必须使用“set character set utf8”作为内容字符集。

答案 2 :(得分:0)

您确定字符串是否因为比列定义允许的长而被切断?

问题还可能是数据已成功存储在数据库中,但用于显示数据库中数据的应用程序会切断显示的字符串。这主要发生在基于Windows的应用程序中包含空字符的字符串,因为Windows控件在内部使用以空字符结尾的字符串。

答案 3 :(得分:0)

1)将您生成的sql字符串放入变量并在将其发送到MySQL之前将其写入文件(这样您就可以查看正在发送的内容)

2)mysqld的设置为“max_allowed_packet”,我认为它会切断长查询。

3)您将ENT_QUOTES传递给mysql_real_escape_string()。我认为你的意思是把它传递给htmlentities()

答案 4 :(得分:0)

对于那些可能有相同问题并且之前的答案没有帮助的人,我得到了另一个建议:检查内容类型!它应该是这样的:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

我和唐纳德有同样的问题 - 这就是MAGIC :)(我没想到,首先处理该文件的colegue没有把它设置得正确......)

答案 5 :(得分:0)

刚刚解决了类似的问题。我的问题是我试图将Latin-1编码数据插入到UTF-8编码表中。仔细检查数据的编码 - 您可能从输入中获得非UTF-8数据。

答案 6 :(得分:0)

使用mysqli_set_charset为我节省了一天的时间:

$conn = new mysqli($host, $username, $password, $database);
mysqli_set_charset($conn, 'utf8');

答案 7 :(得分:0)

答案很晚,但是我在我们的一个较早的项目中遇到了这个问题。事实证明,MySql具有UTF8自己的“实现”。它不能保存由3个以上字节组成的字符(如表情符号等)。有时它会引发错误(例如在此问题"Incorrect string value" when trying to insert UTF-8 into MySQL via JDBC?中),有时它会切断字符串。

解决方案是如上面链接的问题所述,从utf8切换到utf8mb4 ,或者确保在保存前先切断所有长字符。

我知道这是一个古老的问题,但是随着我们使用越来越多的表情符号,在某些较旧的应用程序中可能会发生这种情况。希望对别人有帮助。