<nav id="qvmyt"><address id="qvmyt"></address></nav>
<pre id="qvmyt"></pre>
<u id="qvmyt"><listing id="qvmyt"></listing></u>


    <li id="qvmyt"><menuitem id="qvmyt"></menuitem></li>
    <li id="qvmyt"><source id="qvmyt"></source></li><progress id="qvmyt"><sub id="qvmyt"></sub></progress>
    <optgroup id="qvmyt"></optgroup>
  • 歡迎來到AD8000.CN 站長教程網!

    MySQL

    當前位置:主頁 > 數據庫 > MySQL >

    MySQL中的數據類型binary和varbinary詳解

    時間:2017-11-22|欄目:MySQL|點擊:

    BINARY和VARBINARY與 CHAR和VARCHAR類型有點類似,不同的是BINARY和VARBINARY存儲的是二進制的字符串,而非字符型字符串。也就是說,BINARY和VARBINARY沒有字符集的概念,對其排序和比較都是按照二進制值進行對比。
    BINARY(N)和VARBINARY(N)中的N指的是字節長度,而CHAR(N)和VARCHAR(N)中N指的是的字符長度。對于BINARY(10) ,其可存儲的字節固定為10,而對于CHAR(10) ,其可存儲的字節視字符集的情況而定。
    我們來看下面的例子。
    mysql> CREATE TABLE t (
     -> a BINARY(1)
     -> )ENGINE=InnoDB CHARSET=GBK;
    Query OK, 0 rows affected (0.02 sec)
    mysql> SET NAMES GBK;
    Query OK, 0 rows affected (0.00 sec)
    MySQL> INSERT INTO t SELECT '我';
    Query OK, 1 row affected, 1 warning (0.01 sec)
    Records: 1 Duplicates: 0 Warnings: 1
    mysql> SHOW WARNINGS\G;
    *************************** 1. row ***************************
     Level: Warning
     Code: 1265
    Message: Data truncated for column 'a' at row 1
    1 row in set (0.00 sec)
    mysql> SELECT a,HEX(a) FROM t\G;
    *************************** 1. row ***************************
     a:
    HEX(a): CE
    表t包含一個類型為BINARY(1)的列,因為BINARY(N)中N代表字節,而gbk字符集中的中文字符“我”需要占用2字節,所以在插入時給出警告,提示字符被截斷。如果SQL_MODE為嚴格模式,則會直接報錯。查看表t的內容,則可發現a中只存儲了字符“我”的前一個字節,后一個字節被截斷了。如果表t的a列中字符的類型為CHAR類型,則完全不會有上述問題,例如:
    mysql> CREATE TABLE t (
     -> a CHAR(1)
     -> )ENGINE=InnoDB CHARSET=GBK;
    Query OK, 0 rows affected (0.02 sec)
    mysql> INSERT INTO t SELECT '我';
    Query OK, 1 row affected, 1 warning (0.01 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    mysql> SELECT a,HEX(a) FROM t\G;
    *************************** 1. row ***************************
     a: 我
    HEX(a): CED2
    1 row in set (0.00 sec)
    BINARY和VARBINARY對比CHAR和VARCHAR,第一個不同之處就是BINARY(N)和VARBINARY(N)中的N值代表的是字節數,而非字符長度;第二個不同點是,CHAR和VARCHAR在進行字符比較時,比較的只是字符本身存儲的字符,忽略字符后的填充字符,而對于BINARY和VARBINARY來說,由于是按照二進制值來進行比較的,因此結果會非常不同,例如:
    mysql> SELECT
     -> HEX('a'),
     -> HEX('a '),
     -> 'a'='a '\G; 
    *************************** 1. row ***************************
    HEX('a'): 61
    HEX('a '): 612020
    'a'='a ': 1
    1 row in set (0.00 sec)
    mysql> SELECT
     -> HEX(BINARY('a')),
     -> HEX(BINARY('a ')),
     -> BINARY('a')= BINARY('a ')\G; 
    *************************** 1. row ***************************
      HEX(BINARY('a')): 61
     HEX(BINARY('a ')): 612020
    BINARY('a')= BINARY('a '): 0
    1 row in set (0.00 sec)
    對于CHAR和VARCHAR來說,比較的是字符值,因此第一個比較的返回值是1。對于BINARY和VARBINARY來說,比較的是二進制的值,“a”的十六進制為61,“a  ”的十六進制為612020,顯然不同,因此第二個比較的返回值為0。
    第三個不同的是,對于BINARY字符串,其填充字符是0x00,而CHAR的填充字符為0x20。可能是因為BINARY的比較需要,0x00顯然是比較的最小字符,示例如下:
    mysql> CREATE TABLE t ( a BINARY(3));
    Query OK, 0 rows affected (0.00 sec)
    mysql> INSERT INTO t SELECT 'a';
    Query OK, 1 row affected (0.00 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    mysql> SELECT a,HEX(a) FROM t\G;
    *************************** 1. row ***************************
     a: a
    HEX(a): 610000
    1 row in set (0.00 sec)

    上一篇:Mysql5.7中JSON操作函數使用說明

    欄    目:MySQL

    下一篇:mac下安裝mysql忘記密碼的修改方法

    本文標題:MySQL中的數據類型binary和varbinary詳解

    本文地址:

    說點什么吧
    • 全部評論(0
      還沒有評論,快來搶沙發吧!

    廣告投放 | 聯系我們 | 版權申明

    重要申明:本站所有的文章、圖片、評論等,均由網友發表或上傳并維護或收集自網絡,屬個人行為,與本站立場無關。

    如果侵犯了您的權利,請與我們聯系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

    聯系QQ:215436232 | 郵箱:215436232#qq.com(#換成@)

    Copyright © 2020-2022 站長教程網 AD8000.CN 版權所有

    河北懦蟹装饰工程有限公司