缺少前导零';s插入字符串时


Missing leading Zero's when inserting Strings


实际上,我对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...";
}

这是由SQLite使用动态类型引起的。来自常见问题解答:

这是一个特性,而不是bug。SQLite使用动态类型。它不强制执行数据类型约束。任何类型的数据都可以(通常)插入到任何列中。您可以将任意长度的字符串放入整数列中,将浮点数字放入布尔列中,或将日期放入字符列中。在CREATE TABLE命令中分配给列的数据类型不会限制可以将哪些数据放入该列。每一列都可以容纳任意长度的字符串。

从链接页面(强调矿):

为了最大限度地提高SQLite和其他数据库引擎之间的兼容性,SQLite支持列上"类型亲和性"的概念。列的类型相关性是存储在该列中的数据的推荐类型这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据只是有些列在有选择的情况下更喜欢使用一个存储类而不是另一个。列的首选存储类称为其"亲和性"。

所以SQLite动态地将您的值强制转换为integer。

我建议将start_hourstart_minute组合为start_time(与end_字段相同),并以00:00的格式存储该值。

SQLite将按原样存储,但它足够聪明,可以识别时间值,并允许您执行日期/时间操作:

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

请确保列的类型设置为整数(或任何其他数字类型),而不是TEXT。

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

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

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

使用varchar而不是字符串,我遇到了同样的问题,然后我使用了varchar(长度),它在上运行良好