• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > MySQL的where查询的重新认识

MySQL的where查询的重新认识

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了MySQL,where查询,重新认识等相关知识,希望对您有所帮助

今天加班,业务的妹子过来找我们查数据,说数据查出来量不对。一看妹子的SQL是这样写的:

select distinct * from prvt_pub_stmt_vnwhere issue_time >= '2020-08-01'and issue_time <= '2020-08-01'and prs_dmtd_cde in ('p','n');

我分析来分析去,感觉没有问题呀,于是查了一下prs_dmtd_cde 字段的码值,发现不仅有大写的P还有小写的p,而妹子只查了小写的p,数据量却多了很多。

于是我就把妹子的SQL改了一下:

select distinct * from prvt_pub_stmt_vnwhere issue_time >= '2020-08-01'and issue_time <= '2020-08-01'and prs_dmtd_cde in ('p','n','P','N');

查出来的结果竟然是一样的。这就。。。

在妹子面前当然不能说不行啊,于是让妹子先回去再看看。

我这边飞快的上网查了查,发现竟然是MySQL 的编码格式和排序规则的问题。


我们MySQL数据库基本上用的都是 utf8 的编码格式,而 utf8 编码格式还存在各种排序规则。常用的如下:

utf8_bin:将字符串中的每一个字符以十六进制方式存储数据,区分大小写。

utf8_general_ci:不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

再查一下默认的字符集设置:


5f61c9dd3bd62.jpg


刚好 utf8 编码格式的默认排序规则就是:utf8_general_ci——即不区分大小写。

解决方案

问题原因找到了,那就对症下药好了。

解决方法自然就是直接修改字段的 collate 属性为 utf8_bin。

ALTER TABLE prvt_pub_stmt_vn CHANGE prs_dmtd_cde prs_dmtd_cde VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

另外还有一种解决方法,就是不改变原有表结构,而是改SQL。在查询字段前加上 binary 关键字。

select distinct * from prvt_pub_stmt_vnwhere issue_time >= '2020-08-01'and issue_time <= '2020-08-01'and binary prs_dmtd_cde in ('p','n');

Mysql 默认查询是不分大小写的,可以在 SQL 语句中加入 binary 来区分大小写。

binary 不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写。

最后

问题解决了,当然是去告诉妹子这个问题多么多么深奥,我又是如何剖析原理最终解决的了。

看着妹子投来的崇拜目光,当然是很开心了。

最最重要的还是要记住这个问题,以后在遇到字段大小写敏感的业务,建表的时候要注意字符集和排序规则的选择,以避免今天这种事情的发生。



分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • PHP存入mysql乱码怎么办
  • PHP使用mysqli同时执行多条sql查询语句的实例
  • MySQL怎么修改一列的值
  • 怎么解决phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的问题
  • Centos MySQL 忘记密码怎么办
  • Mysql怎么查看字段的属性值
  • 宝塔Linux面板之修改MySQL默认保存位置
  • 如何修改mysql的默认时区
  • 如何解决mysql 5.6 中文 乱码问题
  • 解决linux下mysql启动失败的问题

相关文章

  • 介绍thinkphp5框架中的hook机制
  • SEO的基础原则
  • wordpress错误提示”抱歉,由于安全原因,这个文件类型不受支持。”解决方法
  • Photoshop设计游戏简洁风格的标志教程
  • Nginx怎么增加SSL模块
  • 你知道Laravel Collection的实际使用场景什么吗?
  • Vue中Computed和Watch的用法及区别
  • 如何利用百度外链工具建立有效外链
  • 解决PHPstudy V8.0打开phpMyAdmin显示错误问题
  • 实现从Redis中订阅消息转发到 WebSocket 客户端

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 分享Laravel7消息通知日期序列化解决方案
    • Photoshop从零开始设计漂亮的网页模板
    • PHP的重载使用魔术方法代码实例详解
    • 织梦DedeCMS实现按键盘方向键实现上一篇下一篇翻
    • PHP实现搜索联想功能(基于字典树算法)
    • ThinkPHP菜单无极分类实例讲解
    • LNMP环境安装WordPress不显示主题,无法编辑解决方法
    • Mac搭建php的开发环境(图文详解)
    • 如何优化css expression性能
    • 随着微信支付的升级,PHP微信支付类V3接口也来了

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有