Mononymics are fairly straightforward as far as I'm concerned.
The mononymic would go in the given/first name and "N/A" would go in the family name.
Also, nulls are abominations, since you need to know if a name was not entered yet (TBD), not applicable (N/A) or verified as unknown/unknowable (UNK). The last case, for instance, in "John Doe" type situations, where the person can't be asked and no one else knows--or can ever find out (a deceased and unidentified person, for example). Missing middle names can use "N/A" or "UNK" if not applicable/unknown/none of the database's business. 😛
As for the poor Hungarian poster, my condolences! In that case you'd almost certainly need a "mode" field of some kind, to indicate what kind of name you're dealing with.
Another case I didn't see mentioned was "called-by". People named Robert, for instance might be called "Bob", "Rob", "Robert", etc. In my company that's actually a problem so I have to make allowances for it. Our company president is pretty insistant that called-by names be used for email, for instance, and on internal reports.
Now I'm thinking about how you could build a Name table to handle all cases. (laughing).
And you can have a Greeting Name column for how the person would like to be addressed (you can even break this up into formally and informally). It makes sense to me that one name is the first name. It cant be the second nor the last.
As far as other items like d'angelo or dangelo. This is no different than what you experience with other names ("IBM" = "I.B.M." ?). You create and apply rules within the shop to increase data consistency.