MySQL返回一个空字段:CONCAT(nonEmpty1,empty2,nonEmpty3)= NULL

Pis*_*3.0 13 mysql null

我有PHP 5代码访问MySQL 5服务器上的MyISAM表.查询如下所示:

SELECT CONCAT(fName1,' ',mName2,' ',lName3) AS userName 
    FROM users 
    WHERE level > 10
Run Code Online (Sandbox Code Playgroud)

当没有MNAME填写,我期待像"FNAME LNAME"输出,但我发现了""(空字符串),而不是(返回的行数是正确的).我哪里弄错了?

PHP代码:

<?php
$result = mysql_query($the_above_query);
while ($result_row = mysql_fetch_assoc($result)) {
    // do stuff with the name
    // except I'm getting empty strings in $result_row['userName']
}
Run Code Online (Sandbox Code Playgroud)

表结构的相关部分:

CREATE TABLE users {
    /* -snip- */ 
    `fName1` varchar(50) default NULL,      
    `mName2` varchar(50) default NULL,      
    `lName3` varchar(50) default NULL,      
    `level` int(11) default 0,      
    /* -snip- */ 
} ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

(也就是说,这种方式(MySQL中的列连接)是一个好主意,或者我应该将列提取到PHP并将它们加入那里?)


事实证明我得到了一个N​​ULL; PHP同样处理返回的NULL和空字符串(""),您必须与===进行比较才能看到差异.

cho*_*osh 25

来自谷歌:http://bugs.mysql.com/bug.php?id = 480

[2003年5月23日4:32] Alexander Keremidarski

感谢您抽出宝贵时间给我们写信,但这不是错误.请仔细检查http://www.mysql.com/documentation/上提供的文档 以及有关如何报告错误的说明,请访问http://bugs.mysql.com/how-to-report.php

这是CONCAT()函数的记录行为.

从手册章节6.3.2字符串函数

CONCAT(str1,str2,...)返回连接参数产生的字符串.如果任何参数为NULL,则返回NULL

改为使用CONCAT_WS()或使用IFNULL()函数包装NULLable参数.

CONCAT_WS的文档和用法:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws


Ers*_*yan 16

来自MYSQL文档

如果任何参数为NULL,则CONCAT()返回NULL.

你想使用CONCAT_WS()

CONCAT_WS(separator,str1,str2,...)
Run Code Online (Sandbox Code Playgroud)

但最好的办法是只需将其拉回来并使用php原因如果你需要不同的格式或者只是其中一个字段,你将不得不进行另一个db调用


Kee*_*per 11

在MySQL中将任何字符串连接到NULL值会导致NULL.在使用IFNULL进行连接之前,您必须检查NULL:

SELECT CONCAT(IFNULL(fName1,''),' ',IFNULL(mName2,''),' ',IFNULL(lName3,'')) AS userName 
FROM users 
WHERE level > 10
Run Code Online (Sandbox Code Playgroud)