crystal-mysql icon indicating copy to clipboard operation
crystal-mysql copied to clipboard

BINARY and VARBINARY columns can only be read as string

Open crash2burn opened this issue 6 years ago • 0 comments

Currently we are able to insert Bytes but when reading must specify read(String) not read(Bytes) as there will be an error otherwise. I believe it might be better to support reading a slice for these fields.

DB.open "mysql://root@localhost/test" do |db|
  db.exec "drop table if exists contacts"
  db.exec "create table contacts (name varchar(30), age int, btest VARBINARY(16))"
  db.exec "insert into contacts values (?, ?, ?)", "John Doe", 30, Bytes.new(3, 90_u8)

  args = [] of DB::Any
  args << "Sarah"
  args << 33
  args << Bytes.new(3, 90_u8)
  db.exec "insert into contacts values (?, ?, ?)", args

  puts "max age:"
  puts db.scalar "select max(age) from contacts" # => 33

  puts "contacts:"
  db.query "select name, age, btest from contacts order by age desc" do |rs|
    puts "#{rs.column_name(0)} (#{rs.column_name(1)}) (#{rs.column_name(2)})"
    # => name (age)
    rs.each do
      puts "#{rs.read(String)} (#{rs.read(Int32)}) (#{rs.read(Bytes)})"
      # => Sarah (33) (ZZZ)
      # => John Doe (30) (ZZZ)
    end
  end
end

max age: 33 contacts: name (age) (btest) MySql::ResultSet#read returned a String. A Slice(UInt8) was expected. (Exception) from lib/db/src/db/result_set.cr:0:9 in 'read' from src/dbtest.cr:28:57 in '__crystal_main' from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:11:3 in '_crystal_main' from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:112:5 in 'main_user_code' from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:101:7 in 'main' from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:135:3 in 'main'

crash2burn avatar Jun 11 '18 12:06 crash2burn