插入数据库的值显示奇怪的字符

时间:2014-01-17 05:16:43

标签: php mysql database utf-8

我从可读性中获取xml提要中的数据并将其插入数据库然后输出。 xml Feed的字符集为UTF-8,我的html页面标题也为UTF-8。我甚至通过我的文本编辑器将代码保存为UTF-8,并且我的数据库也设置为utf8_unicode_ci。我无法弄清楚为什么会这样。

代码:

$xml = simplexml_load_file( "http://readability.com/christopherburton/latest/feed" );
$json = json_encode( $xml );
$array = json_decode( $json,TRUE );
$items = $array['channel']['item'];

$DB = new mysqli('localhost', 'secret', 'secret', 'secret' );
if( $DB->connect_errno ){
    print "failed to connect to DB: {$DB->connect_error}";
    exit( 1 );
}
$match = "#^(?:[^\?]*\?url=)(https?://)(?:m(?:obile)?\.)?(.*)$#ui";
$replace = '$1$2';

foreach( $items as $item ){
    $title = $item['title'];
    $url = preg_replace( $match,$replace,$item['link'] );
    $title_url[] = array( $title,$url );
    $sql_values[] = "('{$DB->real_escape_string( $title )}','{$DB->real_escape_string( $url )}')";
}
$SQL = "INSERT IGNORE INTO `read`(`title`,`url`) VALUES\n ".implode( "\n,",array_reverse( $sql_values ) );
if( $DB->query( $SQL ) ){
} else {
    print "failed to INSERT: [{$DB->errno}] {$DB->error}";
}
$DB->set_charset('utf8');

http://f.cl.ly/items/0X2R0s1Q1Q3V461V3W3P/Screen%20Shot%202014-01-17%20at%2012.14.42%20AM.png

1 个答案:

答案 0 :(得分:1)

您的问题出在$DB->set_charset('utf8');

的位置

您需要告诉数据库您发送的字符集或希望在之前接收数据

但是因为你的查询后$DB->set_charset('utf8');命令对以前的查询没有影响。

如果没有为连接定义字符集,则DMBS使用在配置中设置为默认值的字符集。 对于mysql,这可能是例如latin1。 因为mysql认为它接收的数据是在例如latin1转换为utf8,这就是为什么你会看到这些奇怪的符号。

要解决此问题,您只需确保在通过或希望接收$DB->set_charset('utf8');中的数据的查询之前调用utf8

对于您的示例,您可以将其放在if( $DB->connect_errno ){}之后,因为在该位置已成功建立连接。