sqlite3 varchar 与“like”匹配但不与“=”匹配

2023-12-11

使用Rails 3.1和sqlite3进行开发、测试环境。

在迁移中添加了一个新表:

create_table :api_keys do |t|
  t.string :api_key
  t.integer :user_id
  t.timestamps
end

这会生成一个具有以下架构的表:

create_table "api_keys", :force => true do |t|
  t.string   "api_key"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

在 ActiveRecord 模型中:

before_create :fill_api_key

private

def fill_api_key
  self.api_key = SecureRandom.hex(30)
end

ActiveRecord的动态查找器方法find_by_api_key(api_key)不起作用(返回零)。与以下相同:

ApiKey.where({:api_key => 'something'}).first

在 sqlite3 中,我执行以下操作:

insert into api_keys (id, api_key) values (-1, '12345');

如果我现在运行选择:

select api_keys.* from api_keys where api_keys.api_key = '12345';

就会找到该记录。

如果我运行未过滤的选择,则会显示从我的应用程序创建的预先存在的数据:

select api_keys.* from api_keys;

如果我尝试通过将这些预先存在的记录之一中的长十六进制字符串粘贴到查询中来查找预先存在的记录:

select api_keys.* from api_keys where api_keys.api_key = 'long hex string';

然后它不返回任何结果。如果我尝试这样做:

select api_keys.* from api_keys where api_keys.api_key like 'long hex string';

然后我得到了一场比赛。

我已经在 api_keys.api_key 上创建了索引,但这没有效果。

此问题会影响我的应用程序中的另一个模型,该模型使用 Digest::SHA1::hexdigest 生成类似的随机十六进制数字字符串。

James


好吧,我想我已经弄清楚了。问题不在于这是 Rails 3.1,而在于您可能已从 Ruby 1.8.7 迁移到 Ruby 1.9.2。

在 Ruby 1.9 中,所有字符串现在都已编码。默认情况下,所有字符串都应该是UTF-8, 然而,SecureRandom.hex(30)返回编码ASCII-8BIT.

您可以使用以下命令在 sqlite3 中确认这一点:.dump api_keys你可能会看到 api_key 字段看起来像这样:

INSERT INTO "api_keys" VALUES(1,X'376433356530[...]',1);    
INSERT INTO "api_keys" VALUES(1,'1234567890[...]',1);

第一个是 SecureRandom 生成的 api_key。第二个是通过在控制台中输入创建的。 X 表示该字段被编码为 blob,而不是字符串。

要解决这个问题,请更改您的fill_api_key对此:

self.api_key = SecureRandom.hex(30).force_encoding('UTF-8')

我刚刚被咬了big time就这样,希望它能帮助你。

这里有一些关于 1.9 中 String 更改的详细信息:http://blog.grayproducts.net/articles/ruby_19s_string

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlite3 varchar 与“like”匹配但不与“=”匹配 的相关文章

  • 使用 nw-gyp 构建 node-sqlite3

    我正在尝试为 node webkit 构建 sqlite3 The sqlite3 https www npmjs com package sqlite3 installing页面解释说它需要使用 nw gyp 来完成 据我了解 我应该下载
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • SQLite CreateDatabase 不支持错误

    我将 Entity Framework 4 2 CF 与 SQLite 一起使用 但是当我尝试启动该应用程序时 出现 提供商不支持 CreateDatabase 错误 这是我的模型映射 protected override void OnM
  • 填充 CoreData 创建的 sqlite 数据库

    我有一个由 CoreData 模型自动创建的 sqlite DB 但我的应用程序不会让用户能够将数据写入其中 而是我想用程序所需的所有数据预先填充它 我的问题是 CoreData 创建的 sqlite DB 具有未知的表和字段 这些表和字段
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • SQLiteException - 仅发生在某些设备上

    我最近向市场发布了一个应用程序 从开发者控制台来看 我的用户中大约有 1 2 遇到了这个问题 1 2 的比例很小 但人们更倾向于在某些内容不起作用时留下评论 而不是在它起作用时留下评论 这可能会对下载产生负面影响 不幸的是 开发人员控制台仅
  • Rails 3.1、Ruby 1.9.2-p180 和 UTF-8 问题

    我在使用 UTF 8 字符时遇到一些问题 这是 db seeds rb User create username eml first name last name ck email email protected cdn cgi l ema
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • Android中BaseColumns有什么用

    实现一个类有什么用BaseColumns在安卓中 The BaseColumns http developer android com reference android provider BaseColumns html接口提供了非常常见
  • 更新系统后RubyGems错误

    使用 sudo gem update system 更新 ruby 设置后尝试启动 Rails 控制台时 我尝试通过发出以下命令来执行 Rails 控制台rails c 我收到此错误 Users myusername rvm rubies
  • SQLite 使用循环重新编号 ID

    您好 我有一个包含许多插入行的表 我需要按 id 对所有行重新编号并排序 我找到了这段代码 但它对我不起作用 SET i 100 UPDATE main Categories SET ID i i 1 WHERE Name White AL
  • 为什么python+sqlite3特别慢?

    我尝试使用 Python 2 7 4 sqlite3 和 Firefox SQLite Manager 0 8 0 处理对同一数据库的相同请求 在小型数据库 8000 条记录 上 Python 和 Firefox 都运行得很快并且给出了相同
  • Android中的SQLite是否有内存缓存以及如何释放或清除它?

    首先 我在 Android 应用程序中创建一个名为 mydb 的数据库 DBHelper dbHelper new DBHelper context mydb null 1 DBHelper is my custom class 并将一些数
  • 将现有数据库放置在我的项目中的何处

    我想在基于 Android Android Studio 的项目中使用现有的 sqlite 数据库 我在 Google 上进行了搜索 有人建议将其放在 资产 文件夹中 但是在项目结构中没有这样的文件夹 项目中的文件夹结构如下 res 可绘制
  • 无法读取第 0 行,第 -1 列

    我正在尝试复制使用 SQLite 管理器创建的数据库 我在其中执行了以下操作 CREATE TABLE android metadata locale TEXT DEFAULT en US and INSERT INTO android m
  • SQLite:*防止*主键值在删除所有行后重置[重复]

    这个问题在这里已经有答案了 我有一个 SQLite 表 有几列 包括一个 ID 列 它是 INTEGER PRIMARY KEY 当我插入时 该值会按预期增加 但是 当我删除所有行时 该列的值在下一次插入时恢复为 1 有没有办法让列值从删除
  • 仅将唯一行插入 SQLite (python)

    我在用着cursor executemany将 CSV 文件中的批量行插入到 SQLite 表中 根据主键字段 其中一些行预计会重复 当我执行该命令时 可以预见的是 我会收到完整性错误 并且不会插入任何内容 如何有选择地仅插入非重复行 而无
  • Android 上的 SQLite JDBC 驱动程序

    我正在尝试使用xerial sqlite jdbc在 Android 中管理我的数据库没有成功 我得到了java lang NoClassDefFoundError org sqlite SQLiteConnection异常 我已经导入了这
  • SQLite 中的累积求和值

    我正在尝试在 SQLite 中执行值的累积和 我最初只需要对一列求和并获得代码 SELECT t MyColumn SELECT Sum r KeyColumn1 FROM MyTable as r WHERE r Date lt t Da

随机推荐

  • 如何彻底清除 Laravel 中的缓存?

    我运行这些命令 php artisan view clear php artisan route clear s php artisan cache clear php artisan config clear php artisan co
  • 如果有人“窃取”我的 Facebook App ID,他们会造成什么损害?

    我创建了一个 Facebook 应用程序 ID 并将站点 URL 设置为 localhost 以便在进行身份验证 通过客户端 JavaScript 后 我在开发应用程序时会被重定向到本地计算机 我很想知道此设置是否存在任何风险 特别是如果我
  • 警告:date_default_timezone_get():

    我已经研究了我能找到的所有答案 但没有运气让它发挥作用 当我尝试运行 symfony 时出现以下错误 警告 date default timezone get 依赖 系统的时区设置 你是required使用 date timezone 设置
  • 如何检查android数据库中的重复名称?

    我想从两个编辑文本中输入姓名和电话号码 我使用两个按钮保存并使用列表视图在模拟器中显示它 输入姓名后 当我单击 保存 按钮时如何检查我是否已经输入了相同的名字 我是 Android 新手 解释会非常有帮助 public void onCre
  • 将产品标签移至 WooCommerce 产品描述

    我需要将产品标签移至 WooCommerce 产品描述的底部 我在用 将自定义内容添加到 WooCommerce 产品描述中 答案代码确实有效 我在产品描述下方收到文本 这是描述中的最后一行 现在我想添加产品元信息 产品 SKU 和标签 但
  • 在 php 脚本中使用缓存

    我对 php 中的缓存感到困惑 我在我的 php 文件中创建了一个用于显示 2 到 500 的文件 现在我想使用缓存文件来存储数据并显示它 我的代码如下 现在我如何使用缓存文件来保存输出并进一步在浏览器中显示 如果还有其他方法可以在 php
  • 如何从 WC_Subscription 实例对象获取用户 ID

    我有两个功能需要帮助 我希望它们能够处理我的订阅任务 代码注释 是我想要弄清楚的 如果您有其他反馈 我也愿意接受 这用于完成初始订阅付款和订阅续订 function payment made subscription How do I ge
  • MySQL 似乎正在覆盖记录

    我在 MySQL 中有一个全新的表 可以这样描述 Team Match Auto Gear Kpa Climb 1721 1 3 5 5 1 5813 2 2 2 15 0
  • Node v8 垃圾收集器 :: 如何调试长标记-清除时间?

    我使用 trace gc 标志运行我的应用程序以尝试找到一些性能问题 嗯 看来我可能已经找到了 1288678 ms Mark sweep 498 8 549 0 gt 488 8 548 0 MB 4085 ms idle notific
  • 带有 IntelliJ 和 SBT 的自定义文件夹结构的 Uber jar

    我对云还很陌生SBT IntelliJ 所以试试我的运气IntelliJ SBT构建环境以在 dataproc 集群上部署我的 jar 这是我的项目结构的屏幕截图 代码非常简单 main 定义在 mytestmain 它调用定义在中的另一个
  • Java正则表达式查找单词的完全匹配

    我正在尝试在 Java 中构建一个正则表达式模式来查找单词的精确匹配 例如 这个词hot应该在前 3 个字符串中找到 但在第四个字符串中找不到 hot in here It s hot how hot is it email protect
  • 匹配方括号内的内容,包括嵌套方括号

    我正在尝试编写一个剧透识别系统 以便将字符串中的任何剧透都替换为指定的剧透字符 我想匹配一个用方括号括起来的字符串 这样方括号内的内容就是捕获组1 并且包括括号在内的整个字符串就是匹配项 我目前正在使用 对这个答案中的表达式稍作修改here
  • ASP.NET 中的向导控件 - 如何将 NextButton Causesvalidation 属性设置为 false

    我尝试在代码和标记中设置它 但是当单击 下一步 按钮时 页面将被验证 我想防止这种情况发生 并控制何时应该进行验证 何时不进行验证 任何建议或代码示例将不胜感激 最简单的方法是从WizardStep其中验证将被跳过 但是 如果您需要高级功能
  • Python 嵌套列表理解与 If Else

    我试图使用列表理解来替换值列表中的多个可能的字符串值 我有一个列名称列表 这些名称取自cursor description UNIX Time col1 MCA col2 MCA col3 MCA col1 MCB col2 MCB col
  • 制作带有边框、圆角和透明背景的六边形形状

    我想在 CSS3 中制作一个带有边框 圆角和透明背景的六边形形状 如下图所示 我不能用圆角和边框来做这个 我的代码在这里 hexagon circle position relative margin 1em auto width 10em
  • RDLC 报告中的小计

    我需要在 RDLC 报告中显示小计 我的报告应显示如下数据 Book Student Borrowed Book1 John 2 Book1 Mary 3 Book1 Bob 1 Total 6 how to do it Book2 Ale
  • 尝试更好地理解“using”语句

    我读过几篇关于 using 语句的文章 试图理解何时应该使用它 听起来大多数人认为应该尽可能多地使用它 因为它可以保证处理未使用的物品 问题是所有的例子总是显示这样的内容 using SqlCommand scmFetch new SqlC
  • 重构方法中的多个 if-else 条件

    我正在重构现有代码 它实际上工作得很好 但它有点混乱 有多个 if else 条件检查一个变量的值并将第二个变量的值更改为从固定枚举结构获取的更新值 else if var1 valueX if var2 MyEnum A var2 MyE
  • 如何将网页居中

    我想定位我的网页 以便在放大或缩小时 网页的尺寸从中心减小或增大 例如 当放大或缩小该网站时 布局会向中心移动并远离中心 我希望你明白 我认为你正在谈论 margin 0px auto 您所要做的就是将其添加到 CSS 的正文中 body
  • sqlite3 varchar 与“like”匹配但不与“=”匹配

    使用Rails 3 1和sqlite3进行开发 测试环境 在迁移中添加了一个新表 create table api keys do t t string api key t integer user id t timestamps end