表1和表2是不同数据库中的同名table,但是发现表1中的查询和表2中的查询有区别,(事实是表1的查询是对的。)

表1的查询结果
mysql> select * from slot_value where slot_type_id='09FDBC8081294EF09D65F909E7FD9DE3' and slot_value='a bout de souffle' ;
+---------+----------------------------------+-------------------+
| id | slot_type_id | slot_value |
+---------+----------------------------------+-------------------+
| | 09FDBC8081294EF09D65F909E7FD9DE3 | a bout de souffle |
+---------+----------------------------------+-------------------+
row in set (0.02 sec)
mysql> select * from slot_value where slot_type_id='09FDBC8081294EF09D65F909E7FD9DE3' and slot_value='à bout de souffle' ;;
+---------+----------------------------------+--------------------+
| id | slot_type_id | slot_value |
+---------+----------------------------------+--------------------+
| | 09FDBC8081294EF09D65F909E7FD9DE3 | à bout de souffle |
+---------+----------------------------------+--------------------+
row in set (0.05 sec) 表2的查询结果
mysql> select * from back_brace.slot_value where slot_type_id='09FDBC8081294EF09D65F909E7FD9DE3' and slot_value='a bout de souffle' ;
+---------+----------------------------------+--------------------+
| id | slot_type_id | slot_value |
+---------+----------------------------------+--------------------+
| | 09FDBC8081294EF09D65F909E7FD9DE3 | a bout de souffle |
| | 09FDBC8081294EF09D65F909E7FD9DE3 | à bout de souffle |
+---------+----------------------------------+--------------------+
rows in set (2.65 sec) 囧了,竟然遇到上面的情况。。。。。。
但是通过查看对应的编码,是不同的:
mysql> select hex('a')
-> ;
+----------+
| hex('a') |
+----------+
| |
+----------+
row in set (0.01 sec) mysql> select hex('à');
+-----------+
| hex('à') |
+-----------+
| C3A0 |
+-----------+
row in set (0.01 sec) 接下来怀疑的是,表结构是否相同?
表1:
slot_value | CREATE TABLE `slot_value` (
`id` bigint() NOT NULL AUTO_INCREMENT,
`slot_type_id` varchar() COLLATE utf8_bin NOT NULL COMMENT 'slot类型id',
`slot_value` varchar() COLLATE utf8_bin NOT NULL COMMENT 'slot值',
PRIMARY KEY (`id`),
UNIQUE KEY `slot_value_uniq_index` (`slot_type_id`,`slot_value`,`out_value`),
KEY `slot_type_id` (`slot_type_id`),
KEY `slot_value_type_index` (`type`),
KEY `slot_value_type_id_index` (`slot_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='保存slot类型对应的值信息表,一个slot类型可以有多个slot_value值' | 表2:
| slot_value | CREATE TABLE `slot_value` (
`id` bigint() NOT NULL AUTO_INCREMENT,
`slot_type_id` varchar() NOT NULL COMMENT 'slot类型id',
`slot_value` varchar() NOT NULL COMMENT 'slot值',
PRIMARY KEY (`id`),
KEY `index_slot_type_id` (`slot_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COMMENT='保存slot类型对应的值信息表,一个slot类型可以有多个slot_value值' 发现表1和表2的不同之处,在于建表语句的稍微不同,表1的建表语句中有 COLLATE=utf8_bin,表2没有这句。
将表2修改表结构,增加表1中有的COLLATE=utf8_bin,修改的方法如下
alter table slot_value CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
修改后表结构如下:
slot_value | CREATE TABLE `slot_value` (
`id` bigint() NOT NULL AUTO_INCREMENT,
`slot_type_id` varchar() COLLATE utf8_bin NOT NULL COMMENT 'slot类型id',
`slot_value` varchar() COLLATE utf8_bin NOT NULL COMMENT 'slot值',
PRIMARY KEY (`id`),
KEY `index_slot_type_id` (`slot_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='保存slot类型对应的值信息表,一个slot类型可以有多个slot_value值' 再在表2上执行查询语句:
mysql> select * from slot_value where slot_type_id='09FDBC8081294EF09D65F909E7FD9DE3' and slot_value='à bout de souffle';
+---------+----------------------------------+--------------------+
| id | slot_type_id | slot_value |
+---------+----------------------------------+--------------------+
| | 09FDBC8081294EF09D65F909E7FD9DE3 | à bout de souffle |
+---------+----------------------------------+--------------------+
row in set (2.07 sec) mysql> select * from slot_value where slot_type_id='09FDBC8081294EF09D65F909E7FD9DE3' and slot_value='a bout de souffle';
+---------+----------------------------------+-------------------+
| id | slot_type_id | slot_value |
+---------+----------------------------------+-------------------+
| | 09FDBC8081294EF09D65F909E7FD9DE3 | a bout de souffle |
+---------+----------------------------------+-------------------+
row in set (2.34 sec) 完美解决问题。。。
但是为什么呢? 原来MySQL按照下面的方式选择表字符集和 校对规则:
如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。
否则,采用服务器字符集和服务器校对规则。
而我们在建表的时候指定了character set,所以它永远是采用对应的默认的校对规则。
当然我们其实也没必要重建表格,只需要alter table db_allot CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin这样转换即可。
另外建议collation都尽量采用字符集相应的bin类型的校对规则,这样不容易出错。 此外遇到这种情况,不用逐个改字段属性,而只要表格级别的collation就行了。
(对MySQL数据库中的varchar字段有效) 参考文档《MySQL 的 collation》:http://blog.csdn.net/xfsnow/article/details/2885948

深入的介绍,待续。。。

Mysql通过一个限制条件,查出多条不同的记录的更多相关文章

  1. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

  2. [django/mysql] 使用distinct在mysql中查询多条不重复记录值的解决办法

    前言:不废话.,直接进入正文 正文: 如何使用distinct在mysql中查询多条不重复记录值? 首先,我们必须知道在django中模型执行查询有两种方法: 第一种,使用django给出的api,例 ...

  3. MySQL, 创建一个只读用户和一个所有权限用户

    安装pasa需要配置mysql.基本知识学习一下 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html MySQL 为关系型数据库 ...

  4. MySQL创建一个用户,指定一个数据库 授权

    Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...

  5. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

  6. 转:mysql 创建一个用户,指定一个数据库

    转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...

  7. mysql 查询每个分组前N条记录

    mysql 查询每个分组前N条记录 假设存在表movie,  有字段 id, part(地区), mcount(观看次数) 现查询每个地区观看次数最多的3部movie, 则表 ###id虽未存在gro ...

  8. 使用ThinkPHP开发中MySQL性能优化的最佳21条经验

    使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...

  9. mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

随机推荐

  1. 【OpenERP】Report 生成

    以模块oecnj_trainning为例,模块路径: ~/openerp/addons/oecn_training/ ,以下简写为 path/oecn/ Report生成方法:(手写) rml + r ...

  2. 检查用户输入信息是否完整(vb.net实现)

        机房收费系统中.在将用户输入的信息封装到实体中作为參数传到B层之前,总要对用户输入的信息进行检查.我将这种检查分为两类: 合法性检查 完整性检查     所谓合法性检查,就是用户输入的信息是否 ...

  3. 19、java内存分配 常量池详解

    在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...

  4. linux shutdown命令

    shutdown [-t 秒] [-arkhncfF] 时间 [警告信息] 常用选项与参数: -t sec : -t 后面加秒数,亦即『过几秒后关机』的意思 -k : 不要真的关机,只是发送警告信息出 ...

  5. Apache Hadoop 3.0新版本介绍及未来发展方向

    过去十年,Apache Hadoop从无到有,从理论概念演变到如今支撑起若干全球最大的生产集群.接下来的十年,Hadoop将继续壮大,并发展支撑新一轮的更大规模.高效和稳定的集群. 我们此次将向大家全 ...

  6. IT忍者神龟之 oracle行转列、列转行

    一.行转列 须要将例如以下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum).结合group by分组实现的 create table test( id varc ...

  7. java测试Unicode编码以及数组的运用(初学篇)

    /*第二章第四小题*/ /* * (1)编写一个应用程序,给出汉字“你” ,“我”,“他”在Unicode 表中的位置 * (2)编写一个java应用程序,输出全部的希腊字母 */ public cl ...

  8. postgresql命令行[转]

    postgresql命令行 原文链接 PostgreSQL 8.1 中文文档 连接数据库, 默认的用户和数据库是postgrespsql -U user -d dbname \c dbname 切换数 ...

  9. SQL Server 2005/2008遍历所有表更新统计信息

    DECLARE UpdateStatisticsTables CURSOR READ_ONLY FOR 02   SELECT sst.name, 03          Schema_name(ss ...

  10. python学习笔记——multiprocessing 多进程组件 Pipe管道

    进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...