我遇到了很多不同的方法,这些方法可以从零填充列中检索整数值,有些方法看起来比其他方法花费更多。由于必须不时地从数据库中的零填充列中检索整数值,所以我想知道如何最好地检索它们。
在过去的几年中,我使用/看到过类似于以下内容的声明:
SET @zerofillExample = '000022';
SELECT CAST(@zerofillExample AS unsigned);
SELECT @zerofillExample+0;
SELECT @zerofillExample*1;
SELECT TRIM(LEADING '0' FROM @zerofillExample);
如果在铸造零填充柱的不同方式上没有性能差异,那么我是否不了解某些标准?
为清楚起见,更新:
'0000001'!==1
。我很清楚,使用不同的列定义是不可以的,但这不是问题的重点。 答案 0 :(得分:1)
简单的经验法则:普通表达式(示例中的全部4个)在查询性能中起着不重要的作用。
请注意,此外,确实需要 no 表达式:
mysql> SELECT '000022' + 1;
+--------------+
| '000022' + 1 |
+--------------+
| 23 |
+--------------+
也就是说,具有所有数字的字符串可以用作数字,而无需任何转换,甚至不能处理前导零。
您见过INT(6)
吗?您知道(6)
是什么意思吗?没事。
也就是说,除非您有INT(6) ZEROFILL
。现在,如果您INSERT
22
进入这样的列,然后显示它,您将得到000022
。 值仅为22
; 显示的前导零。
当您说ZEROFILL
时,您是在要求前导零。您无需执行任何操作即可获取数值。但是,如果您必须_display_it不带前导零,那么您就需要任何麻烦。我更喜欢第五名:
SELECT 0+@zerofillExample;
0+...
是我在某些语言中看到的将字符串转换为数字的麻烦。尽管您实际上是从数字开始的,但这仍然使读者知道正在发生一些麻烦。
使用BENCHMARK()
-
SELECT BENCHMARK(1e7, CAST(@zerofillExample AS unsigned));
大约在0.45秒后恢复一次(在我的笔记本电脑上)。同上其他3种情况。但是,我不相信这一点,因为@zerofillExample
是一个字符串,而不是INT ZEROFILL
。