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

推薦する

MySQLの大規模テーブル最適化ソリューションについての簡単な説明

背景Alibaba Cloud RDS for MySQL(MySQL バージョン 5.7)データベ...

PHP クラスにおける static と self の違いの簡単な分析

メソッドが定義されているクラスに応じて、現在のクラスへの静的参照を取得するには、self:: または...

aタグに下線を付け、クリック前後で色を変える方法

コードをコピーコードは次のとおりです。リンクフォントサイズ: 12px;色: #000000;テキス...

MySQL 同時実行制御の原則に関する知識ポイント

Mysql は、高性能なデータ ストレージ サービスを提供する主流のオープン ソース リレーショナル...

CSSにスティッキー効果を追加する方法

前面に書かれたfilter:blur と filter:contrast がこのような素晴らしい化学...

Windows 10 での MySQL 8.0.16 のインストールと設定のチュートリアル

この記事では、参考までにMySQL 8.0.16のインストールと設定方法のグラフィックチュートリアル...

docker-compose を使用して Clickhouse をすばやくデプロイする方法のチュートリアル

ClickHouse は、オープンソースの列指向 DBMS (Yandex によって開発) です。 ...

はじめに: HTML の基本的なタグと属性の簡単な紹介

HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...

Reactフックの仕組み

目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...

MySQL のロングトランザクション例の詳細な説明

序文: 「MySQL 入門」シリーズの記事は終了しました。今後も引き続き MySQL に焦点を当て、...

JavaScript Sandboxについての簡単な説明

序文:サンドボックスといえば、私たちの頭には反射的に上の写真が思い浮かび、すぐに興味がわいてくるかも...

vuexの強制リフレッシュによるデータ損失問題の分析

vuex 永続状態基本原則: すべての vuex データをローカルストレージに保存し、ページが更新さ...

Linux サーバーに埋め込まれた ddgs および qW3xT.2 マイニング ウイルスの対処の実践記録

序文仮想通貨の狂気的な投機により、マイニングウイルスは犯罪者が最も頻繁に使用する攻撃方法の 1 つに...

jQueryは検証コード送信のコントロールボタンを無効にする機能を実装します

必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...