前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thinkphp中MySQL按照中文拼音排序问题的处理

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

作者头像
php007
发布2019-08-05 15:17:55
2.4K0
发布2019-08-05 15:17:55
举报
文章被收录于专栏:PHP专享栏PHP专享栏
背景

由于客户需求,需要按照汉字的首字拼音排序,项目开发中免不了数据的排序问题,排序中又免不了对中文的处理。今天分享一下如何在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;

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 风帆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档