Mysql通过一个限制条件,查出多条不同的记录
表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通过一个限制条件,查出多条不同的记录的更多相关文章
- MYSQL性能优化的最佳20+条经验
MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论 131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...
- [django/mysql] 使用distinct在mysql中查询多条不重复记录值的解决办法
前言:不废话.,直接进入正文 正文: 如何使用distinct在mysql中查询多条不重复记录值? 首先,我们必须知道在django中模型执行查询有两种方法: 第一种,使用django给出的api,例 ...
- MySQL, 创建一个只读用户和一个所有权限用户
安装pasa需要配置mysql.基本知识学习一下 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html MySQL 为关系型数据库 ...
- MySQL创建一个用户,指定一个数据库 授权
Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- 转:mysql 创建一个用户,指定一个数据库
转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...
- mysql 查询每个分组前N条记录
mysql 查询每个分组前N条记录 假设存在表movie, 有字段 id, part(地区), mcount(观看次数) 现查询每个地区观看次数最多的3部movie, 则表 ###id虽未存在gro ...
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...
- mysql语句:批量更新多条记录的不同值
mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...
随机推荐
- Cocos2d-x新建模板编译问题总汇
0:关于使用VC模板创建模板时候脚本错误.改动..\cocos2d-x-2.2.2\template\msvc\CCAppWiz.win32\HTML\1033中文件属性中:安全->解除锁定. ...
- Web应用中的普通java程序获取资源文件
- Intellij IDEA 快捷键整理(dyCopy)
原文:http://www.cnblogs.com/tonycody/p/3257601.html [常规] Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “! ...
- 升级 asp.net core 1.1 到 2.0 preview
Upgrading to .NET Core 2.0 Preview 1 更新 依赖的类库 改为 标准库 2 web app 更改 csproj 文件---升级版本 <PropertyGrou ...
- 修改Cygwin的默认启动路径
原先启动Cygwin后,pwd显示: C:\Documents and Settings\Administrator@IBM-EBDC0EAC4B7 ~$ pwdC:\Documents and Se ...
- lua入门之二:c/c++ 调用lua及多个函数返回值的获取
当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...
- PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)
1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...
- HDUOJ--4565 So Easy!
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- JSEclipse—Eclipse上的JavaScript开发工具
http://blog.csdn.net/qiaogang2003/article/details/3035056原来js开发仅仅使用ue,不过开发效率比较低下. 找到一个Eclipse下的js开发工 ...
- 基于 html5 geolocation来获取经纬度地址(copy)
geolocation来获取经纬度地址 以前如果要获取互联网用户所在地都是根据用户的IP地址来获取地理位置,这样获取到的数据和真实数据有很大的偏差.为了获取更加精确的位置,可以使用了html5的geo ...