我应该使用哪种排序规则将这些国家/地区名称存储在MySQL中?

时间:2010-04-30 09:53:49

标签: php mysql collation

我正在尝试在mySQL数据库中存储国家/地区列表。

我在存储(非英语)名称时遇到问题:

  • SãoTomé和Príncipe
  • RepúblicadeEl Salvador

它们在db中存储有奇怪的字符(因此在我的HTML页面中奇怪地输出)。

我尝试为数据库和MySQL连接排序规则使用不同的排序组合:

“明显”设置是对数据库和连接信息使用utf8_unicode_ci。令我惊讶的是,这并没有解决问题。

有谁知道如何解决这个问题?

[编辑]

事实证明,问题与排序无关,而是与col所指出的编码有关。我注意到在命令行中,我可以输入两个单独的命令:

SET NAMES utf8

followed by

[QUERY]

其中[QUERY]是我的SQL语句,用于检索名称,并且有效(名称不再受损)。但是,当我以编程方式(即通过代码)执行相同的操作时,我仍然会得到损坏的名称。我尝试将这两个语句结合起来:

SET NAMES utf8; [QUERY]
再次,在命令行中,

返回正确的字符串。再一次,当我通过代码尝试相同的语句时,我得到了错误的值。

这是我的代码的代码片段:

$mysqli = self::get_db_connection();
$mysqli->query('SET NAMES utf8');

$sql = 'SELECT id, name FROM country';

$results = self::fetch($sql);

the fetch method is:

    private static function fetch($query)
    {
        $rows = array();

        if (!empty($query))
        {
            $mysqli = self::get_db_connection();

            if ($mysqli->connect_errno)
            {
                self::logError($mysqli->connect_error);
            }
            else
            {
                if ($result = $mysqli->query($query))
                {
                    if(is_object($result)){
                        while ($row = $result->fetch_array(MYSQLI_ASSOC))
                            $rows[] = $row;
                        $result->close();
                    }
                }
            }
        }
    return $rows;
    }

任何人都可以发现我的错误吗?

为了澄清,页面中的HTTP标头设置正确 'Content-type':'text / html;字符集= UTF-8'

所以这不是问题。

2 个答案:

答案 0 :(得分:1)

如果你在任何地方使用uf8 *它会起作用 - 似乎你忘了什么

*无处不在意味着:用于数据库整理和连接,用于(php?)脚本文件以及发送到浏览器的页面(通过设置元标记或更好地设置uftf-8头)

答案 1 :(得分:1)

事实上,collation不会影响任何形式。这是用于订购和比较的东西,而不是重新编码。
encoding负责角色本身。

因此,您的问题不是来自表格排序,而是来自连接编码

SET NAMES utf8

查询应该解决问题,对于新插入的数据