2010-05-31 41 views
6

有人可以解释我的时候我都设置为UTF-8我不断收到那些该死UTF-8 MySQL和字符集

的MySQL
Server版本:44年5月1日
MySQL的字符集:UTF-8的Unicode(UTF-8)

我创建一个新的数据库

名称:utf8test
校对:utf8_general_ci
MySQL连接校对:utf8_general_ci

我的SQL是这样的:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

CREATE TABLE IF NOT EXISTS `test_table` (
    `test_id` int(11) NOT NULL, 
    `test_text` text NOT NULL, 
    PRIMARY KEY (`test_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `test_table` (`test_id`, `test_text`) VALUES 
(1, 'hééélo'), 
(2, 'wööörld'); 

我的PHP/HTML:

<?php 
$db_conn = mysql_connect("localhost", "root", "") or die("Can't connect to db"); 
mysql_select_db("utf8test", $db_conn) or die("Can't select db"); 

// $result = mysql_query("set names 'utf8'"); // this works... why?? 
$query = "SELECT * FROM test_table";   
$result = mysql_query($query); 

$output = ""; 
while($row = mysql_fetch_assoc($result)) { 
    $output .= "id: " . $row['test_id'] . " - text: " . $row['test_text'] . "<br />"; 
} 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html lang="it" xmlns="http://www.w3.org/1999/xhtml" xml:lang="it"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>UTF-8 test</title> 
</head> 
<body> 
<?php echo $output; ?> 
</body> 
</html> 

回答

1

我设置好一切为UTF-8

不太。
你必须告诉mysql你的客户端的编码。

事实上,你不必在utf-8中设置“全部”。你可以将你的表格设置为latin1并以utf-8格式输出。或者相反。
非常灵活。

但您必须明确设置客户端的编码。 所以,这就是为什么它与set names utf8。因为这个查询设置了客户端的编码。让Mysql知道数据必须以utf-8发送。非常明智,呵呵?我也不得不提到你的SQL转储。它需要相同的设置。只是在顶部的某处设置名称。因为你也从一些客户端发送这些查询。此客户端的编码也需要设置。

还有一件事要提到:确保您的服务器在Content-type标头中发送正确的编码。你也没有将它设置为UTF-8。

+0

谢谢Col. Ok让我看看你正在谈论的SQL dump。除了我的例子中的$ result = mysql_query(“set names'utf8'”)这行之外,我还有做另一个名字为utf8的?请问在哪里以及如何? – FFish 2010-05-31 18:34:29

+0

@FFish在你输入你的sql命令的同一个地方,从SET SQL_MODE开始。是它的MySQL控制台或什么?这只是一个简单的规则:每次插入或选择数据时 - 必须设置客户端编码。 – 2010-05-31 18:39:08

+0

好吧,SQL转储,现在我明白你的意思了。干杯 – FFish 2010-05-31 20:48:05

6

尝试设置charachter编码mysql_connect功能这样以后:

mysql_query ("set character_set_client='utf8'"); 
mysql_query ("set character_set_results='utf8'"); 

mysql_query ("set collation_connection='utf8_general_ci'"); 
+1

可以缩短为简单'SET NAMES utf8' – 2010-05-31 13:53:55

+0

是的,我知道。我写了MySQL 4+解决方案。 – antyrat 2010-05-31 13:55:23

+0

4.0不了解这些设置。 4.1了解集合名称 – 2010-05-31 14:01:28

1

我没在连接到数据库后,不会看到"SET NAMES 'utf8';"查询。

试试吧,可能适合你。

1

我会说,你忘了设置你的PHP文件的内容类型编码为UTF-8:

header('Content-Type: text/html; charset=utf-8'); 

或者是MySQL数据库中的编码错误?

如果仅仅加载数据返回错误的结果,你可以使用前面提到的查询或这行代码,使UTF-8进行查询:

$mysqli->set_charset('utf8'); 

我希望这是你需要的东西。