Dear Lazyweb,
Has anyone seen the following - perfectly happy MySQL connection, with:
$VAR1 = [
[
'character_set_client',
'latin1'
],
[
'character_set_connection',
'latin1'
],
[
'character_set_database',
'latin1'
],
[
'character_set_filesystem',
'binary'
],
[
'character_set_results',
'latin1'
],
[
'character_set_server',
'latin1'
],
[
'character_set_system',
'utf8'
],
[
'character_sets_dir',
'/usr/share/mysql/charsets/'
]
];
(i.e. the connection is consistently latin1), and data that is Latin 1. Yet, sometimes the server will return the characters of Latin 1 encoded as UTF-8. Same query. Same table. Nothing changed.
And, yes, I know that it's the server, or at least the client libraries, because I have "instrumented" my copy of DBD::mysql:
--- dbdimp.c~ 2008-04-29 00:36:17.000000000 +0100
+++ dbdimp.c 2009-12-31 14:30:58.000000000 +0000
@@ -3489,6 +3489,18 @@
if (DBIc_TRACE_LEVEL(imp_xxh) >= 2)
PerlIO_printf(DBILOGFP, "\t<- dbd_st_fetch, %d cols\n", num_fields);
+ {
+ char buffer[256];
+ sprintf(buffer, "/tmp/DBD.%d", getpid());
+ PerlIO *fh = PerlIO_open(buffer, "a");
+ if (fh) {
+ do_sv_dump(0, fh, av, 0, 32, 0, 0);
+ PerlIO_close(fh);
+ } else {
+ croak("open '%s': %d", buffer, errno);
+ }
+ }
+
return av;
}
else
@@ -3601,6 +3613,17 @@
(void) SvOK_off(sv); /* Field is NULL, return undef */
}
+ {
+ char buffer[256];
+ sprintf(buffer, "/tmp/DBD.%d", getpid());
+ PerlIO *fh = PerlIO_open(buffer, "a");
+ if (fh) {
+ do_sv_dump(0, fh, av, 0, 32, 0, 0);
+ PerlIO_close(fh);
+ } else {
+ croak("open '%s': %d", buffer, errno);
+ }
+ }
if (DBIc_TRACE_LEVEL(imp_xxh) >= 2)
PerlIO_printf(DBILOGFP, "\t<- dbd_st_fetch, %d cols\n", num_fields);
return av;
"mysql_st_internal_execute MYSQL_VERSION_ID 50134", DBD-mysql-4.007, DBI-1.609, perl 5.8.8, x86_64 GNU/Linux
Could any of your code be calling "SET NAMES uft8" which changes that connection's encoding.