1

我对我的数据库的字符编码感到非常困惑。

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

那么西班牙语是正确的。

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

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

我该怎么做才能正确保存所有语言?我很困惑。

4

4 回答 4

1
 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'

于 2012-05-04T15:54:35.727 回答
1

尝试作为第一个语句运行这个 sql 查询:

set names 'utf8';

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

于 2012-05-04T15:47:07.130 回答
1

检查您的客户端是否执行

SET NAMES 'utf8';

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

于 2012-05-04T15:48:06.180 回答
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);

?>
于 2012-05-04T15:48:22.137 回答