我记得在做SQL查询时读到过关于引用东西的文章,当你引用东西时,它就变成了一个字符串。我还读到不应该引用数字。现在,我找不到那个引号,我需要重温一下我的记忆,看看我是否应该引用数字。
发布于 2010-01-17 05:20:33
如果你想把数字当做数字对待,你就不应该引用数字。
你是正确的,记住它使它成为一个字符串。
SELECT 10 AS x
是完全合法的,并且(在大多数数据库引擎中)将返回数据类型为int (或其变体)的列。
如果您这样做:
SELECT '10' AS x
相反,您将获得文本数据类型。这在某些情况下可能也适用,但您需要决定结果是文本形式还是数字形式。
发布于 2010-01-17 05:20:59
下面是一个例子,引用会产生不一致的结果(在MySQL中):
select 1 < 1.0; // returns 0
select '1' < '1.0'; // returns 1
这是因为第二次比较是使用当前字符串排序规则执行的,而不是按数字排序。
最好不要引用数字,因为这将是数据库将字符串文字转换为用于比较的数值的额外不必要的步骤,并且可能会改变比较的含义。
发布于 2018-04-16 18:49:36
此答案适用于Microsoft SQL Server,特别是MSSQL2008 R2。
在手写SQL中,我永远不会引用数字(除非在varchar列中插入一个值,而插入的字符串恰好是一个数字)。但有时,当以编程方式生成SQL时,只引用所有内容可以使工作变得更简单。(这是在处理任何表的数据库维护脚本或库例程中实现的,而不需要事先知道列类型。)
我想知道这样做是否会造成性能损失。如果我在SQL语句中使用了带引号的值,服务器必须将其解析为字符串,然后将其转换为整数。但是,解析SQL无论如何都会涉及到将字符串转换为整数。并且查询解析时间通常只占总时间的一小部分。
我运行了一些测试语句,如下所示
insert into #t values (123, 123, 123), (123, 123, 123)
insert into #t values ('123', '123', '123'), ('123', '123', '123')
但是由于#t
中的列数较多,因此一次插入的值元组就会较多,并且每个语句都会重复多次。我碰巧使用Perl来做这件事:
$dbh = my_database_connection(); # using DBD::Sybase
$n = 20; # this many value tuples, and also repeated this many times
$v = "'123'";
# $v = 123; # uncomment this to insert without quoting
@cols = 'aa' .. 'zz';
@ds = map { "[$_] int not null" } @cols;
@vs = map { $v } @cols;
$" = ", ";
$dbh->do("create table #t (@ds)");
foreach (1 .. $n) {
$sql = 'insert into #t values ';
$sql .= "(@vs), " foreach 1 .. $n;
$sql =~ s/, \z//;
$dbh->do($sql);
}
但是您可以用任何语言编写相同的基准测试。对于引用的情况和未引用的情况,我运行了几次,并且没有观察到速度上的显著差异。(在我的设置中,一次运行大约需要10秒;显然,您可以更改$n
来使其更快或更慢。)
当然,如果生成的SQL中包含冗余的引号字符,则生成的SQL会更大。它肯定不能再快了,但它似乎没有明显的慢。
有了这个结果,我将简化我的SQL生成代码,在所有值两边添加单引号,而不需要知道要插入的列的数据类型。(代码仍然需要通过确保输入值本身不包含‘字符或巧妙地引用来防御SQL注入。)
我仍然不建议在正常的过程中在SQL中引用数字,但如果您发现必须这样做,它似乎不会造成任何伤害。类似地,在生成的代码中,无论是否需要,我都会在列名周围加上[]
,但我认为这在手写SQL中是不必要的。
https://stackoverflow.com/questions/2078942
复制相似问题