首页 > 数据库 > MySQL > 正文

MySQL中blob和text数据类别怎么用

2024-07-24 12:33:42
字体:
来源:转载
供稿:网友
  今天小编给大家分享一下MySQL中blob和text数据类型怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
  
  不过在日常场景中,存储字符串还是尽量用 varchar ,只有要存储长文本数据时,可以使用 text 类型。对比 varchar ,text 类型有以下特点:
 
  text 类型无须指定长度。
  若数据库未启用严格的 sqlmode ,当插入的值超过 text 列的最大长度时,则该值会被截断插入并生成警告。
  text 类型字段不能有默认值。
  varchar 可直接创建索引,text 字段创建索引要指定前多少个字符。
  text 类型检索效率比 varchar 要低。
  下面我们来具体测试下 text 类型的使用方法:
 
  # 创建测试表 字符集是 utf8
  mysql> show create table tb_text/G
  *************************** 1. row ***************************
         Table: tb_text
  Create Table: CREATE TABLE `tb_text` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `a` tinytext,
    `b` text,
    `c` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  # 创建索引测试 发现text类型必须指定前缀长度
  mysql> alter table tb_text add index idx_a (a);
  ERROR 1170 (42000): BLOB/TEXT column 'a' used in key specification without a key length
  mysql> alter table tb_text add index idx_b (b);
  ERROR 1170 (42000): BLOB/TEXT column 'b' used in key specification without a key length
  mysql> alter table tb_text add index idx_c (c);
  Query OK, 0 rows affected (0.04 sec)
  Records: 0  Duplicates: 0  Warnings: 0
  mysql> alter table tb_text add index idx_b (b(10));
  Query OK, 0 rows affected (0.06 sec)
  Records: 0  Duplicates: 0  Warnings: 0
  # 插入数据测试(repeat函数用于生成重复数据)
  # 正常插入
  mysql> insert into tb_text  (a,b,c) values (repeat('hello',3),repeat('hello',3),repeat('hello',3));
  Query OK, 1 row affected (0.01 sec)
  # 插入英文字符超标
  mysql> insert into tb_text  (a) values (repeat('hello',52));
  Query OK, 1 row affected, 1 warning (0.01 sec)
  mysql> show warnings;
  +---------+------+----------------------------------------+
  | Level   | Code | Message                                |
  +---------+------+----------------------------------------+
  | Warning | 1265 | Data truncated for column 'a' at row 1 |
  +---------+------+----------------------------------------+
  1 row in set (0.00 sec)
  # 插入中文超标
  mysql>  insert into tb_text  (a) values (repeat('你好',100));
  Query OK, 1 row affected, 1 warning (0.02 sec)
  mysql> show warnings;
  +---------+------+----------------------------------------+
  | Level   | Code | Message                                |
  +---------+------+----------------------------------------+
  | Warning | 1265 | Data truncated for column 'a' at row 1 |
  +---------+------+----------------------------------------+
  1 row in set (0.00 sec)
  # 查看数据 发现数据有所截取 tinytext 类型最多存储255字节数据
  mysql> select * from tb_text;
  +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
  | id | a | b | c |
  +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
  |  1 | hellohellohello | hellohellohello | hellohellohello |
  |  2 | hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello | NULL| NULL|
  |  3 | 你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你| NULL| NULL|
  +----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
  3 rows in set (0.00 sec)
  通过以上测试,我们注意到,text 类型可存储容量是以字节为单位而不是字符。例如 tinytext 最多存储 255 个字节而不是 255 个字符,在 utf8 字符集下,一个英文字母或数字占用一个字节,而一个中文汉字占用三个字节。也就是说 tinytext 最多存储 255/3=85 个汉字,text 最多存储 65535/3=21845 个汉字。而 varchar(M) 中的 M 指的是字符数,一个英文、数字、汉字都是占用一个字符,即 tinytext 可存储的大小并不比 varchar(255) 多。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表