BLOB in MySQL view instead of the proper data

好久不见. 提交于 2019-12-07 20:17:07

问题


I created a MySQL view using UNION ALL from two tables so that I would get the same column names for the same data in those tables (i.e. tbl1.author2 AS translator ... tbl2.translator AS translator) and so on, the problem is when I try to select something from that view, half of the data comes out as BLOB, instead of the original value.

The view definition is:

SELECT e.id AS prod_id, 
e.price_vat AS price_vat, 
e.product AS title, 
e.authors AS author, 
e.isbn AS isbn, 
e.ean AS ean, 
e.page_count AS page_count, 
e.publishers AS publishers, 
e.issue_year AS issue_year,
'e' AS type
FROM ama_euromedia_products AS e
UNION ALL
SELECT
k.publishers AS publishers, 
DATE_FORMAT(k.publication_date, '%Y') AS issue_year,
k.ean AS ean, 
k.number_of_pages AS page_count, 
k.author AS author, 
k.isbn AS isbn, 
k.title_full AS title, 
k.price_amount AS price_vat, 
k.internal AS prod_id,
'k' AS type
FROM ama_kosmas_products AS k 

The table definitions:

CREATE TABLE `ama_euromedia_products` (
  `id` int(9) NOT NULL,
  `product` text COLLATE utf8_czech_ci NOT NULL,
  `isbn` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `authors` text COLLATE utf8_czech_ci,
  `publishers` text COLLATE utf8_czech_ci,
  `price` float(9,0) DEFAULT NULL,
  `price_vat` float(9,0) DEFAULT NULL,
  `vat` int(3) DEFAULT NULL,
  `availability` tinyint(1) DEFAULT NULL,
  `genres` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `ean` bigint(14) DEFAULT NULL,
  `page_count` int(7) DEFAULT NULL,
  `issue_year` int(4) DEFAULT NULL,
  `supply_date` timestamp NULL DEFAULT NULL,
  `width` int(7) DEFAULT NULL,
  `height` int(7) DEFAULT NULL,
  `weight` int(7) DEFAULT NULL,
  `binding` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `long_v` text COLLATE utf8_czech_ci,
  `short` text COLLATE utf8_czech_ci,
  `imgurl` text COLLATE utf8_czech_ci,
  `is_preliminary` tinyint(1) DEFAULT NULL,
  `stack_date` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `invoice_only` tinyint(1) DEFAULT NULL,
  `new` tinyint(1) DEFAULT NULL,
  `sale` tinyint(1) DEFAULT NULL,
  `return_v` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `indexy` (`id`,`isbn`,`genres`,`ean`,`issue_year`,`supply_date`,`stack_date`,`new`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


CREATE TABLE `ama_kosmas_products` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `internal` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `isbn` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `ean` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `contained_items` text COLLATE utf8_czech_ci,
  `title_original` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `title_full` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `subtitle` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `other_text` text COLLATE utf8_czech_ci,
  `languages` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `author` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `illustrator` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `translator` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `number_of_pages` int(7) DEFAULT NULL,
  `subject_scheme_name` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `subject_code` int(7) DEFAULT NULL,
  `subject_heading_text` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `media_file_label` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `media_file_thumbnail` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `publishers` text COLLATE utf8_czech_ci,
  `publishing_status` tinyint(2) DEFAULT NULL,
  `publication_date` timestamp NULL DEFAULT NULL,
  `product_availability` tinyint(2) DEFAULT NULL,
  `on_hand` int(7) DEFAULT NULL,
  `on_order` int(7) DEFAULT NULL,
  `price_amount` int(7) DEFAULT NULL,
  `price_tax_rate_code` varchar(1) COLLATE utf8_czech_ci DEFAULT NULL,
  `price_tax_rate_percent` tinyint(2) DEFAULT NULL,
  `price_tax_amount` int(7) DEFAULT NULL,
  `price_taxable_amount` int(7) DEFAULT NULL,
  `reissue_date` timestamp NULL DEFAULT NULL,
  `invoice_only` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `internal` (`internal`)
) ENGINE=MyISAM AUTO_INCREMENT=43341 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Any idea why could that be?


回答1:


When you create a view with a UNION, you have to make sure the data types of the corresponding columns are the same (or at least, similar enough for one to be converted to the other). In the current case, the first column of the view is a publishers or a price_vat, and no data type definition apart from BLOB can make much sense of that.

If you really need this as a view, you could try...

SELECT e.price_vat AS price_vat, 
       NULL        AS publishers,
       ...etc...
       'e'         AS type
    FROM ama_euromedia_products AS e;
UNION ALL
SELECT
     NULL         AS price_vat,
     k.publishers AS publishers, 
     ...etc...
     'k'          AS type
     FROM ama_kosmas_products AS k;

to get a single data type into each column.



来源:https://stackoverflow.com/questions/3280212/blob-in-mysql-view-instead-of-the-proper-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!