MySQL组返回BLOB,结果为空错误

MySQL组返回BLOB,结果为空错误,mysql,Mysql,我必须使用3个表与文件和类别建立一对多关系我的表模式如下所示: SELECT f.id, f.title, f.filename, f.description, f.date_uploaded, f.last_updated, GROUP_CONCAT(DISTINCT fc.fkcategory ORDER BY fc.fkcategory ASC ) AS categories_ids FROM `files` AS f INNER JOIN `file_categories` AS

我必须使用3个表与文件和类别建立一对多关系我的表模式如下所示:

SELECT f.id, f.title, f.filename, f.description, f.date_uploaded, f.last_updated, 
GROUP_CONCAT(DISTINCT fc.fkcategory ORDER BY fc.fkcategory ASC ) AS categories_ids 
FROM `files` AS f 
INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
GROUP BY fc.fkfile
类别表

CREATE TABLE `categories` (
    `id` INT(3) NOT NULL  AUTO_INCREMENT,
    `category_name` VARCHAR(25) NOT NULL,
    `visible_name` VARCHAR(25) NOT NULL,
    `is_active` TINYINT(1) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_file_category_visible_name_colum` (`visible_name`)
)
 ENGINE = INNODB;
CREATE TABLE `files` (
    `id` BIGINT(20) NOT NULL  AUTO_INCREMENT,
    `title` VARCHAR(200) NOT NULL,
    `filename` VARCHAR(255) NOT NULL,
    `description` TEXT NOT NULL,
    `date_uploaded` BIGINT(20)                      DEFAULT 0,
    `last_updated` BIGINT(20)                      DEFAULT 0,
     PRIMARY KEY (`id`),
     UNIQUE KEY `idx_unique_file` (`filename`)
)
 ENGINE = INNODB;
CREATE TABLE `file_categories` (
    `fkfile` BIGINT(20) NOT NULL,
    `fkcategory` INT(3) NOT NULL,
    PRIMARY KEY (`fkfile`, `fkcategory`),
    FOREIGN KEY (`fkfile`)
    REFERENCES files (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
    FOREIGN KEY (`fkcategory`)
    REFERENCES categories (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
)
ENGINE = INNODB;
文件表

CREATE TABLE `categories` (
    `id` INT(3) NOT NULL  AUTO_INCREMENT,
    `category_name` VARCHAR(25) NOT NULL,
    `visible_name` VARCHAR(25) NOT NULL,
    `is_active` TINYINT(1) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_file_category_visible_name_colum` (`visible_name`)
)
 ENGINE = INNODB;
CREATE TABLE `files` (
    `id` BIGINT(20) NOT NULL  AUTO_INCREMENT,
    `title` VARCHAR(200) NOT NULL,
    `filename` VARCHAR(255) NOT NULL,
    `description` TEXT NOT NULL,
    `date_uploaded` BIGINT(20)                      DEFAULT 0,
    `last_updated` BIGINT(20)                      DEFAULT 0,
     PRIMARY KEY (`id`),
     UNIQUE KEY `idx_unique_file` (`filename`)
)
 ENGINE = INNODB;
CREATE TABLE `file_categories` (
    `fkfile` BIGINT(20) NOT NULL,
    `fkcategory` INT(3) NOT NULL,
    PRIMARY KEY (`fkfile`, `fkcategory`),
    FOREIGN KEY (`fkfile`)
    REFERENCES files (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
    FOREIGN KEY (`fkcategory`)
    REFERENCES categories (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
)
ENGINE = INNODB;
文件类别表

CREATE TABLE `categories` (
    `id` INT(3) NOT NULL  AUTO_INCREMENT,
    `category_name` VARCHAR(25) NOT NULL,
    `visible_name` VARCHAR(25) NOT NULL,
    `is_active` TINYINT(1) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_file_category_visible_name_colum` (`visible_name`)
)
 ENGINE = INNODB;
CREATE TABLE `files` (
    `id` BIGINT(20) NOT NULL  AUTO_INCREMENT,
    `title` VARCHAR(200) NOT NULL,
    `filename` VARCHAR(255) NOT NULL,
    `description` TEXT NOT NULL,
    `date_uploaded` BIGINT(20)                      DEFAULT 0,
    `last_updated` BIGINT(20)                      DEFAULT 0,
     PRIMARY KEY (`id`),
     UNIQUE KEY `idx_unique_file` (`filename`)
)
 ENGINE = INNODB;
CREATE TABLE `file_categories` (
    `fkfile` BIGINT(20) NOT NULL,
    `fkcategory` INT(3) NOT NULL,
    PRIMARY KEY (`fkfile`, `fkcategory`),
    FOREIGN KEY (`fkfile`)
    REFERENCES files (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
    FOREIGN KEY (`fkcategory`)
    REFERENCES categories (`id`)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
)
ENGINE = INNODB;
以下是我测试的样本数据:

INSERT INTO `stackoverflow_qst`.`files` (`id`, `title`, `filename`, `description`, `date_uploaded`, `last_updated`) VALUES (NULL, 'First Dummy File', 'fdf.pdf', 'Just a dummy file', '1552295385043', '0');

INSERT INTO `stackoverflow_qst`.`categories` (`id`, `category_name`, `visible_name`, `is_active`) VALUES (NULL, 'Category 1', 'Category One', '1'), (NULL, 'Category 2', 'Category Two', '2'), (NULL, 'Category 3', 'Category Three', '1');

INSERT INTO `stackoverflow_qst`.`file_categories` (`fkfile`, `fkcategory`) VALUES ('1', '1'), ('1', '2'), ('1', '3');
在选择文件时,希望选择该文件的所有类别ID作为逗号分隔列,并使用“文件我的选择”查询,如下所示:

SELECT f.id, f.title, f.filename, f.description, f.date_uploaded, f.last_updated, 
GROUP_CONCAT(DISTINCT fc.fkcategory ORDER BY fc.fkcategory ASC ) AS categories_ids 
FROM `files` AS f 
INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
GROUP BY fc.fkfile
它正确地返回了除categories_ids列之外的其他列,该列在预览时返回一个带有错误的BLOB,如此屏幕截图所示:

我只查询了以逗号分隔的file_categories表,但它仍然像往常一样返回一个blob。我在这里查阅了StackOverflow的相关问题,我的查询似乎还可以,我的一些查找是: (这里的答案非常直接,甚至指向MySql文档), ,及 但我仍然遇到同样的问题,这与我使用的MySql版本有关吗

目前MySql版本为5.1.41,严格适用于部署当前项目的服务器。

Edit: 我明白了<代码>组_CONCAT需要字符串。通常返回
TEXT
BLOB
类型。考虑到您的数据是
INT
类型,MySQL似乎选择了
BLOB
。要返回
文本
,首先需要将整数值转换/强制转换为字符值

GROUP\u CONCAT
参考:

试试这个:

    SELECT 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated, 
      GROUP_CONCAT(DISTINCT CONVERT(fc.fkcategory, char(8)) ORDER BY fc.fkcategory ASC ) AS categories_ids 
    FROM `files` AS f 
    INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
    GROUP BY 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated
您仍然应该升级MySQL版本。在某个地方,软件安全的一个天使正在为应用程序部署在一个古老的数据库版本上的前景大哭。想想软件安全天使吧。不要让他们哭


旧答案: 你真的应该从MySQL 5.1升级。使用这样一个旧版本会使您极易受到安全问题的攻击,而且您会错过更高版本的优秀功能

好了,现在离开我的肥皂盒

在MySQL 5.6上测试,查询成功返回数据;但是,正如Panagiotis Kanavos所提到的,您确实应该在
GROUP by
子句中指定非聚合字段(即不使用聚合函数的字段,如
MAX()
AVG()
COUNT()
等)

看这个例子

    SELECT 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated, 
      GROUP_CONCAT(DISTINCT fc.fkcategory ORDER BY fc.fkcategory ASC ) AS categories_ids 
    FROM `files` AS f 
    INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
    GROUP BY 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated
您的版本和这个版本都可以运行,不过我强烈推荐这个版本。不指定group by中的非聚合字段会产生不确定的结果。您不能保证返回的数据是一致的

我没有可用于测试的5.1实例,因此无法重现您的错误。我也无法解释你看到的行为。我所能提供的最好的方法是尝试修复您的查询,使用
groupby
,看看这是否解决了问题。这不一定能解决问题,但值得一试

下面是一个SQL提琴:编辑: 我明白了<代码>组_CONCAT需要字符串。通常返回
TEXT
BLOB
类型。考虑到您的数据是
INT
类型,MySQL似乎选择了
BLOB
。要返回
文本
,首先需要将整数值转换/强制转换为字符值

GROUP\u CONCAT
参考:

试试这个:

    SELECT 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated, 
      GROUP_CONCAT(DISTINCT CONVERT(fc.fkcategory, char(8)) ORDER BY fc.fkcategory ASC ) AS categories_ids 
    FROM `files` AS f 
    INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
    GROUP BY 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated
您仍然应该升级MySQL版本。在某个地方,软件安全的一个天使正在为应用程序部署在一个古老的数据库版本上的前景大哭。想想软件安全天使吧。不要让他们哭


旧答案: 你真的应该从MySQL 5.1升级。使用这样一个旧版本会使您极易受到安全问题的攻击,而且您会错过更高版本的优秀功能

好了,现在离开我的肥皂盒

在MySQL 5.6上测试,查询成功返回数据;但是,正如Panagiotis Kanavos所提到的,您确实应该在
GROUP by
子句中指定非聚合字段(即不使用聚合函数的字段,如
MAX()
AVG()
COUNT()
等)

看这个例子

    SELECT 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated, 
      GROUP_CONCAT(DISTINCT fc.fkcategory ORDER BY fc.fkcategory ASC ) AS categories_ids 
    FROM `files` AS f 
    INNER JOIN `file_categories` AS fc ON (fc.fkfile = f.id) 
    GROUP BY 
      f.id,
      f.title,
      f.filename,
      f.description,
      f.date_uploaded,
      f.last_updated
您的版本和这个版本都可以运行,不过我强烈推荐这个版本。不指定group by中的非聚合字段会产生不确定的结果。您不能保证返回的数据是一致的

我没有可用于测试的5.1实例,因此无法重现您的错误。我也无法解释你看到的行为。我所能提供的最好的方法是尝试修复您的查询,使用
groupby
,看看这是否解决了问题。这不一定能解决问题,但值得一试


这里有一个SQL技巧:

您是否意识到即使在MySQL 5.1中,SELECT查询也不受支持?SELECT语句中不能有不属于GROU BY子句或聚合的字段。你会得到一个错误。如果禁用该错误,则会得到一个随机值,将任何结果或错误表也作为文本发布。图像不能被谷歌搜索、复制或执行。请尝试使用合适的数据库客户端,而不是PHPMyAdmin。你所看到的可能只是工具的产物,顺便说一句,不需要重做。返回
1,2,3
感谢@Panagiotis Kanavos提供的提示。。。在写了我的sql之后,我一直在用PHPMyAdmin进行测试,这是我的第二个问题,我想我必须找到一个替代方案。你知道即使在MySQL 5.1中也不支持SELECT查询吗?SELECT语句中不能有不属于GROU BY子句或聚合的字段。你会得到一个错误。如果禁用该错误,则会得到一个随机值,将任何结果或错误表作为文本t发布