插入数据时mysql奇怪的行为

时间:2014-01-04 15:47:47

标签: mysql

通过phpmyadmin页面或通过python将数据插入mysql时我看到了一些我无法解释的内容:

    cur.execute("INSERT INTO 28AA507A0500009E (timestamp, temp) VALUES ('2014-01-04 15:36:30',24.44)")
    cur.execute("INSERT INTO 28D91F7A050000D9 (timestamp, temp) VALUES ('2014-01-04 15:36:30',24.44)")
    cur.execute("INSERT INTO `28012E7A050000F5` (timestamp, temp) VALUES ('2014-01-04 15:36:30',24.44)")

注意表格周围带有`的最后一个条目。 没有撇号,前两个条目的工作正常 我也可以将撇号放在所有表名周围,它仍然可以工作。 为什么我可以从前两行而不是第三行远程撇号?

这些表格都是平等的。

1 个答案:

答案 0 :(得分:3)

编辑1
适当考虑以下意见:

  1. Your explanation is not entirely accurate. There is no alias in the INSERT statement. I think that the part of the identifier after 28012E7 is just discarded as MySQL tries convert the identifier to an integer value! - ypercube
  2. these are table names not column names. - Sly Raskal
  3. 好吧,MySQL肯定已经丢弃了表名标识符的一部分。我的目的是提出当系统无法在可访问的表名列表中找到它时如何解释标识符名称(我在我的示例中选择了列/表达式名称)。由于引擎将其解释为有效数字而不是表示表的标识符,因此它引发了异常。

    我选择SELECT澄清,为什么表标识符因没有放回引号而被拒绝。因为它代表一个数字,所以它不能直接用作标识符,而应该用后引号括起来。


    MySQL允许在数字后面添加别名,数字表达式用大括号或文字包围。令人惊讶的是,它们之间的空间是可选的。

    在您的情况下,28012E7A050000F5是带有别名28012E7的数字280120000000的有效指数表单(A050000F5)。因此,28012E7A050000F5不能用作没有引号的列名。见以下观察:

    mysql> -- select 28012E7 as A050000F5;
    mysql> select 28012E7A050000F5;
    +--------------+
    | A050000F5    |
    +--------------+
    | 280120000000 |
    +--------------+
    1 row in set (0.00 sec)
    

    以下是一些有效的例子:

    mysql> -- select ( item_count * price ) as v from orders;
    mysql> select ( item_count * price )v from orders;
    +-----+
    | v   |
    +-----+
    | 999 |
    +-----+
    1 rows in set (0.30 sec)
    
    mysql> -- select ( 3 * 2 ) as a, 'Ravinder' as name;
    mysql> select ( 3 * 2 )a, 'Ravinder'name;
    +---+----------+
    | a | name     |
    +---+----------+
    | 6 | Ravinder |
    +---+----------+
    1 row in set (0.00 sec)