SQLite User Forum

TEXT values can contain arbitrary binary data
Login
While I agree it's a surprising result the [documentation for expressions](https://www.sqlite.org/lang_expr.html) also  states in part:

> The result of any binary operator is either a numeric value or NULL, except for the \|\| concatenation operator which always evaluates to either NULL or a text value.

Thus concatenating any two non-null values will always yield text even if the value is invalid for the database encoding.