in reply to unexpected result parsing rows from database

Your split argument is |, which is regex for "or". Effectively you're telling it to split on <nothing> OR <nothing>, which has the effect of splitting on each character. Since you're not specifying a limit in your 3rd argument to split, you're only catching the first two characters, so that's what you see. To get the effect you're looking for, escape the pipe-character. And I don't mean change the argument to "\|", since all you're doing there is escaping it in the qq{} string. To avoid confusion like this, specify your first split argument as a true regexp: /\|/

Also, why are you joining the fields in the SQL at all? Why not just SELECT both fields as you would normally, and refer to them as $types[0] and $types[1], respectively?