Mysql中varchar字符串的比较,swoole预处理参数绑定

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用的是php swoole,预处理。 解决有两条路:mysql的字段类型改为数字;研究swoole的参数预处理问题,可以测试普通PHP的预处理是否也有问题

写在前面


事情起因: 使用了一个varchar类型的字段储存数字值。 在根据该字段进行大小筛选的时候,出现该问题。 类似select * from sheets where s_status > 3


分析


php调用时条件传的是数字类型 组件生成的SQL语句直接执行正常


排查


打开了mysql的运行日志,分析到最终运行的sql语句大概如下


where s_status > '3'


使用的是php swoole,预处理。 解决有两条路


  • mysql的字段类型改为数字
  • 研究swoole的参数预处理问题,可以测试普通PHP的预处理是否也有问题


能学习的点


  • 字符串类型字段的比较规则


mysql中字符串类型字段的比较规则


找了一圈资料,相关文章比较少,终于在比较不起眼的角落里找到资料。


字符串比较 是根据ascii码比较 只有当第一个字符相同才对比第二个字符。以此类推。 在线转换ascii码工具 https://www.iamwawa.cn/ascii.html


假设我们现在表中有2条字段


id

s_status

s_name

1

4

测试1

2

258710588

测试2


如果按正常的sql执行 我筛选>3应该是2条结果都有,但是程序运行只能得到1条结果: id = 1的数据 那么我们上面说到 字符串的比较规则,从第一个字符开始比较,只有第一个字符相等 才会比较第二个字符… ‘4’ > ‘3’ 通过


字符 4 对应的ASCII码为 52
字符 3 对应的ASCII码为 51


‘258710588’ > ‘3’ 不通过


字符 2 对应的ASCII码为 50
字符 3 对应的ASCII码为 51
此时已经有结果 不需要对比第二个字符


如果是’31’ > ‘3’ 也会通过


第一个字符相同,则对比第二个字符,而3没有第二个字符了 所以是小于。


研究:php预处理时,参数绑定


// 省去连接等等
// 预处理及绑定
$stmt = $conn->prepare("SELECT * FROM `siam_test_bug` WHERE `s_wechat_cross_status` > ? ");
$condition = 3;
$stmt->bind_param("i", $condition); // 生成语句 > 3
$stmt->bind_param("s", $condition); // 生成语句 > '3'  就变成了字符串比较 不正常 
$res    = $stmt->execute();
$result = $stmt->get_result();
while ($myrow = $result->fetch_assoc()) {
    var_dump($myrow);
    echo "<br/>";
}


确定swoole


经过开发组内各位大哥的协助确定,是swoole的参数绑定,不支持决定类型,所以会出现这个坑。 已经提交swoole rfc 待解决

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
27天前
|
存储 关系型数据库 MySQL
MySQL 字段类型探究:深入理解 Varchar(50) 与 Varchar(500)
在MySQL数据库中,`VARCHAR`类型是一种常用的字符串存储类型,它允许定义一个可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储和性能方面也有显著的区别。本文将深入探讨这两种字段类型的区别,以及它们在实际应用中的选择。
80 3
|
4月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
235 67
|
27天前
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
39 2
|
1月前
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
77 1
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
585 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
SQL 关系型数据库 MySQL
数据库:MYSQL参数max_allowed_packet 介绍
数据库:MYSQL参数max_allowed_packet 介绍
143 2
|
4月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第29天】MySQL的match匹配多个字符串的语法
139 2
|
3月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
203 0
|
4月前
|
存储 关系型数据库 MySQL
|
4月前
|
前端开发 关系型数据库 MySQL
mysql截断字符串
在MySQL中,有多种方法可以实现字符串的截断,每种方法都有其特定的应用场景。通过灵活使用这些字符串处理函数,可以高效地对数据进行处理和分析。在实际的数据库操作中,根据实际需求选择最合适的函数是关键。
146 0