【问题标题】:MySql - doesn't support BLOB/TEXT columnsMySql - 不支持 BLOB/TEXT 列
【发布时间】:2017-04-27 07:49:03
【问题描述】:
create temporary table if not exists tmp engine=memory 
SELECT id, CONCAT(TRIM(lastName),TRIM(firstName),TRIM(zip)) AS identify
FROM customers 
GROUP BY identify;

在运行该过程时,我收到以下错误消息:

The used table type doesn't support BLOB/TEXT columns

我已经看到this 线程,但它对我没有帮助。

列上的类型如下:

lastName -> VARCHAR(255)
firstName -> VARCHAR(255)
zip -> VARCHAR(10)

当我从程序中排除 zip 时,它应该正常工作,所以我猜 varchar 的长度有问题?

有没有人知道不将 zip 的 varchar 长度从 10 更改为 255 的解决方案?

【问题讨论】:

  • 你不能把CAST()的计算值返回给VARCHAR()吗?

标签: mysql stored-procedures temp-tables


【解决方案1】:

发生率由常量CONVERT_IF_BIGGER_TO_BLOB 的值表示:

/**
  CHAR and VARCHAR fields longer than this number of characters are converted
  to BLOB.
  Non-character fields longer than this number of bytes are converted to BLOB.
  Comparisons should be '>' or '<='.
*/
#define CONVERT_IF_BIGGER_TO_BLOB 512   /* Used for CREATE ... SELECT */

mysql-server/sql/sql_const.h::52

16.3 The MEMORY Storage Engine

  • ...

  • 支持 MEMORY 不支持的可变长度数据类型(包括 BLOB 和 TEXT)。

例子:

mysql> DROP TEMPORARY TABLE IF EXISTS `tmp`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE IF NOT EXISTS `tmp` ENGINE=MEMORY
    -> SELECT SPACE(512) `tmp_col`;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> DROP TEMPORARY TABLE IF EXISTS `tmp`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE IF NOT EXISTS `tmp` ENGINE=MEMORY
    -> SELECT SPACE(513) `tmp_col`;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns

试试:

mysql> DROP TABLE IF EXISTS `tmp`, `customers`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `customers` (
    ->   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   `lastName` VARCHAR(255) NOT NULL,
    ->   `firstName` VARCHAR(255) NOT NULL,
    ->   `zip` VARCHAR(10) NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE IF NOT EXISTS `tmp` (
    ->   `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY,
    ->   `identify` VARCHAR(520) NOT NULL
    -> ) ENGINE=MEMORY;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `tmp`
    -> SELECT `id`, CONCAT(TRIM(`lastName`),
    ->                     TRIM(`firstName`),
    ->                     TRIM(`zip`)) `identify`
    -> FROM `customers`
    -> GROUP BY `id`, `identify`;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

【讨论】:

  • 非常感谢您的研究和解决方案!
【解决方案2】:

我对 ENGINE=MEMORY 的经验是,字符集也是相关的。 使用 charset latin1 的 varchar(65000) 工作;字符集 UTF8 没有 引擎=内存默认字符集=latin1

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 2011-10-27
  • 2021-02-28
  • 2018-04-02
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多