MySQL中文utf8排序问题解决方案 [ 2.0 版本 ]
网站开发接近尾声,几乎所有的编码都是采用utf8编码,但是最后在采用gridview显示人名,并排序的时候出现问题了。不是按照拼音或者笔画啊,乱七八糟的排序。也百度了应当采用gbk的方式才可以正确排序,也知道怎么加这个转换gbk的语句,但是在gridview点击行首排序咋个处理呢?
先谢谢啦。
非常感谢 @drodata 下面是我的解决方法。
参考网址:
- http://www.yiichina.com/question/1652
 - http://blog.csdn.net/wqjsir/article/details/7544208
 - http://blog.sina.com.cn/s/blog_3e585ce50102v133.html
 
考虑到一般编程代码以及MySQL存储都会采用UTF-8编码,但是遇到人名排序等问题时,发现不是按姓名也不是按笔画数目排序。
这跟UTF-8汉语字符的编码有关系,采用GBK编码,常用汉字一般都是按照汉语拼音顺序排列的。
下面假设在gridview里对名字等进行汉语拼音排序,是在对SearchModel进行操作。
假设有个数据库表tb_personinfo,使用Gii生成的两个ActiveRecord类,在./common/models/文件夹下,有
Personinfo.php和PersoninfoSearch.php文件。修改PersoninfoSearch.php文件。
代码如下。
class PersoninfoSearch extends Personinfo
{
    public function search($params)
    {
        $query = Personinfo::find();
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
        // usage
        $this->sortByPinyin($dataProvider, [
            'name',
        ]);
        
        // skip many codes.
    
    }
    /**
     * sort params in attributes by Pinyin
     * @params $params attribute name, as array
     */
    public function sortByPinyin($dataProvider, $params)
    {
        $sorts = $dataProvider->getSort();
        foreach($params as $param){
            $sorts->attributes[$param] = [
                'asc' => ["CONVERT($param USING gbk)" => SORT_ASC],
                'desc' => ["CONVERT($param USING gbk)" => SORT_DESC],
            ];
        }
        $dataProvider->setSort($sorts);
    }
}
解释:
- sortByPinyin($dataProvider, $params)函数,是这次添加的一个函数,$params是个数组array,
把需要通过汉语排序的属性名字作为元素罗列其中。 - search($params)是已有函数,本文只是对其添加下面这一条代码,用于汉语拼音排序。
 
$this->sortByPinyin($dataProvider, [
            'name',
        ]);
bubifengyun NJSH
            注册时间:2014-11-06
最后登录:2022-10-29
在线时长:59小时54分
    最后登录:2022-10-29
在线时长:59小时54分
- 粉丝36
 - 金钱10
 - 威望160
 - 积分2200
 
共 2 条评论
public function sortByPinyin($dataProvider, $params) { $sorts = $dataProvider->getSort(); foreach($params as $param){ $sorts->attributes[$param] = [ 'asc' => ["CONVERT($param USING gbk)" => SORT_ASC], 'desc' => ["CONVERT($param USING gbk)" => SORT_DESC], ]; } $dataProvider->setSort($sorts); }你想表达啥意思?
function function_name() { echo 'hello world'; }