MySQL UTF-8编码

时间:2012-05-04 15:43:59

标签: mysql utf-8

我对数据库的字符编码很困惑。

我的数据库配置为UTF8_general_ci。但是,如果我尝试用西班牙语保存一些东西,比如“león”内容si被破坏然后修复它我必须在保存前使用utf8_decode,当我读到时我使用utf8_encode。

然后西班牙语是正确的。

现在我有俄罗斯用户用cyrilic写作,他的内容被宠坏了(用???????)

我想如果我不使用utf8_decode,那么cyrilic会是正确的(或者我不知道)但是西班牙语会不正确。

如何正确保存所有语言?我很困惑。

4 个答案:

答案 0 :(得分:1)

尝试以此sql查询的第一个语句运行:

set names 'utf8';

这将MySQL连接的编码设置为UTF-8并阻止双重编码。

答案 1 :(得分:1)

检查您的客户端是否执行

SET NAMES 'utf8';

开始会话时。检查表中的所有表和所有char字段是否使用utf-8编码(它们的编码可能与数据库编码不同)。

答案 2 :(得分:1)

我使用一个脚本来转换数据库中所有表的utf8字符集。试一试:

<?
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'db_name';
$collation = "utf8_general_ci";
$charset = "utf8";

mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);

mysql_query("ALTER DATABASE $dbname COLLATE $collation");
$result = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_row($result)) {
mysql_query("ALTER TABLE $row[0] COLLATE $collation");
$result1 = mysql_query("SHOW COLUMNS FROM $row[0]");
while ($row1 = mysql_fetch_assoc($result1)) {
if (preg_match('~char|text|enum|set~', $row1["Type"])) {
mysql_query("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET $charset");
mysql_query("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $collation DEFAULT '$row1[Default]'");
echo $row[0] . "->" . $row1[Field] . "->" . $row1[Type] . " is now UTF8
";
}
}
}
mysql_free_result($result);

?>

答案 3 :(得分:0)

 http://stackoverflow.com/questions/367711/what-is-the-best-collation-to-use-for-mysql-with-php

mysql字符集-----------------

 http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

您可以指定更具体的UTF-8字符集,例如'utf8_swedish_ci'