Thinkphp中MySQL按照中文拼音排序问题的处理

背景

由于客户需求,需要按照汉字的首字拼音排序,项目开发中免不了数据的排序问题,排序中又免不了对中文的处理。今天分享一下如何在mysql中对中文进行排序,介绍下thinkphp连贯操作的order底层原理

例:M(‘Project’)->order(‘name’)->select(); 这段代码最后转换成原生php代码是这样的: select * from `project` order by `name`; 原生代码按照汉字排序是这样的: select * from `project` order by convert(`name` using gb2312) asc; 所以thinkphp可以这样写: M(‘Project’)->order(‘convert(name using gb2312) asc’)->select(); 实验可用成功order(array('convert(server_name using gb2312) ASC,time_controller DESC,wechat ASC')

正文

现有mysql数据表一个,默认的数据是这个样子的(省略了其它字段):

数据查询的时候不管是按添加时间还是按修改时间排序,用户都不满意,领导说:应该按照名字排序嘛,这样用户就可以预见他想要的数据在什么地方了

发现还不是想要的效果,这也不能怪mysql,毕竟中文博大精深,而我们的目标实际是中文的拼音排序,默认情况下mysql是不认识的(虽然我的数据库所有编码都已经设置为了utf-8)。

用‘强大’的百度查了下,mysql要想实现中文拼音排序有两种常用的办法:

第一种

不修改表结构,只修改查询语句:

明确的告诉mysql我这个字段要以gbk编码处理(用gb2312也可以的)

  1. 如果数据表tbl的某字段name的字符编码是latin1_swedish_ci
  2. select * from `tbl` order by birary(name) asc ;
  3. 如果数据表tbl的某字段name的字符编码是utf8_general_ci
  4. SELECT name FROM `tbl` WHERE 1 ORDER BY CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC
  5. ===================
  6. 底层原理$orderby="convert(`group` USING gbk) COLLATE gbk_chinese_ci,displayorder,navid"

第二种

修改表结构不修改查询语句:

重点在红框位置,告诉mysql这个字段按照gbk编码处理(也可以是gb2312_chinese_ci)

效果和第一种方法一样

还有一种我没有验证的方法,网友提供的,大家可以参考下:

如果你使用源码编译MySQL,可以编译MySQL时使用 –with–charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也可以用 extra-charsets=gb2312,gbk 来加入多个字符集。

其实看到这里大家都已经明白了,说来说去还是编码的问题在作怪。只要是做开发的,肯定少不了遇到编码的问题,都被编码坑过。特别是数据库,编码问题更重要,上线之前编码如果处理不好,后续可能造成致命的伤。

补充一个我收集的处理mysql编码的资料。

通过 show variables like '%character_set%' 查看已有编码:

修改mysql的编码方式可以有以下几个:

1.通过配置文件修改my.ini(windows下)或/etc/my.cnf(linux下)

分别添加如下内容

[mysqld]

character_server_set=utf8

[mysql]

default-character-set=utf8

[mysql.server]

default-character-set=utf8

[mysql_safe]

default-character-set=utf8

[client]

default-character-set=utf8

2.创建数据库时设置编码

create database test character set utf8;

3.创建表时设置编码

create table test(id int primary key)DEFAULT charset=utf8;

4.修改数据库编码

alter database test character set utf8;

5.修改表默认编码

alter table test character set utf8;

6.修改字段编码

alter table test modify col_name varchar(50) CHARACTER SET utf8;

原文发布于微信公众号 - 风帆(wdswhf)

原文发表时间:2019-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券