为什么CONCAT()在MySQL中不默认为默认字符集?

| 是什么原因导致在纯UTF-8环境中使用CONCAT()MySQL仍将串联字符串(例如,表达式中的某些col是int或date)视为其他字符集(可能是Latin-1)? 从客户端(
\\s
)看到的MySQL环境:
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
测试数据集:
CREATE TABLE `utf8_test` ( 
    `id` int(10) unsigned NOT NULL auto_increment, 
    `title` varchar(50) collate utf8_estonian_ci default NULL,
    `year` smallint(4) unsigned NOT NULL default \'0\', 
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;

INSERT INTO utf8_test VALUES (1, \'Õäöüšž\', 2011);
这个查询很好:
SELECT id, title FROM utf8_test;
这将关闭utf-8标志(已在MySQL,AFIU中):
SELECT CONCAT(id, title) FROM utf8_test;
在mysql-client中,一切看起来都很好,因为它已将chars显示为UTF-8,但是在运行perl DBI时,所有具有CONCAT()的查询的结果都没有设置utf-8标志。示例代码:
#!/usr/bin/perl

use strict;
use utf8::all;
use Encode qw(is_utf8);

my $dbh = your_db_connect_routine(\'test\');

my $str = $dbh->selectrow_array(\'SELECT CONCAT(id, title) FROM utf8_test\');
print \"CONCAT: False\\n\" unless ( is_utf8($str) );

my $str = $dbh->selectrow_array(\'SELECT title FROM utf8_test\');
print \"NO CONCAT: False\\n\" unless ( is_utf8($str) );
我知道至少有两种解决方法 用CAST()
SELECT CONCAT( CAST(id AS CHAR CHARACTER SET utf8), title) FROM utf8_test
进行查询 使用
$str = Encode::_utf8_on($str)
(被认为是不好的做法?) 但我问:为什么在MySQL中是这样?我应该将其视为错误或功能吗?     
已邀请:
        这是MySQL中一个众所周知的错误。在MySQL 5.5中已修复 参见:http://bugs.mysql.com/bug.php?id=12030 问题源于将整数与varchar串联。 解决方法是先将id(整数)转换为char,然后再进行串联, 即:
SELECT CONCAT(cast(id as char), title) FROM utf8_test
    
        可能是DBD :: mysql问题/特殊性。尝试按照POD中
DBD::mysql
mysql_enable_utf8
部分)的说明在数据库句柄中启用utf8。 这篇老文章(Perl 5.8次)也可以提供帮助。     

要回复问题请先登录注册