前言:
现在朋友们对“mysql汉字拼音首字母查询”大约比较珍视,大家都需要学习一些“mysql汉字拼音首字母查询”的相关知识。那么小编也在网上网罗了一些对于“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也可以的)
如果数据表tbl的某字段name的字符编码是latin1_swedish_ci
select * from `tbl` order by birary(name) asc ;
如果数据表tbl的某字段name的字符编码是utf8_general_ci
SELECT name FROM `tbl` WHERE 1 ORDER BY CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC
===================
底层原理$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;
标签: #mysql汉字拼音首字母查询