【问题标题】:Values inserted into database show weird characters插入数据库的值显示奇怪的字符
【发布时间】:2014-02-06 08:10:38
【问题描述】:

我从可读性获取 xml 提要中的数据并将其插入数据库,然后输出。 xml 提要的字符集是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');

【问题讨论】:

  • 您在查询之后设置$DB->set_charset('utf8');,但您需要在查询之前设置它
  • @t.niese 有人为我做了这个,所以我不知道该放在哪里。我应该在连接后放置它吗?
  • @t.niese 我把它放在 $SQL 之前,它起作用了。尴尬的问题。你能把你的建议变成答案吗?

标签: php mysql database utf-8


【解决方案1】:

你的问题是你放$DB->set_charset('utf8');的地方

在进行查询之前,您需要告诉数据库您发送或希望接收数据的字符集。

但是因为您在查询后有$DB->set_charset('utf8');,所以该命令对之前的查询无效。

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

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

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

【讨论】:

  • 感谢您的广泛报道。我真的很感激。
  • @ChrisBurton np ,只要您花时间详细说明问题(例如,表明您检查了所有内容都在utf8 中),花时间写一个答案是没有问题的。如果问题很清楚,那么它也可能对其他人有所帮助。
  • @ChrisBurton 还有一点注意事项:当您将php 文件保存为utf8 时,请注意有两种方法可以以这种方式保存它们,使用和不使用BOM,请确保保存文件总是没有 BOM,否则您的文档前面将有 3 个不可见字节,这可能/将导致编码/渲染问题和其他意外行为,因为这样数据将在第一个 <?php 之前提交制作它,例如有时无法使用会话或 cookie 或发送压缩数据。
  • 这对我正在编写的另一个应用程序很有帮助。当我将(没有 BOM)保存为 UTF8 时,我很好奇 BOM 是什么。感谢您提供更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2012-10-01
  • 2014-02-12
  • 2013-10-29
相关资源
最近更新 更多