我有这样结构的一个表
create table PrimaryStandardSubstance
(
   1    int not null auto_increment,
   2    varchar(50) not null,
   3    char(2) not null,
   4    varchar(50),
   5    varchar(50) not null,
   6    varchar(200),
   7    varchar(50),
   8    varchar(100),
   9    varchar(50),
   10   varchar(50),
   11   float,
   12   varchar(250),
   13   varchar(50),
   14   varchar(400),
   15   varchar(1000),
   16   varchar(50),
   17   varchar(3000),
   18   varchar(250),
   19   varchar(1000),
   20   varchar(1000),
   21   varchar(1000),
   22   text,
   23   varchar(50),
   24   varchar(1000),
   25   varchar(50),
   26   varchar(500),
   27   varchar(200),
   28   text,
   29   text,
   30   text,
   31   text,
   32   text,
   tlcDep               text,
   gcDep                text,
   lcDep                text,
   solventLeft          text,
   highTemp             text,
   oxygenate            text,
   preparationTech      text,
   reference            text,
   primary key (1)
);数字代表特定的列名,我是分步进行插入的,前面三步将1-32的数据全部插入到一条记录中了,第四步时,插入后面几个text中的除最后一个reference那条记录,提示Got error 139 from storage engine,一说是MYSQL每条记录不能超过8K,但不算text字段,那为什么会出现插入text列时候出现这个问题呢?一说text不能超过15个,但我数了数也没超过15个啊(才14个)。请问不改变数据库结构的情况下有什么较好的解决办法吗?我用的是MYSQL 5.0.18-nt。

解决方案 »

  1.   

    mysql> create table PrimaryStandardSubstance
        -> (
        ->   `1`   int not null auto_increment,
        ->   `2`   varchar(50) not null,
        ->   `3`   char(2) not null,
        ->   `4`   varchar(50),
        ->   `5`   varchar(50) not null,
        ->   `6`   varchar(200),
        ->   `7`   varchar(50),
        ->   `8`   varchar(100),
        ->   `9`   varchar(50),
        ->   `10`   varchar(50),
        ->   `11`   float,
        ->   `12`   varchar(250),
        ->   `13`   varchar(50),
        ->   `14`   varchar(400),
        ->   `15`   varchar(1000),
        ->   `16`   varchar(50),
        ->   `17`   varchar(3000),
        ->   `18`   varchar(250),
        ->   `19`   varchar(1000),
        ->   `20`   varchar(1000),
        ->   `21`   varchar(1000),
        ->   `22`   text,
        ->   `23`   varchar(50),
        ->   `24`   varchar(1000),
        ->   `25`   varchar(50),
        ->   `26`   varchar(500),
        ->   `27`   varchar(200),
        ->   `28`   text,
        ->   `29`   text,
        ->   `30`   text,
        ->   `31`   text,
        ->   `32`   text,
        ->   tlcDep               text,
        ->   gcDep                text,
        ->   lcDep                text,
        ->   solventLeft          text,
        ->   highTemp             text,
        ->   oxygenate            text,
        ->   preparationTech      text,
        ->   reference            text,
        ->   primary key (`1`)
        -> );
    Query OK, 0 rows affected (0.11 sec)mysql>
      

  2.   

    其实你为什么不把错误信息一起贴出来?ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near '1
    int not null auto_increment,
      2    varchar(50) not null,
      3    char(2) no' at line 3
    数字不能做为字段名,表名。如果一定要用则需要用反引号`标识
      

  3.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  4.   


    你根本还没有明白我想问的,1-32只是我替换了原来数据库的列名,我想问的是在插入数据的时候后面为什么会出现Got error 139 from storage engine 
    “前面三步将1-32的数据全部插入到一条记录中了,第四步时,插入后面几个text中的除最后一个reference那条记录,提示Got error 139 from storage engine,一说是MYSQL每条记录不能超过8K,但不算text字段,那为什么会出现插入text列时候出现这个问题呢?一说text不能超过15个,但我数了数也没超过15个啊(才14个)。请问不改变数据库结构的情况下有什么较好的解决办法吗?我用的是MYSQL 5.0.18-nt。”
      

  5.   

    my_base.h:275:#define HA_ERR_TO_BIG_ROW 139 /* Too big row */ The maximum row length in InnoDB is 8000 bytes, excluding the end parts of a BLOB and TEXT that exceed 768 bytes.单条记录长度有限制的哈!blob & text 最开始的768字节会直接存入记录中,多出来的部分另外存储(不算在这8000字节中)768 * 10 = 7680字节(所以就算没有其他字段,应该说最多就10个text字段;如果有其他字段,可能还要少点哈)
      

  6.   

    blob & text 最开始的768字节会直接存入记录中,多出来的部分另外存储(不算在这8000字节中)这个是重点~
      

  7.   


    我看了mysql5.1的文档,它说它的页大小默认为16KB,而最大行长度不能超过8000,即一页的一半小一点。InnoDB在行中存储VARCHAR,BLOB或TEXT列的前768字节,余下的存储的分散的页面中。那么上面那张表是不是需要分成三张表来存储呢?而为什么大小为16KB,而最大行长度(这是指每条记录的长度吗?)才8000呢?