MySQL BLOB和TEXT型态

2013-06-14_111219

这是MySQL 5实力养成暨评量里的4-57.‘对于字串型态的TEXT类型,下列叙述何者正确?’

答案:(A) 包含四种资料型态(TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT) (B) 不可以设定初始值

[adsense][/adsense]

这题的关键就在于初始值是否可以设,当然本人只依据过往网页设计的经验来猜(C)结果可想而知,我们再好好读一下手册吧,请看

MySQL 5.7 Reference Manual :: 11 Data Types :: 11.4 String Types :: 11.4.3 The BLOB and TEXT Types

MySQL 5.1参考手册 :: 11. 列类型::11.4. String类型::11.4.3. BLOB和TEXT类型

转繁体中文于下:

BLOB是一个二进制大物件,可以容纳可变数量的资料。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和储存需求。

参见11.5节,“列类型储存需求”

BLOB 列被视为二进制字串(字节字串)。TEXT列被视为非二进制字串(字元字串)。BLOB列没有字元编码,并且排序和比较基于栏位值字节的数值值。TEXT列有一个字元编码,并且根据字元编码的 校对规则对值进行排序和比较。

在TEXT或BLOB列的储存或检索过程中,不存在大小写转换。

当未运行在严格模式时,如果您为BLOB或TEXT栏位分配一个超过该栏位类型的最大长度的值,值被截取以保证适合。如果截掉的字元不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告。参见5.3.2节,“SQL伺服器模式”

在大多数方面,可以将BLOB栏位视为能够足够大的VARBINARY栏位。同样,可以将TEXT栏位视为VARCHAR栏位。BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR:

·         当保存或检索BLOB和TEXT栏位的值时不删除尾部空格。(这与VARBINARY和VARCHAR栏位相同)。

请注意比较时将用空格对TEXT进行扩充以适合比较的物件,正如CHAR和VARCHAR。

·         对于BLOB和TEXT栏位的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。参见7.4.3节,“列索引”

·         BLOB和TEXT栏位不能有初始值

LONG和LONG VARCHAR对应MEDIUMTEXT资料型态。这是为了保证相容性。如果TEXT栏位型态使用BINARY属性,将为栏位分配列字元编码的二元校对规则。

MySQL连接程式/ODBC将BLOB值定义为LONGVARBINARY,将TEXT值定义为LONGVARCHAR。

由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束:

·         当排序时只使用该栏位的前max_sort_length个字节。max_sort_length的 预设值是1024;该值可以在启动mysqld伺服器时使用–max_sort_length选项进行更改。参见5.3.3节,“伺服器系统变数”

运行时增加max_sort_length的值可以在排序或组合时使更多的字节有意义。任何客户端可以更改其会话max_sort_length变数的值:

mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM tbl_name
    -> ORDER BY comment;

当您想要使超过max_sort_length的字节有意义,对含长值的BLOB或TEXT栏位使用GROUP BY或ORDER BY的另一种方式是将栏位值转换为固定长度的物件。标准方法是使用SUBSTRING函数。例如,下面的语句对comment列的2000个字节进行排序:

mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name
    -> ORDER BY SUBSTRING(comment,1,2000);

·         BLOB或TEXT物件的最大大小由其类型确定,但在客户端和伺服器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。您可以通过更改max_allowed_packet变数的值更改消息缓存区的大小,但必须同时修改伺服器和客户端程式。例如,可以使用mysqlmysqldump来更改客户端的max_allowed_packet值。参见7.5.2节,“调节伺服器参数”8.3节,“mysql:MySQL命令行工具”8.8节,“mysqldump:资料库备份程式”

每个BLOB或TEXT值分别由内部分配的物件资料表示。这与其它栏位类型形成对比,后者是当打开资料表时为每1栏位分配储存引擎。