【问题标题】:Python - MYSQL - Select leading zerosPython - MYSQL - 选择前导零
【发布时间】:2009-08-20 18:36:39
【问题描述】:

当使用 Python 并对 MYSQL 执行 Select 语句以从列中选择 09 时,将删除 0,仅打印 9。

有没有办法提取所有数字,即包括前导零?

【问题讨论】:

  • 列的数据类型是什么?它是文本列(varchar)还是真正的数字列(整数、小数,...)?如果只是如何打印值的问题,则可以使用 Python 的 % 运算符,例如 "%04d" % (value_of_column,)
  • 列类型是tinyint。使用 PHP 从表中选择时,它给了我前导零

标签: python mysql


【解决方案1】:

几乎可以肯定,在您的查询、表定义或您正在使用的 ORM 中,有些东西认为该列是数字并将结果转换为整数。如果要保留前导零,则必须将列定义为字符串(无处不在!)。

编辑:服务器上的ZEROFILL 不会删除它。 Python 将整数列视为 Python 整数,并且那些没有前导零的句点。您要么必须将列类型更改为 VARCHAR,在 Python 中使用类似 "%02d" % val 的内容,要么在查询中输入 CAST(my_column AS VARCHAR)

【讨论】:

    【解决方案2】:

    MySQL 在列定义中支持这一点:

    CREATE TABLE MyTable (
      i TINYINT(2) ZEROFILL
    );
    
    INSERT INTO MyTable (i) VALUES (9);
    
    SELECT * FROM MyTable;
    
    +------+
    | i    |
    +------+
    |   09 | 
    +------+
    

    【讨论】:

    • 是的,前导零在表中,但不在 Python 中的 select 和 print 语句中
    【解决方案3】:

    按照Eevee 的建议,最好的选择是使用CAST,但你必须使用CAST ( ur_field AS CHAR(2) ) 来转换为varchar,这个问题在这篇文章中给出

    How to convert from varbinary to char/varchar in mysql

    【讨论】:

      【解决方案4】:

      列是什么数据类型?如果您想保留前导零,您可能应该使用非数字列类型,例如VARCHAR

      要在 Python 中使用前导零格式化数字,请使用格式说明符:

      >>> print "%02d" % (1,)
      01
      

      【讨论】:

      • 列类型为tinyint。当使用 PHP 从表中选择时,它给了我前导零。
      • 这听起来像是一个 PHP 错误。数字不应有前导零。
      【解决方案5】:

      您可以通过以下函数对该列运行每个查询:

      if len(str(number)) == 1: number = "0" + str(number)
      

      这会将数字转换为字符串,但据我所知,Python 不允许在其数字数据类型中使用前导零。如果我错了,请有人纠正我。

      编辑:约翰米利金的回答与此相同,但效率更高。感谢您教我有关格式说明符的知识!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 2018-07-02
        • 2012-10-09
        • 2014-03-04
        • 2013-03-03
        相关资源
        最近更新 更多