gpt4 book ai didi

ruby - SQLite3 将字符串存储为十六进制

转载 作者:行者123 更新时间:2023-12-03 03:52:57 28 4
gpt4 key购买 nike

在 Ruby 脚本中,我需要从现有的 g SQLite3 数据库中读取一些值。

DB = SQLite3::Database.open "#{App.root}/db/dm4sea_#{App.env}.db"

数据库有 1 个表(批处理),其结构如下

DB.execute "PRAGMA table_info(batches);"
=> [[0, "batch", "VARCHAR(30)", 0, nil, 1],
[1, "fdl", "INT", 0, nil, 0],
[2, "created_at", "DATETIME", 0, nil, 0],
[3, "updated_at", "DATETIME", 0, nil, 0]]

当前内容是

DB.execute "SELECT * FROM batches"
=> [["TTX1", 0, "2018-02-20 10:26:17 +0100", "2018-02-20 10:26:17 +0100"],
["TTX2", 0, "2018-02-20 10:36:33 +0100", "2018-02-20 10:36:33 +0100"],
["TTX3", 0, "2018-02-20 10:39:52 +0100", "2018-02-20 10:39:52 +0100"]]

然而,令我大吃一惊的是,发生了以下情况

DB.execute "SELECT * FROM batches WHERE batch = 'TTX3'"
=> []

这里是数据库转储

sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE batches (
batch VARCHAR(30) PRIMARY KEY,
fdl INT,
created_at DATETIME,
updated_at DATETIME
);
INSERT INTO batches VALUES(X'54545831',0,'2018-02-20 11:40:46 +0100','2018-02-20 11:40:46 +0100');
INSERT INTO batches VALUES(X'54545832',0,'2018-02-20 11:40:54 +0100','2018-02-20 11:40:54 +0100');
INSERT INTO batches VALUES(X'54545833',0,'2018-02-20 11:41:02 +0100','2018-02-20 11:41:02 +0100');
CREATE INDEX batches_batch
ON batches (batch);
CREATE INDEX batches_fdl
ON batches (fdl);
COMMIT;

为什么批处理存储为十六进制值?

DB.execute "SELECT * FROM batches WHERE batch = X'54545833'"
=> [["TTX3", 0, "2018-02-20 11:41:02 +0100", "2018-02-20 11:41:02 +0100"]]

最佳答案

这些值存储为十六进制,而是存储为 blob。在 SQL 语句中,写入 blob 的唯一方法是使用 blob literal ,其中 blob 的字节用十六进制数字表示。

无论哪个程序写入数据库,都会将这些值写入 blob。

要搜索 blob,请将搜索值转换为 blob:

SELECT * FROM batches WHERE batch = CAST('TTX3' AS BLOB);

或者,修改数据库,使其包含文本值(这可能会破坏其他程序):

UPDATE batches SET batch = CAST(batch AS TEXT);

关于ruby - SQLite3 将字符串存储为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48883015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com