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

推薦する

Vue3 での provide と injection の使用

1. provideとinjectの説明Provide と Inject により、ネストされたコンポ...

プレーンな JS オブジェクトの代わりに Map を使用する場合

目次1. マップは任意のタイプのキーを受け入れます2. マップにはキー名に関する制限はありません3....

Docker ファイルの保存パス、ポート マッピング操作モードの変更

コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...

MySQL テーブルにおける非主キー列オーバーフロー監視の詳細な説明

今日もまた罠に落ちてしまいました。 私は以前MySQLの主キーオーバーフローに遭遇したことがあり、そ...

MySQLのパラメータについてお話しましょう

序文:以前の記事では、特定のパラメータの機能についてよく紹介してきました。しかし、MySQL パラメ...

js でオブジェクトとオブジェクト メソッドを作成するいくつかの方法の詳細な説明

この記事は、JS レッドブックの第 8 章に記載されているオブジェクトに関する 2 番目の記事です。...

Docker で Confluence をデプロイするための完全な手順

Confluence は有料ですが、クラックして使用できます (購入が推奨され、正規版がサポートされ...

DOCTYPE 文書型宣言 (Web ページ愛好家必読)

DOCTYPE 宣言 作成するすべてのページの先頭に、ドキュメント宣言が必要です。はい、そうでしょう...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

音声キューイングシステムを実装するためのJavaScript

目次導入主な特徴エフェクト表示キーコード導入音声キューイングシステムは、銀行、レストラン、病院などの...

ウェブページのFOUC問題によるウェブページの混乱の解決策

FOUC は Flash of Unstyled Content の略で、FOUC と略されます。簡...

プライベートDockerリポジトリであるHarborをインストールするための詳細な手順

Harborのインストールは非常に簡単ですが、Dockerログインで行き詰まってしまいました。このブ...

ROS で Turtlebot3 移動ロボットを制御するための基本的なチュートリアル

中国語チュートリアルhttps://www.ncnynl.com/category/turtlebo...

MySQL truncate table ステートメントの使用

Truncate table ステートメントは、テーブル内のすべてのデータを削除/切り捨てるために使...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...