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

本文涉及的产品
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 使用的是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 待解决

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
8月前
|
存储 缓存 监控
MySQL服务器配置优化:my.cnf参数调优指南
本文深入解析了MySQL核心配置参数及性能优化技巧,涵盖内存结构、调优原则、存储引擎优化、查询性能优化等内容,通过实战案例帮助读者构建高性能MySQL服务器配置,解决常见的性能瓶颈问题。
1186 0
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
697 67
|
11月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
SQL 存储 安全
MySQL:Prepared Statement 预处理语句
MySQL 预处理语句是一种高效、安全的执行 SQL 查询的方法。通过预编译 SQL 语句,可以显著提升查询性能,并有效防止 SQL 注入攻击。掌握预处理语句的使用方法,对于优化数据库操作和提高应用程序的安全性具有重要意义。希望本文能帮助你更好地理解和使用 MySQL 预处理语句。
659 7
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
2136 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的参数文件
MySQL启动时会读取配置文件my.cnf来确定数据库文件位置及初始化参数。该文件分为Server和Client两部分,包含动态与静态参数。动态参数可在运行中通过命令修改,而静态参数需修改my.cnf并重启服务生效。文中还提供了相关代码示例和视频教程。
371 6
|
存储 关系型数据库 MySQL
MySQL 字段类型探究:深入理解 Varchar(50) 与 Varchar(500)
在MySQL数据库中,`VARCHAR`类型是一种常用的字符串存储类型,它允许定义一个可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储和性能方面也有显著的区别。本文将深入探讨这两种字段类型的区别,以及它们在实际应用中的选择。
655 3
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
647 2
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
464 1

推荐镜像

更多