After further testing, I realized my example field was not varchar but char( 4) (hence length 4).  But a quick test on another field proved it out with datalength of 0.

THANK YOU VERY MUCH for this SQL tip!  

Very interesting!  I had not heard of that before.  In some preliminary testing, the datalength of the field is 4 (why not 1?).  Still investigating.

My other thought is to create a dynamic SQL to insert the fields.  First pass was to insert and then update based on if any fields were NULL.  But that lengthened my time from processing ~ 40k messages from 25 minutes to > 90 minutes.  Looking to see if I can build an array to track which fields needs to be inserted vs hard coded to ''.

When I set

    myRequestClass.MessageType = $char(0)

and then insert with ? parameter, it still has datalength of 1.