mysql - sql numeric db 列如何与数字字符串值一起使用
问题描述
我有一个与 SQL 有关的问题。
我最近正在编写一个应用程序,其中 sql 查询是根据用户从 UI 的输入动态生成的。有趣的是,从 UI 传递的值列表都是字符串。我被告知要添加对数值的支持。但我注意到传递numeric string value
给数字字段也有效。
例如:
Select * from employee where id = 36815
和
Select * from employee where id = "36815"
我的问题是为什么第二个查询有效。即使我将=
运算符更改为<
or >
,它仍然有效。我想知道它为什么起作用,我们是否应该按原样支持它。对数字 db 列使用数字字符串字段可能有什么缺点。
谢谢。
解决方案
数据库中的值具有类型。而且,您应该学会不要在表达式中混合类型——尤其是在where
和on
子句中——因为这种混合会混淆优化器。
你的表情发生了什么?SQL 编译器看到类似:
where <number> = <string>
根据 SQL 的规则,它表示需要将字符串转换为数字。MySQL 通过转换前导数字来做到这一点。所以结果是这样的:
where <number> = cast(string as int)
(尽管允许使用非整数)。
请注意,这不是基于字符串是常量。仅在列的类型上。所以,如果表达式是:
where stringcol = 5
然后stringcol
将转换为数字。
推荐阅读
- c# - 将 c++ Pkcs7 符号移植到 c#
- c - 如何解决此错误:LLVM ERROR: Error parsing inline asm
- r - R sample.int(length(x), size, replace, prob) 中的错误:当“replace = FALSE”时,不能抽取大于总体的样本
- javascript - 努力在javascript中重置滑块输入
- android - Android TextView 使每行的字体大小不同
- oracle-apex - 基于用户输入的交互式网格的列顺序
- ios - 我想在选择或取消选择时以字典格式发送参数应该在字典中添加或删除元素
- amazon-web-services - 如何从 aws 秘密管理器中检索 terraform 中的秘密
- discord.js - 如何在我的命令 discord.js 项目中获取 name/id/@
- python - 根据条件创建总和行