我对数据库的字符编码很困惑。
我的数据库配置为UTF8_general_ci。但是,如果我尝试用西班牙语保存一些东西,比如“león”内容si被破坏然后修复它我必须在保存前使用utf8_decode,当我读到时我使用utf8_encode。
然后西班牙语是正确的。
现在我有俄罗斯用户用cyrilic写作,他的内容被宠坏了(用???????)
我想如果我不使用utf8_decode,那么cyrilic会是正确的(或者我不知道)但是西班牙语会不正确。
如何正确保存所有语言?我很困惑。
答案 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'