【问题标题】:Missing leading Zero's when inserting Strings插入字符串时缺少前导零
【发布时间】:2015-11-16 13:29:49
【问题描述】:


实际上,我对 PHP 和 SQLite3 以及我的一些字符串在那里的行为方式非常生气。
我尝试保存开放时间,但使用字符串而不是数字来防止前导零出现问题(现在仍然有它,哈哈...-.-)。
小时和分钟有自己的列,但是当我插入“0x”时,零消失了,无论 x 是什么,都留在数据库中。 :/
我确定我只是在某处错过了一些该死的小部分......
我已经检查了 INSERT 语句,但什么也没找到。
插入字符串示例:
INSERT INTO opening INSERT INTO opening (start_day, end_day, start_hour, start_minute, end_hour, end_minute) VALUES('Montag', 'Freitag', '00', '00', '01', '00')
但输出是:

11|Montag|Freitag|0|0|1|0

部分代码:

class Database_Opening_Hours extends SQLite3{
    function __construct() {
        if(!file_exists("../../data/opening_hours/opening_hours.sqlite")){
            $this->open("../../data/opening_hours/opening_hours.sqlite");
            $this->exec('CREATE TABLE opening (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, start_day STRING, end_day STRING, start_hour STRING, start_minute STRING, end_hour STRING, end_minute STRING)');
        }
        else{
            $this->open("../../data/opening_hours/opening_hours.sqlite");
        }
    }
}
$db = new Database_Opening_Hours();
$insert = "INSERT INTO opening (start_day, end_day, start_hour, start_minute, end_hour, end_minute) VALUES('".htmlspecialchars($_GET["start_day"])."','".htmlspecialchars($_GET["end_day"])."','".$start_hour."','".$start_minute."','".$end_hour."','".$end_minute."')";
if($db->exec($insert)){
    $db->close();
    unset($db);
    echo "Insert erfolgreich";
}else{
    $db->close();
    unset($db);
    echo "Nicht wirklich...";
}

【问题讨论】:

标签: php sqlite


【解决方案1】:

相当确定您的列类型设置为整数(或任何其他数字类型)而不是 TEXT。

确保仔细检查列数据类型并实际转储表以供我们检查它是否真的设置为 TEXT。

【讨论】:

    【解决方案2】:

    这是由使用动态类型的 SQLite 引起的。来自FAQ

    这是一项功能,而不是错误。 SQLite 使用dynamic typing。它不强制执行数据类型约束。任何类型的数据都可以(通常)插入到任何列中。您可以将任意长度的字符串放入整数列、布尔列中的浮点数或字符列中的日期。您在 CREATE TABLE 命令中分配给列的数据类型不会限制可以将哪些数据放入该列。每列都可以保存任意长度的字符串。

    从链接页面(强调我的):

    为了最大化 SQLite 和其他数据库引擎之间的兼容性,SQLite 支持列上的“类型亲和性”概念。列的类型亲和性是存储在该列中的数据的推荐类型。 这里的重要思想是该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是某些列在选择时会更喜欢使用一种存储类而不是另一种。列的首选存储类称为“亲和性”。

    所以 SQLite 动态地将你的值转换为整数。

    我建议将start_hourstart_minute 组合成start_timeend_ 字段相同)并将值存储为00:00 格式。

    SQLite 将按“原样”存储此数据,但它足够智能,可以识别时间值并允许您执行日期/时间操作:

    select time(start_time, '+1 hour') from opening
    

    【讨论】:

      【解决方案3】:

      我在使用 C/C++ 时遇到了这个问题,因为我没有引用字符串:

      insert into test values('aa', 'bb');
      

      【讨论】:

        【解决方案4】:

        使用 varchar 代替字符串,我遇到了同样的问题,然后我使用了 varchar(length) 并且效果很好

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多