ホームページ >データベース >mysql チュートリアル >MySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)

MySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)

WBOY
WBOY転載
2022-01-13 15:35:442780ブラウズ

この記事では、mysql の blob と text データ型を見てみましょう。Blob はバイナリ ファイルを保存できるコンテナです。text 型は char や varchar に似ており、文字列の保存に使用できます。これら 2 つのデータ タイプの関連知識を見てみましょう。皆様のお役に立てれば幸いです。

MySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)

1. BLOB タイプ

blob (バイナリ ラージ オブジェクト) は、次のことができるバイナリ ファイルです。コンテナは主に、画像、オーディオ、ビデオ ファイルなどの大きなバイナリ オブジェクトを保存するために使用されます。 BLOB タイプは、ストレージ容量のサイズに応じて次の 4 つのタイプに分類できます。

MySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)

最も一般的に使用されるのは、大量のデータを格納できる BLOB フィールド タイプです。最大 65 KB のデータ。通常はアイコンやロゴ画像を保存するために使用されます。ただし、データベースは画像を直接保存するのには適していませんので、大量の画像を保存する必要がある場合は、オブジェクトストレージまたはファイルストレージを使用してください。画像のパスをデータベースに保存して呼び出すこともできます。

2. テキスト型

テキスト型は char や varchar に似ており、文字列の格納に使用できます。長いテキスト文字列が必要な場合は、テキスト タイプの使用を検討してください。ストレージ サイズに応じて、テキスト タイプも次の 4 つのタイプに分類できます。

MySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)

ただし、日常的なシナリオでは、文字列を格納するには varchar を使用する方が良いでしょう。長いテキストを保存する場合のみ、データの場合はテキスト タイプを使用できます。 varchar と比較して、テキスト型には次の特徴があります。

  • テキスト型は長さを指定する必要がありません。

  • データベースで strict sqlmode が有効になっていない場合、挿入された値がテキスト列の最大長を超えると、値は切り捨てられて挿入され、警告が生成されます。

  • テキスト タイプのフィールドにはデフォルト値を設定できません。

  • varchar はインデックスを直接作成できます。テキスト フィールドにインデックスを作成するには、最初の文字数を指定する必要があります。

  • text 型の検索効率は varchar よりも低くなります。

テキスト型の使用法を詳しくテストしてみましょう:

# 创建测试表 字符集是 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)

上記のテストを通じて、テキスト型の記憶容量は文字ではなくバイト単位であることがわかりました。 。たとえば、tinytext は 255 文字ではなく、最大 255 バイトを保存できます。utf8 文字セットでは、1 つの英語の文字または数字が 1 バイトを占め、1 つの中国語の文字が 3 バイトを占めます。つまり、tinytext は最大 255/3=85 の漢字を保存でき、text は最大 65535/3=21845 の漢字を保存できます。 varchar(M) の M は文字数を表し、英語、数字、中国語の文字はそれぞれ 1 文字を占めます。つまり、tinytext が格納できるサイズは varchar(255) を超えません。

概要:

この記事では、BLOB フィールドとテキスト フィールドの種類に関する知識を紹介します。 BLOB 型とテキスト型の使用は通常、データベース仕様では推奨されていませんが、これら 2 つのデータ型は、歴史的な問題や特定のシナリオにより依然として使用されています。この記事は記録用ですので、使用する際の参考にしてください。

推奨学習: mysql ビデオ チュートリアル

以上がMySQL の BLOB およびテキスト データ型について話しましょう (詳細な例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はMysql技术公众号で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。