SQLite中的Base64编码?

10

有没有类似的东西

SELECT * FROM foo WHERE base64(bar) LIKE '%bararar%'

在SQLite中有没有类似的功能?

如果没有,其他SQL风格的数据库中是否有可比较的函数?(MySQL、MSSQL等)

我真的需要知道这个,因为我的一个庞大的数据库中,一些字符串的base64编码包含一个特定字符,我必须过滤掉它。希望有人能帮助我。


2
我不这么认为,但SQLite的源代码是公共领域,所以你可能可以fork SQLite,为其编写一个base64函数并将其发布给公众? :) <—提示,提示 - user142019
那么,我还有其他方法可以执行查询以获得我想要的结果吗? - nikeee
你可以尝试缓存,但第一次以及每次更新/插入后都会非常慢。顺便问一下,现在在德国编程有点晚了吧? :) - user142019
另一种选择是拥有一个单独的数据库,其中包含相同的数据,但它不是base64编码。这个数据库将在原始数据库每次更新后进行更新,以保持同步。 - user142019
我不想获取数据库中的每个条目来手动筛选所需的条目。我正在使用.NET语言。这就是为什么我不能简单地扩展SQLite函数的原因...因为有.NET包装器。顺便说一下,我们正在谈论10k+条目。 - nikeee
1
@WTP,这比所需的工作要多得多。SQLite本地支持用C编写的自定义函数,许多包装器提供了在.NET、Java、ActionScript等语言中编写自定义函数的功能。 - Samuel Neff
2个回答

4

System.Data.SQLite支持在.NET中使用自定义函数。如果您正在使用不支持此功能的其他包装器,请更改包装器。最新版本在此处:

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

它曾经在这里,但现在是主要SQLite项目的一部分:

http://sqlite.phxsoftware.com/

示例:

[SQLiteFunction(Name = "Base64", Arguments = 1, FuncType = FunctionType.Scalar)]
class Base64SQLite : SQLiteFunction
{
  public override object Invoke(object[] args)
  {
    // assumes args[0] is a string, but you can handle binary data too
    var bytes = Encoding.UTF8.GetBytes(Convert.ToString(args[0]));
    return Convert.ToBase64String(bytes);
  }
}

如果您需要频繁搜索此数据,特别是通配符搜索,则最好将数据缓存(使用触发器)并将其放入全文检索索引中。


1

在所有的编码和解码算法中,SQLite只支持十六进制(hex)。

但是你可以通过sqlean-crypto扩展添加Base64编码/解码函数。

例如:

select load_extension('crypto.dll');

select encode('hello', 'base64');
-- aGVsbG8=

select decode('aGVsbG8=', 'base64');
-- hello

该扩展还支持其他算法,如Base32、Base85和URL编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接