A. None is "best". The differences are very subtle and have to do with how ordering works when your text contains characters with diacritics. For example, u with umlaut sorts separately from u using *_unicode_ci collations but together with u using *_general_ci. For non-Latin alphabets, like Greek, there is no difference. Please read this too: https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
B. OK
C. See the link in my answer to A. This basically has to do with the fact that a character can be expressed in different ways in Unicode. U with umlaut can be represented as a single, two byte, precomposed character OR as two separate characters, u and the combining umlaut character. For most European, Latin-based languages both forms will be considered as the same character for sorting purposes under all *_unicode_* collations. When you have languages like traditional Chinese, Kanji Japanese etc the old _unicode_ci may consider different ways to write the same character as different characters whereas the newer ones (*_unicode_520_ci, *_0900_ai_ci) won't. The numbers have to do with the Unicode version standard supported.
THIS IS A FRINGE CASE WHICH IS UNLIKELY TO APPLY TO YOU. We are talking about support for Traditional Chinese and very uncommon languages' scripts. The sites you create most likely use European languages based on the Latin, Greek or Cyrillic alphabets and probably text in Arabic, Thai and the main Indian dialects (the names of which unfortunately I cannot remember — my friends from India will be pissed at me). These are all well supported even with the old *_unicode_ci collation. As for the difference between _generic_ci and _unicode_ci it only matters if you want to treat European, Latin-based characters with diacritics as separate lexicographical entities.
So, whatever you use it won't really be a real issue for you. Definitely not a display issue.
D. Ah, I see. Failed developer became journalist and offers his views, which didn't cut it in the real world, as a gospel. Makes perfect sense. Idiots gonna be idiots.
MySQL was quite upfront that they only support three byte UTF-8 and they had explained the technical reasoning (which made perfect sense in the early 00s when the fastest server processor had the same performance envelope as a $50 Android crap phone you can buy at Walmart nowadays). A decade ago they introduced the 4-byte UTF-8 (UTF8MB4) specifically to address the proper 4-byte UTF-8 standard. The reason it got traction with CMS (used predominantly by people NOT using 4-byte text) was publicly to support 4-byte characters like Emoji but the real reason was security. I have explained this in my original PR to Joomla regarding UTF8MB4 support and has to do with how MySQL would try to fail gracefully when encountering 4 byte Unicode characters which could be used to trigger PHP session serialization attacks.
In the end of the day MySQL is a perfectly fine database if the developers using it understand how it works and how to use it. Conversely, PostgreSQL will bite you in the ass if you are a developer who does not understand how it works.
I would like to add that major services like Twitter and Facebook have been using MySQL, even though nowadays in a heavily modified form.
Furthermore, MySQL does have a number of useful extensions e.g. a NoSQL extension and a JSON parsing extension. I am not aware of these existing for PostgreSQL but I will be the first to admit that I might be wrong because I do not know PostgreSQL anywhere near as well as I know MySQL.
Finally, MySQL is very convenient for exporting whole databases including structure and data. This is awesome for mass distributed CMS which need to be deployed by mere mortals without the assistance of an IT team and dedicated deployment instrumentation. PostgreSQL assumes that you are on a more traditional environment which employs a dedicated database administrator team and your deployments will take place using an IT team and dedicated instrumentation. You can easily export data but not structure. While you can introspect the database (e.g. using the INFORMATION_SCHEMA views) what you export WILL NEVER BE an absolutely accurate reflection of your database structure. That's a major reason why I stopped supporting PostgreSQL in Akeeba Backup. We could export the database but restoring it was NEVER resulting in the exact same structure you had when you backed up and this couldn't be fixed. Nobody has solved that issue because that issue does not exist where PostgreSQL is normally used.
So, if you want to use a mass distributed CMS and be able to move your site between servers without having to pay a dozens-to-hundreds of thousands of dollars per month IT team you should be using MySQL.
Nicholas K. Dionysopoulos
Lead Developer and Director
🇬🇷Greek: native 🇬🇧English: excellent 🇫🇷French: basic • 🕐 My time zone is Europe / Athens
Please keep in mind my timezone and cultural differences when reading my replies. Thank you!