discourse / mini_sql

a minimal, fast, safe sql executor
MIT License
379 stars 18 forks source link

Using binary data #54

Open bryanp opened 11 months ago

bryanp commented 11 months ago

I'm using mini_sql to query a bytea column in postgres, but I'm having trouble getting the query to run. Here's the error:

PG::CharacterNotInRepertoire:
  ERROR:  invalid byte sequence for encoding "UTF8": 0xe1 0x46 0xe0

Using pg directly, I can do something like this:

sql = <<~SQL
  select from secrets where key = $1
SQL

db.exec_params(sql, [
  {value: SecureRandom.bytes(32), format: 1},
])

However I'm not too sure the best way to go about solving this using mini_sql. Note that I can get the same PG::CharacterNotInRepertoire error using pg directly with the following approach:

sql = <<~SQL
  select from secrets where key = '#{SecureRandom.bytes(32)}'
SQL

db.exec(sql)

Curious if there's a way around this issue or if additional support is needed.

bryanp commented 11 months ago

FWIW I did find a workaround:

where("key = :key", key: PG::TextEncoder::Bytea.new.encode(SecureRandom.bytes(32)))

Curious if you think this should have better built-in support. If so, I'd be happy to brainstorm potential solutions.