導入 保存時と読み取り時に CHAR 型と VARCHAR 型の違いを本当にご存知ですか? まずいくつかの結論を述べたいと思います。 1. CHAR は、ユーザーがデータを挿入するときに末尾にスペースを含めるかどうかに関係なく、保存する前に常にスペースで埋められます。 2. VARCHAR は格納時にスペースを埋めて格納しませんが、挿入時にユーザーが明示的にスペースを追加した場合は、そのまま格納され、削除されません。 3. データを読み取るとき、CHAR は常に末尾のスペースを削除します (書き込み時にスペースが含まれている場合でも)。 4. データを読み取るとき、VARCHAR は常に以前に格納された値を忠実に取得します (格納時に末尾のスペースがある場合、それは保持され続け、CHAR のように末尾のスペースは削除されません)。 以下はテスト検証プロセスです。 1. CHAR型をテストする テーブル構造: テーブル `tchar` を作成します ( `id` int(10) unsigned NOT NULL DEFAULT '0', `c1` char(20) NOT NULL デフォルト '' 主キー (`id`) )ENGINE=InnoDB デフォルト文字セット=utf8mb4; いくつかのレコードを挿入します: tchar値に挿入します(1、concat('a'、repeat(' '、19))); tchar値に挿入します(2、concat(' '、repeat('a'、19))); tchar値に挿入します(3、 'a'); tchar値に挿入します(4、 ' '); tchar値に挿入(5、''); ストレージ構造を表示します。 (1) INFIMUMレコードオフセット:99 ヒープ番号:0 ... (2) SUPREMUMレコードオフセット:112 ヒープ番号:1 ... (3)通常レコード オフセット:126 ヒープ番号:2 ... <- id=1 (4) 通常レコード オフセット:169 ヒープ番号:3 ... <- id=2 (5) 通常レコード オフセット:212 ヒープ番号:4 ... <- id=3 (6) 通常レコード オフセット:255 ヒープ番号:5 ... <- id=4 (7) 通常レコード オフセット:298 ヒープ番号:6 ... <- id=5 これを見ると少し混乱しますか? 私がお勧めしたツールを覚えていますか? こちらをご覧ください: innblock | InnoDB ページ監視ツール。 ご覧のとおり、文字列の長さに関係なく、各レコードは実際には 43 (169-126=43) バイトを占めます。したがって、結論1が成り立ちます。 tchar テーブルを読み取った結果を見てみましょう。 tcharからid、concat('000'、c1、'$$$')、length(c1)を選択します。 +----+----------------------------+------------+ | id | 連結('000',c1,'$$$') | 長さ(c1) | +----+----------------------------+------------+ | 1 | 000a$$$ | 1 | <- 末尾のスペースを削除 | 2 | 000 aaaaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000$$$ | 0 | <- 末尾のスペースを削除すると、結果は id=5 と同じになります | 5 | 000$$$ | 0 | +----+----------------------------+------------+ 2. VARCHAR型のテスト テーブル構造: テーブル `tvarchar` を作成します ( `id` int(10) unsigned NOT NULL DEFAULT '0', `c1` varchar(20) NOT NULL デフォルト '' 主キー (`id`) ) エンジン=InnoDB デフォルト文字セット=utf8mb4 いくつかのレコードを挿入します: tvarchar値に挿入します(1、concat('a'、repeat(' '、19))); tvarchar値に挿入します(2、concat(' '、repeat('a'、19))); tvarchar値に挿入します(3、 'a'); tvarchar値に挿入します(4、 ' '); tvarchar値に挿入(5、''); tvarchar値に挿入(6、''); ストレージ構造を表示します。 (1) INFIMUMレコードオフセット:99 ヒープ番号:0 ... (2) SUPREMUMレコードオフセット:112 ヒープ番号:1 ... (3)通常レコード オフセット:126 ヒープ番号:2 ... <- id=1 (4) 通常レコード オフセット:169 ヒープ番号:3 ... <- id=2 (5) 通常レコード オフセット:212 ヒープ番号:4 ... <- id=3 (6) 通常レコード オフセット:236 ヒープ番号:5 ... <- id=4 (7) 通常レコード オフセット:260 ヒープ番号:6 ... <- id=5 (8) 通常レコード オフセット:283 ヒープ番号:7 ... <- id=6 いくつかのレコードのバイト数は 43、43、24、24、23、23 であることがわかります (最後のレコードは id=5 のレコードと同じです)。 tvarchar テーブルを読み取った結果を見てみましょう。 tvarchar から id、concat('000'、c1、'$$$')、length(c1) を選択します。 +----+----------------------------+------------+ | id | 連結('000',c1,'$$$') | 長さ(c1) | +----+----------------------------+------------+ | 1 | 000a $$$ | 20 | <- 読み取り結果では末尾のスペースは削除されません | 2 | 000 aaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000 $$$ | 1 | <- このスペースは読み取り結果では削除されません | 5 | 000$$$ | 0 | | 6 | 000$$$ | 0 | +----+----------------------------+------------+ 一般的に、2 つの結論を導き出すことができます。 最後に、ドキュメントに何が書かれているか見てみましょう。
上記のテストで使用されたバージョンと環境は次のとおりです。 mysql> バージョンを選択()\G ... バージョン(): 8.0.15 mysql> @@sql_mode\G を選択 ... @@sql_mode: ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_ENGINE_SUBSTITUTION 参照ドキュメント 11.4.1 CHAR 型と VARCHAR 型、https://dev.mysql.com/doc/refman/5.7/en/char.html 上記はMySQL CHARとVARCHARストレージの違いの詳細な内容です。MySQL CHARとVARCHARの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: jsを使用してスライダーをドラッグする効果を実現します
>>: ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明
MySQL は強力なオープンソース データベースです。データベース駆動型アプリケーションの数が増える...
使用フレキシブル ボックスはフロントエンドの Web ページ レイアウトで重要な役割を果たしますが、...
1.sshコマンドLinux では、ssh コマンドを使用して別のサーバーにログインできます。 2 ...
目次1. テストデータ2. ヌル値による不便3. スペース、空の値、null をどのように判断すれば...
ELKとは何ですか? ELK は、Elastic が提供するログ収集およびフロントエンド表示ソリュー...
序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...
1. 追加時間()指定した秒数を日付に追加する select addtime(now(),1); -...
ますます多くのウェブサイトで、XHTML が HTML4 に取って代わって急速に普及しています。しか...
docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...
1. 目的:コードの保守が容易になり、さまざまなデータの分類が明確になります。 2. store/i...
目次仮想DOMとは何ですか?なぜ仮想DOMが必要なのでしょうか?仮想 DOM はどのようにして実際の...
導入:多くの場合、さまざまな選択ステートメントを使用して必要なデータを照会した後、多くの人は作業が正...
3つの仮想マシン132、133、134を群がらせる1. クラスターを初期化し、自分自身をクラスターに...
質問:よく使用されるコマンド「ll」が無効であるか、コマンドが見つかりません理由: 「ll」コマンド...
表は以下のとおりです。 Unity が読み取って呼び出すときのコード: データベース内の別のテーブル...