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がフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

CSS3 は本当に SCSS に取って代わるのでしょうか?

Web ページのスタイル設定に関しては、プロジェクトで純粋な CSS または SCSS (および他...

js を使用してシンプルなスイッチ ライト コードを実装する

体の部位: <button>ライトのオン/オフを切り替える</button>...

MySQL ピボットテーブルについての簡単な説明

次のような製品部品表があります。一部 部品ID 部品タイプ 製品ID ---------------...

ネイティブ JS でスネーク ゲームを書く

この記事では、参考までに、JSでスネークゲームを書くための具体的なコードを紹介します。具体的な内容は...

MySQLインデックスベースのストレステストの実装

1. データベースデータをシミュレートする1-1 データベースとテーブルスクリプトを作成する - v...

Vue は Echarts をインポートして折れ線グラフを実現します

この記事では、VueでEchartsをインポートして線散布図を実現する具体的なコードを参考までに共有...

Node.js の非同期イテレータの詳細な説明

目次序文非同期イテレータとは何ですか?非同期イテレータストリームとしてページング機能を備えたAPIの...

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

Windows での Tomcat サーバーのインストールに関するチュートリアル

1 ダウンロードして準備するまず、公式ウェブサイトからTomcatをダウンロードする必要があります。...

MySQL データ挿入効率の比較

データを挿入するとき、以前オフィス システムに取り組んでいたときにはデータベースのパフォーマンスにつ...

ウェブサイト製品設計の参考となるいくつかの原則

以下の分析は製品設計原則に関するものですが、そのほとんどはウェブサイト製品に基づいているため、ユーザ...

HTML テーブル マークアップ チュートリアル (42): テーブル ヘッダーの水平方向の配置属性 ALIGN

水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...

Hyper-v仮想マシンを使用してCentos7をインストールする

目次導入準備するシステムイメージをダウンロードHyper-Vを有効にする新しい仮想ネットワークスイッ...

フォームの送信イベントが応答しない

1. 問題の説明<br />JS を使用してフォームの送信メソッドを呼び出してフォームを...