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サンプルコード

推薦する

Docker Compose で利用可能な環境変数の詳細な説明

Compose のいくつかの部分は、何らかの方法で環境変数を扱います。このチュートリアルは、必要な情...

Linux 上の MySQL 5.7 でパスワードを忘れる問題を解決する

1. 問題Linux 上の mysql5.7 のパスワードを忘れました2. 解決策• ステップ 1:...

Linux コマンドを使用してオーディオ形式を変換および結合する方法

FFmpeg flacをインストールする eric@ray:~$ sudo apt install ...

24 の実用的な JavaScript 開発のヒント

目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...

PythonはデータベースMySQLの解凍バージョンのインストール構成に接続し、問題が発生しました

導入今日は Python でデータベースに接続する方法を学んだので、MySQL データベースをインス...

MySQL データベース テーブルのパーティション分割に関する考慮事項 [推奨]

テーブル パーティショニングは、データベース パーティショニングとは異なります。では、テーブル パー...

Alibaba Cloud CentOS 7 に yum を使用して MySQL をインストールする正しい方法 (推奨)

yum クイックインストール mysql yumリポジトリを追加する rpm -Uvh http:...

Dockerにおけるオーバーレイネットワークの詳細な説明

Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/n...

docker compose helloworld を使い始めるための詳細なプロセス

前提条件Compose は、Docker コンテナをオーケストレーションするためのツールです。Doc...

MySQLの通常インデックスとユニークインデックスの違いの詳しい説明

目次1 概念上の区別2 事例紹介3 クエリパフォーマンス4 アップデートのパフォーマンス4.1 記憶...

ローカルでビルドした Docker イメージを Dockerhub に公開する方法

今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...

CentOS7におけるKVM仮想化の基本管理の詳しい説明

1. kvm仮想化をインストールする : : : : : : : : : : : : : : : :...

CentOS 6 は Docker を使用して Zookeeper 操作例を展開します

この記事では、Docker を使用して Centos6 に Zookeeper をデプロイする方法に...

他の人が私のウェブページを保存したり、サイトをコピーしたりするのを防ぐためのヒント

現在、インターネット上でウェブサイトをコピーすることは非常に一般的です。では、他人が私たちのウェブサ...

MySQL 5.7.17 無料インストールバージョンの設定方法グラフィックチュートリアル (Windows10)

1. 概要ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージ...