代码之家  ›  专栏  ›  技术社区  ›  cypher

MySQL视图中的BLOB,而不是正确的数据

  •  2
  • cypher  · 技术社区  · 14 年前

    我使用 UNION ALL 从两个表中获取相同的列名,以便为这些表中的相同数据获取相同的列名(即。 tbl1.author2 AS translator tbl2.translator AS translator )以此类推,问题是当我试图从这个视图中选择一些东西时,有一半的数据显示为 BLOB

    视图定义为:

    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 
    

    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;
    

    你知道为什么吗?

    1 回复  |  直到 14 年前
        1
  •  9
  •   Brian Hooper    14 年前

    创建具有 UNION ,则必须确保相应列的数据类型相同(或至少相似到足以将一列转换为另一列)。在当前情况下,视图的第一列是 publishers price_vat ,并且除了 BLOB 这很有道理。

    如果你真的需要这个作为一个观点,你可以尝试。。。

    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;
    

    将单个数据类型放入每列。

    推荐文章