mysqk怎样实现gbk_bin编码又不区分大小写? 名字字段可能是中英文混合的为了按中文排序名字字段采用gbk_bin编码,可是搜索时又需要按不区分大小写,怎么实现才能达到效率比较高? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么不直接使用 gb2312_chinese_ci ? select * from tt where upper(f1)='XX' or lower(f1)='xx' orWHERE a.`subject` COLLATE gb2312_chinese_ci='xx' 直接gb2312_chinese_ci, 中文不能按拼音排序 估计这个吧,WHERE a.`subject` COLLATE gb2312_chinese_ci='xx' 你为了那个小功能的话,会导致无法使用索引的,建议使用:gb2312_chinese_ci校对规则进行匹配比较但是可以考虑对输出记录集时,进行校对规则转换,也即SELECT CONVERT(...) FROM #****************************************#MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops#****************************************# 下面例子,并没有汉字排序的顺序啊。 当然GB2312本身并不是严格按拼音排序的。理论上说是按照GB2312的编码顺序来排序,而这个编码顺序的前面常用汉字除多音字外是按拼音排的。mysql> show full columns from x;+-------+-------------+-------------------+------+| Field | Type | Collation | Null |+-------+-------------+-------------------+------+| id | int(11) | NULL | NO || c1 | varchar(30) | gb2312_chinese_ci | YES || c2 | varchar(30) | gb2312_bin | YES |+-------+-------------+-------------------+------+3 rows in set (0.02 sec)mysql>mysql> select * from x;+----+--------+--------+| id | c1 | c2 |+----+--------+--------+| 1 | A1000 | A1000 || 2 | a2000 | a2000 || 3 | A3000 | A3000 || 4 | 中000 | 中000 || 5 | 不000 | 不000 || 6 | A音000 | A音000 |+----+--------+--------+6 rows in set (0.03 sec)mysql> select * from x order by c1;+----+--------+--------+| id | c1 | c2 |+----+--------+--------+| 1 | A1000 | A1000 || 2 | a2000 | a2000 || 3 | A3000 | A3000 || 6 | A音000 | A音000 || 5 | 不000 | 不000 || 4 | 中000 | 中000 |+----+--------+--------+6 rows in set (0.00 sec)mysql> select * from x order by c2;+----+--------+--------+| id | c1 | c2 |+----+--------+--------+| 1 | A1000 | A1000 || 3 | A3000 | A3000 || 6 | A音000 | A音000 || 2 | a2000 | a2000 || 5 | 不000 | 不000 || 4 | 中000 | 中000 |+----+--------+--------+6 rows in set (0.00 sec)mysql> 这个直接的字符集转换明显会比UPPER函数要快。 但这个建议还是直接把你的字段设置为gb2312_chinese_ci,这样可以在查询中直接利用索引。 谢谢两位大牛,我听你们的使用gb2312_chinese_ci。还有点问题,为了搜出尽量多的记录,我用的是 name like "%key%"看到一些文档说这个不能使用索引? 还有点问题,为了搜出尽量多的记录,我用的是 name like "%key%"看到一些文档说这个不能使用索引?对,这种形式%key% 不能使用索引 gb2312_chinese_ci中文不能排序问题,可能跟系统有关。我用的是linux。用php select出来的结果不能排序但用mysql客户端select出的结果是可以排序 原来 SELECT * FROM gpy_manufacturer ORDER BY CONVERT(name USING gbk)可以对gb2312_chinese_ci中文进行排序,不用gbk_bin了问题圆满解决,结帖 关于全文索引的问题! 插入数据疑惑 MYSQL局部变量的怪异问题 大数据查询,多个表,联全查询问题 查出table2表中数据不存在table1中,数据量大时候非常缓慢,请教如何解决?(在线等) Debian下怎样才能把MySQL文件建在指定地方? mysql front查看中文数据是乱码 如何用C语句将检索的结果提取出来 问个弱问题! 请教如何将Daemon邮件服务器与mysql整合 SQL语句问题。。。!!!!!!!!!!!!! MySql配置文件my.cnf下划线
WHERE a.`subject` COLLATE gb2312_chinese_ci='xx'
直接gb2312_chinese_ci, 中文不能按拼音排序
但是可以考虑对输出记录集时,进行校对规则转换,也即SELECT CONVERT(...) FROM
#****************************************#
MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
#****************************************#
+-------+-------------+-------------------+------+
| Field | Type | Collation | Null |
+-------+-------------+-------------------+------+
| id | int(11) | NULL | NO |
| c1 | varchar(30) | gb2312_chinese_ci | YES |
| c2 | varchar(30) | gb2312_bin | YES |
+-------+-------------+-------------------+------+
3 rows in set (0.02 sec)mysql>
mysql> select * from x;
+----+--------+--------+
| id | c1 | c2 |
+----+--------+--------+
| 1 | A1000 | A1000 |
| 2 | a2000 | a2000 |
| 3 | A3000 | A3000 |
| 4 | 中000 | 中000 |
| 5 | 不000 | 不000 |
| 6 | A音000 | A音000 |
+----+--------+--------+
6 rows in set (0.03 sec)mysql> select * from x order by c1;
+----+--------+--------+
| id | c1 | c2 |
+----+--------+--------+
| 1 | A1000 | A1000 |
| 2 | a2000 | a2000 |
| 3 | A3000 | A3000 |
| 6 | A音000 | A音000 |
| 5 | 不000 | 不000 |
| 4 | 中000 | 中000 |
+----+--------+--------+
6 rows in set (0.00 sec)mysql> select * from x order by c2;
+----+--------+--------+
| id | c1 | c2 |
+----+--------+--------+
| 1 | A1000 | A1000 |
| 3 | A3000 | A3000 |
| 6 | A音000 | A音000 |
| 2 | a2000 | a2000 |
| 5 | 不000 | 不000 |
| 4 | 中000 | 中000 |
+----+--------+--------+
6 rows in set (0.00 sec)mysql>
这个直接的字符集转换明显会比UPPER函数要快。 但这个建议还是直接把你的字段设置为gb2312_chinese_ci,这样可以在查询中直接利用索引。
谢谢两位大牛,我听你们的使用gb2312_chinese_ci。还有点问题,为了搜出尽量多的记录,我用的是 name like "%key%"
看到一些文档说这个不能使用索引?
看到一些文档说这个不能使用索引?对,这种形式%key% 不能使用索引
gb2312_chinese_ci中文不能排序问题,可能跟系统有关。
我用的是linux。
用php select出来的结果不能排序
但用mysql客户端select出的结果是可以排序
SELECT * FROM gpy_manufacturer ORDER BY CONVERT(name USING gbk)
可以对gb2312_chinese_ci中文进行排序,不用gbk_bin了问题圆满解决,结帖