When you fetch utf8 texrt from mysql, you should always run it through Encode::decode("utf8",...) -- update: or equivalent, as shown by ikegami
When using a fairly recent version of DBD::mysql, you can use the mysql_enable_utf8 option. Or, to quote:
This attribute determines whether DBD::mysql should assume strings stored in the database are utf8. This feature defaults to off.
When set, a data retrieved from a textual column type (char, varchar, etc) will have the UTF-8 flag turned on if necessary. This enables character semantics on that string. You will also need to ensure that your database / table / column is configured to use UTF8. See Chapter 10 of the mysql manual for details.
Additionally, turning on this flag tells MySQL that incoming data should be treated as UTF-8. This will only take effect if used as part of the call to connect(). If you turn the flag on after connecting, you will need to issue the command SET NAMES utf8 to get the same effect.
This option is experimental and may change in future versions.
and yes, this is experimental, but seemed to work fairly stable in my tests.