MySQL 排序规则

Posted

技术标签:

【中文标题】MySQL 排序规则【英文标题】:MySQL collation 【发布时间】:2011-11-14 01:37:14 【问题描述】:

我在 phpmysql 上开发时遇到了一个非常奇怪的问题。 4-5年前我遇到过这样的问题,但从那以后就没有了。而且真的不记得我是怎么解决的了。

嗯...问题:我有一个带有 utf_unicode_ci 排序规则的数据库,但是在插入格鲁吉亚字母时:სახელი და გვარი 在数据库中我有 მáƒ~ხეáƒ~áƒ

有什么想法吗?

【问题讨论】:

看看这个帖子:***.com/questions/7073401/… 我想我的回答可能有助于解释一个可能的问题。 【参考方案1】:

你能用utf8_general_ci 代替这个吗? 它会解决你的问题。

但不要忘记,*databases* and *tables* collation must be utf8_general_ci

【讨论】:

排序规则(排序顺序)与显示的错误字符集有什么关系? 表格的排序规则决定了排序顺序。与这个问题无关。 问题不在于排序?【参考方案2】:

根据 Eray 的回答,我意识到 utf8_general_ci 应该在排序规则中设置,而不是 utf8_unicode_ci

除此之外,使用 mysql_set_charset('utf8', $connection) 函数。

示例如下:

        $connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
    mysql_set_charset('utf8',$connection);      
    if (!$connection) 
        die("Database connection failed: " . mysql_error());
     else 
        $db_select = mysql_select_db(DB_NAME, $connection);
        if (!$db_select) 
            die("Database selection failed: " . mysql_error());
        
    

所以在第二行添加 mysql_set_charset 解决了我的问题。

希望它可以帮助任何人..

【讨论】:

【参考方案3】:

我可以让您确定的一件事是,您遇到的问题与排序规则没有任何关系。它与字符集和编码有关,很可能问题不在于将数据插入数据库时​​,而是在读取数据并显示它们时,有很多关于 mysql 中的 unicode 字符的问题,所以搜索一下,你会发现大量提示和信息。

【讨论】:

排序规则与字符集相关联,使用排序规则您也可以设置字符集 当“სახელი და გვარი”显示为“მáƒ~ხეáƒ~ე时肯定与排序规则无关,只有在比较字符串时才考虑排序规则。跨度> 排序规则基于字符集。如果没有设置 utf8 字符集,则不能使用 utf8_general_ci 排序规则。 @Shrapnel:是的,排序规则是基于字符集的,但这里的问题是他在一个字符集中插入字符,而它们又出现在另一个字符集中。更改排序规则绝对不会做任何事情。问题很可能是php使用的客户端字符集不是utf8,字符被错误翻译和存储。【参考方案4】:

确保您使用的是带有 N 前缀(NCHAR、NVARCHAR)的字符串类型之一。

添加数据时不要忘记将N添加到您传递给数据库的参数中。例如:

INSERT INTO table VALUES (N'Georgian Letters', N'Georgian Letters', ...)

N 前缀将告诉 sql 其后续字符串是 unicode 字符串。

【讨论】:

以上是关于MySQL 排序规则的主要内容,如果未能解决你的问题,请参考以下文章

当所有排序规则都已经标准化时,Mysql 非法混合排序规则

Mysql 排序规则选择

MySQL - 最佳排序规则?

发现 MySQL 列的排序规则

创建自定义 MySQL 排序规则

MySQL 根据自定义规则排序