MySQL のバイナリおよび varbinary データ型の詳細な説明

MySQL のバイナリおよび varbinary データ型の詳細な説明

序文

BINARY と VARBINARY は、文字列ではなくバイナリ文字列を格納する点を除いて、CHAR 型と VARCHAR 型に似ています。つまり、BINARY と VARBINARY には文字セットの概念がなく、並べ替えや比較はすべてバイナリ値に基づいて行われます。

BINARY(N)VARBINARY(N)の N はバイト長を表し、 CHAR(N)VARCHAR(N)の N は文字長を表します。 BINARY(10)の場合、格納できるバイト数は10に固定されていますが、 CHAR(10)の場合、格納できるバイト数は文字セットによって異なります。

次の例を見てみましょう。

mysql> テーブル t を作成します (
 -> バイナリ(1)
 ->)ENGINE=InnoDB CHARSET=GBK;
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
mysql> 名前を設定する GBK;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
MySQL> INSERT INTO t SELECT 'i';
クエリは正常、1 行が影響を受け、1 つの警告 (0.01 秒)
記録: 1 重複: 0 警告: 1
mysql> 警告を表示\G;
************************** 1. 行 ****************************
 レベル: 警告
 コード: 1265
メッセージ: 行 1 の列 'a' のデータが切り捨てられました
セット内の 1 行 (0.00 秒)
mysql> SELECT a,HEX(a) FROM t\G;
************************** 1. 行 ****************************
 あ:
16進数(a): CE

テーブル t にはBINARY(1)型の列が含まれています。 BINARY(N)の N はバイトを表し、gbk 文字セットの中国語の文字「我」には 2 バイトが必要なので、挿入時に文字が切り捨てられることを示す警告が表示されます。 SQL_MODE が厳密モードの場合、エラーが直接報告されます。テーブル t の内容を見ると、文字「I」の最初のバイトのみが a に格納され、2 番目のバイトは切り捨てられていることがわかります。テーブル t の列 a の文字タイプが CHAR の場合、上記の問題はまったく発生しません。例:

mysql> テーブル t を作成します (
 -> CHAR(1)
 ->)ENGINE=InnoDB CHARSET=GBK;
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
mysql> INSERT INTO t SELECT 'I';
クエリは正常、1 行が影響を受け、1 つの警告 (0.01 秒)
記録: 1 重複: 0 警告: 0
mysql> SELECT a,HEX(a) FROM t\G;
************************** 1. 行 ****************************
 a: I 16進数 (a): CED2
セット内の 1 行 (0.00 秒)

BINARY と VARBINARY を CHAR と VARCHAR と比較した場合の最初の違いは、 BINARY(N)VARBINARY(N)の N 値が文字の長さではなくバイト数を表すことです。2 番目の違いは、CHAR と VARCHAR が文字を比較する場合、文字自体に格納されている文字のみが比較され、文字の後の埋め込み文字は無視されることです。BINARY と VARBINARY はバイナリ値に従って比較されるため、結果が大きく異なります。例:

mysql> 選択
 -> HEX('a')、
 -> HEX('a ')、
 -> 'a' = 'a '\G; 
************************** 1. 行 ****************************
16進数('a'): 61
16進数('a'): 612020
'a'='a': 1
セット内の 1 行 (0.00 秒)
mysql> 選択
 -> 16進数(バイナリ('a'))、
 -> 16進数(バイナリ('a '))、
 -> BINARY('a') = BINARY('a ')\G; 
************************** 1. 行 ****************************
  16進数(2進数('a')): 61
 16進数(2進数('a ')): 612020
バイナリ('a') = バイナリ('a '): 0
セット内の 1 行 (0.00 秒)

CHAR と VARCHAR の場合は文字値を比較するため、最初の比較の戻り値は 1 になります。 BINARY と VARBINARY の場合、比較はバイナリ値に対して行われます。「a」の 16 進値は 61 で、「a 」の 16 進値は 612020 であり、明らかに異なります。したがって、2 番目の比較の戻り値は 0 になります。

3 番目の違いは、BINARY 文字列の場合、埋め込み文字は 0x00 であるのに対し、CHAR の場合、埋め込み文字は 0x20 であることです。これは、バイナリ比較の要件によるものと考えられます。0x00 は明らかに比較の最小文字です。例は次のとおりです。

mysql> テーブル t ( a BINARY(3) ) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> INSERT INTO t SELECT 'a';
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0
mysql> SELECT a,HEX(a) FROM t\G;
************************** 1. 行 ****************************
 : :
16進数(a): 610000
セット内の 1 行 (0.00 秒)

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MySQL のデータ型とスキーマの最適化の詳細な説明
  • MySQLのデータ型に関連する最適化方法
  • 実行速度を最適化するためにMySQLでデータ型を設定する例
  • MySQL の最適化: テーブル構造の最適化に関する 5 つの提案 (データ型の選択がわかりやすく説明されています)
  • pymysqlで取得したデータ型をタプルからpandasに変換する
  • mysql8.0.19 の基本データ型の詳細な説明
  • MySQL データ型における DECIMAL の使用法の詳細な説明
  • MySQL 操作: JSON データ型の操作
  • MySQL と Oracle のデータ型の対応 (表形式)
  • MySQL でサポートされているデータ型 (列タイプの概要)
  • MySQL データ型の最適化の原則

<<:  React.cloneElement の使い方の詳しい説明

>>:  ログインフォームを実装するためのReactサンプルコード

推薦する

Vue が配列の変更を監視できない問題の解決方法

目次1. Vueリスナー配列2. vueが配列の変更を監視できない状況1. Vueリスナー配列Vue...

Windows Server 2019 のセットアップ方法 (画像とテキスト付き)

1. Windows Server 2019 のインストールVmware に Windows Se...

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

NginxとLuaによるグレースケールリリースの実装

memcachedをインストールする yum インストール -y memcached #memcac...

Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル

MySQLの概要MySQL はリレーショナル データベース管理システムです。データベースは構造化され...

WeChatミニプログラムで検索キーワードを強調表示するサンプルコード

1. はじめにプロジェクトで要件に遭遇したら、データを検索してキーワードを強調表示します。要件を受け...

MySql SQL最適化のヒントの共有

ある日、内部結合を含む SQL ステートメントの実行速度はそれほど遅くはない (0.1 ~ 0.2)...

MySQL のマスター スレーブ レプリケーション オプションをオンラインで変更する方法

序文: MySQL で最も一般的に使用されるアーキテクチャは、マスター スレーブ レプリケーションで...

MySQL クイックデータ比較テクニック

MySQL の運用と保守において、R&D の同僚が 2 つの異なるインスタンスのデータを比較...

Linux (Centos7) に mysql8.0.18 をインストールするチュートリアル図

1 インストールリソースパッケージmysql-8.0.18-1.el7.x86_64.rpm-bun...

Dockerコンテナを外部IPとポートにバインドする方法

Docker を使用すると、外部からコンテナにアクセスしたり、コンテナを相互接続したりすることで、ネ...

Celery と Docker を使用して Django で定期的なタスクを処理する方法

Django アプリケーションを構築して拡張していくと、必然的に特定のタスクをバックグラウンドで自動...

LinuxシステムのAnsible自動運用保守導入方法

Ansible は、Python をベースに開発された新しい自動運用・保守ツールです。 多くの古い運...

別の種類の「キャンセル」ボタン

「キャンセル」ボタンは必要な操作プロセスの一部ではなく、デザイン上の主要な要素として表示されません...