My requirements are:
In the comments I saw you saying that the UDF fields are to dump imported data that is not properly mapped by the user.
Perhaps another option is to track the number of UDF's made by each user and force them to reuse fields by saying they can use 6 (or some other equally random limit) custom fields tops.
When you are faced with a database structuring problem like this it is often best to go back to the basic design of the application (import system in your case) and put a few more restraints on it.
Now what I would do is option 4 (EDIT) with the addition of a link to users:
general_data_table
id
...
udfs_linked_table
id
general_data_id
udf_id
udfs_table
id
name
type
owner_id --> Use this to filter for the current user and limit their UDFs
string_link_id --> link table for string fields
int_link_id
type_link_id
Now make sure to make views to optimize performance and get your indexes right. This level of normalization makes the DB footprint smaller, but your application more complex.