我通过这个CREATE TABLE TFILES (ID INT(4) NOT NULL, FILENAME VARCHAR(255), FILE LONGBLOB, PRIMARY KEY (ID));语句在test库中建立了一个表,然后我通过程序上传个文件,存在FILE字段。FILE字段定义为LONGBLOB字段,我从手册了解到LONGBLOB存储空间小于2的32次方,我传了一个大约200k的文件都不行,文件被截断。导出去以后只有28k左右。我想应该是表的某个参数没有设置对,该怎么做啊?是不是该修改max_allowed_packet 阿,谢谢拉!

解决方案 »

  1.   

    补充一下,一个字段最大可以达到2的32次方左右。听说mysql表的大小有限制的,如果我每条记录都存进去很大的文件,会不会导致最后没有几条记录,表就达到了最大容量了。该怎么处理阿。谢谢啦
      

  2.   


    MySQL中文参考手册
    译者:晏子 ([email protected])      主页:http://linuxdb.yeah.net
    --------------------------------------------------------------------------------第一章, 前一章, 下一章, 最后一章,目录. 
    --------------------------------------------------------------------------------9 MySQL服务器功能 
    9.1 MySQL支持哪些语言?
    mysqld可以用下列语言发出错误消息:捷克语、荷兰语、英语(缺省)、爱沙尼亚语、法语、德语、匈牙利、意大利语、挪威语。 启动mysqld使用一种特定的语言,使用一个--language=lang或-L lang选项。例如: shell> mysqld --language=swedish或: shell> mysqld --language=/usr/local/share/swedish注意,所有语言的名称用小写字母指定。 语言文件位于(缺省的)'mysql_base_dir/share/LANGUAGE/'。 为了更新错误消息文件,你应该编辑“errmsg.txt”文件并且执行下列命令生成“errmsg.sys”文件: shell> comp_err errmsg.txt errmsg.sys如果你升级到一个更新的MySQL版本,记得要再次用新的“errmsg.txt”文件进行更新。 9.1.1 用于数据和排序的字符集
    缺省地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。这是在美国和西欧使用的字符集。 字符集决定了在名字中允许什么字符和如何由SELECT语句的ORDER BY和GROUP BY子句排序。 通过给configure以--with-charset=charset选项,你可以在编译时改变字符集。见4.7.1 快速安装概述。 为了把其他字符集加入MySQL,使用下列过程: 9.1.2 增加一个新的字符集
    为字符集选择一个名字,下面用MYSET表示。 
    在MySQL源代码分发中创造文件“strings/ctype-MYSET.c”。 
    研究一个现有的“ctype-*.c'文件,看需要定义什么。注意,你文件中的数组必须有类似于ctype_MYSET、to_lower_MYSET等等的名字。to_lower[]和to_upper[]是简单的数组,保存字符集每个成员相应的小写和大写字符。例如: 
    to_lower['A'] should contain 'a'
    to_upper['a'] should contain 'A'
    sort_order[]是一个映射,指出字符为了比较和排序目的应该如何定序。对于许多字符集,这与to_upper[]一样(意味着排序将忽略大小写)。MySQL将基于sort_order[character]值排序字符。ctype[]是一个位值的数组,一个元素对应一个字符。(注意,to_lower[]、to_upper[]和sort_order[]按字符定下标,但是ctype[]按字符值+1定下标。这是一个旧遗产以便能处理EOF) 你能在“m_ctype.h”找到下列bitmask定义: #define _U      01      /* Upper case */
    #define _L      02      /* Lower case */
    #define _N      04      /* Numeral (digit) */
    #define _S      010     /* Spacing character */
    #define _P      020     /* Punctuation */
    #define _C      040     /* Control character */
    #define _B      0100    /* Blank */
    #define _X      0200    /* heXadecimal digit */每个字符的ctype[]的入口应该是描述字符的适用的位模(bitmask)值的联合(union)。例如,'A'是一个大写字符(_U) ,同时是十六进制位(_X),这样ctype['A'+1]应该包含值: _U + _X = 01 + 0200 = 0201为你的字符集增加一个唯一的编号到“include/m_ctype.h.in”。 
    把字符集名字加到在configure.in中的CHARSETS_AVAILABLE表。 
    重新配置,重新编译并且测试。 
    9.1.3 多字节字符支持
    如果你正在创建一个多字节字符集,你可以使用_MB宏。在“include/m_ctype.h.in”,增加:#define MY_CHARSET_MYSET  X
    #if MY_CHARSET_CURRENT == MY_CHARSET_MYSET
    #define USE_MB
    #define USE_MB_IDENT
    #define ismbchar(p, end)  (...)
    #define ismbhead(c)       (...)
    #define mbcharlen(c)      (...)
    #define MBMAXLEN          N
    #endif这里: MY_CHARSET_MYSET  一个唯一的字符集值。  
    USE_MB  这个字符集有多字节字符,由ismbhead()和mbcharlen()来处理。 
    USE_MB_IDENT  (可选 ) 如果定义,你能使用多字节字符的表和列名。 
    ismbchar(p, e)  如果p不是一个多字节字符字符串,返回0,否则如果它是,返回字符的大小(字节数)。p和e指向字符串的开始和结束。检查是从(char*)p到(char*)e-1。  
    ismbhead(c)  如果c是一个多字节字符字符串的第一个字符,返回真。 
    mbcharlen(c)  如果c是一个多字节字符串的第一个字符,返回该字符串的大小。 
    MBMAXLEN  在字符集中最大字符的字节大小。 9.2 更新日志
    当以--log-update=file_name选项启动时,mysqld将所有更新数据的SQL命令写入记录文件中。文件被写入数据目录并且有一个名字file_name.#,这里#是一个数字,它在每次执行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS语句、或重启服务器时加1。 如果你使用--log或-l选项,mysqld用一个文件名“hostname.log”写一个通用的记录文件,并且重启和更新不会引起一个新的记录文件生成(尽管它被关闭并且再打开)。缺省地,mysql.server脚本用-l选项启动MySQL服务器,如果当你在生产环境中开始使用MySQL时,你需要好一些的性能,你可以从mysql.server中删除-l选项。 更新记录很聪明,因为它仅仅记载真正更新数据的语句。因此一个用WHERE的UPDATE或DELETE找不到行,它就不被写入记录文件。它甚至跳过将设置一个列为它已经有的值的UPDATE语句。 如果你想要从更新记录文件更新一个数据库,你可以如下做到(假设你的更新记录有“file_name.#”形式的名字): shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysqlls被用来以正确的次序得到所有的记录文件。 如果你必须在一个崩溃后恢复到备份文件并且你想要再做发生在备份和崩溃之间的更新,这可以很有用。 当你在其他主机上有一个镜像数据库并且你想要复制必须对主数据库进行的改变时,你也可以使用更新记录。 9.3 MySQL数据库表可以有多大?
    MySQL 3.22 在表大小上有一个4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可达8百万 TB(2^63个字节)。 然而注意,操作系统有其自身文件大小的限制。在Linux上,当前的限制是2G;在Solaris 2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。这意味着MySQL表的大小通常由操作系统限制。 缺省地,MySQL表最大尺寸大约4G。你可用SHOW TABLE STATUS命令或myisamchk -dv table_name检查一个表的最大表大小。见7.21 SHOW句法(得到表、列等的信息)。如果你需要大于 4G 的表(并且你的操作系统支持它),你应该在你创建表时设定AVG_ROW_LENGTH和MAX_ROWS参数。见7.7 CREATE TABLE语法。你也能用ALTER TABLE在以后设置这些。见7.8 ALTER TABLE语法。 如果你的大表要变成只读,你可以使用myisampack合并并且把许多表压缩成一个。myisampack通常压缩一个表到至少50%,因此你可以有,实际上,更大的表。见12.5 MySQL压缩的只读的表生成器。 另一个的解决方案可以是内含包括MERGE库,它允许你将一个许多相同的表的集合作为一个来处理。(在这种情况下相同意味着所有的表由相同的列信息创建)目前MERGE只能用于扫描一个表集合,因为它不支持索引。我们在不久的将来将把索引加进去。 
      

  3.   

    拷贝多了些,只有下面的
    9.3 MySQL数据库表可以有多大?
    MySQL 3.22 在表大小上有一个4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可达8百万 TB(2^63个字节)。 然而注意,操作系统有其自身文件大小的限制。在Linux上,当前的限制是2G;在Solaris 2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。这意味着MySQL表的大小通常由操作系统限制。 缺省地,MySQL表最大尺寸大约4G。你可用SHOW TABLE STATUS命令或myisamchk -dv table_name检查一个表的最大表大小。见7.21 SHOW句法(得到表、列等的信息)。如果你需要大于 4G 的表(并且你的操作系统支持它),你应该在你创建表时设定AVG_ROW_LENGTH和MAX_ROWS参数。见7.7 CREATE TABLE语法。你也能用ALTER TABLE在以后设置这些。见7.8 ALTER TABLE语法。 如果你的大表要变成只读,你可以使用myisampack合并并且把许多表压缩成一个。myisampack通常压缩一个表到至少50%,因此你可以有,实际上,更大的表。见12.5 MySQL压缩的只读的表生成器。 另一个的解决方案可以是内含包括MERGE库,它允许你将一个许多相同的表的集合作为一个来处理。(在这种情况下相同意味着所有的表由相同的列信息创建)目前MERGE只能用于扫描一个表集合,因为它不支持索引。我们在不久的将来将把索引加进去。 
      

  4.   

    楼主的问题可以修改下max_allowed_packet 试试,这是数据包的长试大小,通常默认是1M,
    net_buffer_length 
    通信缓冲区在查询之间被重置到该大小。通常这不应该被改变,但是如果你有很少的内存,你能将它设置为查询期望的大小。(即,客户发出的SQL语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)