We can explicitly set the char set to utf8 when initializing PDO, just add \"charset=utf8\" to the dsn string. But how does one explicitly specify the collation
Question: "How to specify collation with PDO without SET NAMES? .. how does one explicitly specify the collation used in MySQL connection when using PDO?"
Answer: You just cannot do it without using SET NAMES or something similar. Using PDO::MYSQL_ATTR_INIT_COMMAND in the $options array of the PDO constuctor is the only way to explicitly set the connection collation directly in your connection code using PDO. Otherwise, you will be relying on something less than explicit syntax (which is not the answer to the question). Certainly, any other method is less direct.
Some versions of MySQL (5.1) have two, 3-byte unicode, uft8 collations (unicode and general). Simply using utf8 in the $dsn string will not explicitly choose the "unicode" version or the "general" version of the utf8 collations. PDO is not a mind reader.
Therefore, your options string may look something like this:
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"];
or
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_general_ci'"];
Later versions of MySQL have a 4-byte utf8 unicode implementation. Here, you would specify utf8mb4, not uft8.
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'"];