2012-05-04 42 views
1

我很困惑我的数据库的字符编码。MySQL UTF-8编码

我用UTF8_general_ci配置数据库。但是,如果我试图用西班牙文保存某些东西,比如“león”,那么内容si会被破坏然后修复它,所以我必须在保存之前使用utf8_decode,并且当我读取时使用utf8_encode。

然后西班牙语是正确的。

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

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

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

+1

客户端/连接使用什么字符集? –

回答

1

尝试作为第一statment运行该SQL查询:

set names 'utf8'; 

这设置了MySQL引黄联接的为UTF-8编码并防止双重编码。

+0

谢谢!我已经在连接之后推出了:mysql_query(“SET NAMES'utf8'”);它看起来很完美! – Oscardr

1

检查您的客户端执行

SET NAMES 'utf8'; 

当启动一个会话。检查表中所有表和所有char字段使用utf-8编码(它们的编码可能与数据库编码不同)。

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); 

?> 
+0

Thannk你但它应该是我的数据库在UTF-8,我定义的字段在UTF-8我不明白为什么我必须将数据库更改为UTF-8。 – Oscardr

+0

我需要一个快速的解决方案,并在连接后添加 mysql_query(“SET NAMES'utf8'”); 而且看起来效果不错,现在我更放松了。 现在我会仔细阅读您的链接,并尝试了解tpasku脚本。 谢谢你,你真棒! 奥斯卡。 – Oscardr

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'

+0

我需要一个快速解决方案,并在连接后添加 mysql_query(“SET NAMES'utf8'”); 而且看起来效果不错,现在我更放松了。 现在我会仔细阅读您的链接,并尝试了解tpasku脚本。 谢谢你,你真棒! 奥斯卡。 – Oscardr