名字字段可能是中英文混合的
为了按中文排序名字字段采用gbk_bin编码,可是搜索时又需要按不区分大小写,怎么实现才能达到效率比较高?

解决方案 »

  1.   

    为什么不直接使用 gb2312_chinese_ci ?
      

  2.   

    select * from tt where upper(f1)='XX' or lower(f1)='xx' 
      

  3.   

    or
    WHERE a.`subject` COLLATE gb2312_chinese_ci='xx'
      

  4.   


    直接gb2312_chinese_ci, 中文不能按拼音排序
      

  5.   

    估计这个吧,WHERE a.`subject` COLLATE gb2312_chinese_ci='xx'
      

  6.   

    你为了那个小功能的话,会导致无法使用索引的,建议使用:gb2312_chinese_ci校对规则进行匹配比较
    但是可以考虑对输出记录集时,进行校对规则转换,也即SELECT CONVERT(...) FROM 
    #****************************************#
    MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
    #****************************************#
      

  7.   

    下面例子,并没有汉字排序的顺序啊。 当然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>
      

  8.   


    这个直接的字符集转换明显会比UPPER函数要快。 但这个建议还是直接把你的字段设置为gb2312_chinese_ci,这样可以在查询中直接利用索引。
      

  9.   


    谢谢两位大牛,我听你们的使用gb2312_chinese_ci。还有点问题,为了搜出尽量多的记录,我用的是 name like "%key%"
    看到一些文档说这个不能使用索引?
      

  10.   

    还有点问题,为了搜出尽量多的记录,我用的是 name like "%key%"
    看到一些文档说这个不能使用索引?对,这种形式%key% 不能使用索引
      

  11.   


    gb2312_chinese_ci中文不能排序问题,可能跟系统有关。
    我用的是linux。
    用php select出来的结果不能排序
    但用mysql客户端select出的结果是可以排序
      

  12.   

    原来 
    SELECT * FROM gpy_manufacturer ORDER BY CONVERT(name USING gbk)
    可以对gb2312_chinese_ci中文进行排序,不用gbk_bin了问题圆满解决,结帖