表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. Apache-一个IP多个主机域名

    #配置虚拟主机名 NameVirtualHost 192.168.209.128 <VirtualHost 192.168.209.128> DocumentRoot /htdocs/wi ...

  2. iOS UIKit Dynamics入门 UIKit动力学,实现重力、连接、碰撞、悬挂等动画效果

    本文为转载文章 版权归原文所有 什么是UIKit动力学(UIKit Dynamics) 其实就是UIKit的一套动画和交互体系.我们现在进行UI动画基本都是使用CoreAnimation或者UIVie ...

  3. iOS GCD中级篇 - dispatch_group的理解及使用

    上一篇GCD基础篇,以及同步.异步,并发.并行几个概率的理解 关于dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相 ...

  4. Foundations of Machine Learning: Boosting

    Foundations of Machine Learning: Boosting Boosting是属于自适应基函数(Adaptive basis-function Model(ABM))中的一种模 ...

  5. 基于node.js的web框架express

    1.安装node.js方法: window :https://nodejs.org/en/ linux:http://www.runoob.com/nodejs/nodejs-install-setu ...

  6. Hadoop分布式文件系统使用指南

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_user_guide.html 目的 概述 先决条件 Web接口 Shell命令 DFSAdmin命 ...

  7. 工作总结 Mapper.Map 映射 AutoMapper

    对象映射工具 //1.创建映射规则  ,第一个参数为源实体(Model),第二个为目标实体(DTO) Mapper.CreateMap<studentSource, studentPurpost ...

  8. OGG_GoldenGate检查点应用Checkpoint(案例)

    2014-03-06 Created By BaoXinjian

  9. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful(双连通)

    HDU 3849 By Recognizing These Guys, We Find Social Networks Useful pid=3849" target="_blan ...

  10. Python 列表 sort() 方法

    描述 Python 列表 sort() 方法对列表进行排序. 语法 sort() 方法语法: L.sort([key=None][,reverse=False]) 参数 key-- 可选参数, 如果指 ...