MySQL基礎知識01數據類型(一)字元串相關類型

来源:http://www.cnblogs.com/coe2coe/archive/2017/09/16/7531262.html
-Advertisement-
Play Games

1. CHAR 語法: CHAR (length) 其中length的取值範圍為1到255。 超過255則報錯: mysql> create table s3 ( value char(1023) primary key); ERROR 1074 (42000): Column length too ...


1. CHAR

語法:

CHAR (length)

其中length的取值範圍為1255

 

超過255則報錯:

mysql> create table s3 ( value char(1023) primary key);

ERROR 1074 (42000): Column length too big for column 'value' (max = 255); use BLOB or TEXT instead

 

例如:CHAR(20)表示最多包含20個字元的字元串。存儲時,不足20個字元時後面加空格。

在預設情況下,提取時,自動刪除掉後面的空格;在PAD_CHAR_TO_FULL_LENGTH時,則不會刪除後面的空格,即提取後的結果包含20個字元。

 

假定存在如下數據:

mysql> show create table s1;

+-------+-----------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                    |

+-------+-----------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+-----------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> insert into s1 values ('ABC') ,  ('1234567890') , (' 12 3 45 ');

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

 

 

在預設情況下:

mysql> set sql_mode='';

Query OK, 0 rows affected (0.00 sec)

 

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+------------+

| length(value) | char_length(value) | value      |

+---------------+--------------------+------------+

|             8 |                  8 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|             3 |                  3 | ABC        |

+---------------+--------------------+------------+

3 rows in set (0.00 sec)

 

 

sql_modePAD_CHAR_TO_FULL_LENGTH時,將不會刪除CHAR類型的字元串後面附加的空格。

mysql> set sql_mode='pad_char_to_full_length';

Query OK, 0 rows affected (0.00 sec)

 

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+------------+

| length(value) | char_length(value) | value      |

+---------------+--------------------+------------+

|            10 |                 10 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|            10 |                 10 | ABC        |

+---------------+--------------------+------------+

3 rows in set (0.00 sec)

 

mysql> select @sql_mode;

+-----------+

| @sql_mode |

+-----------+

| NULL      |

+-----------+

1 row in set (0.00 sec)

 

mysql> select @@sql_mode;

+-------------------------+

| @@sql_mode              |

+-------------------------+

| PAD_CHAR_TO_FULL_LENGTH |

+-------------------------+

1 row in set (0.00 sec)

 

 

 

 

2. VARCHAR

 

語法:

VARCHAR(max-length)

其中,max-length是該類型字元串最多可以存儲的字元的個數。整個欄位占用的空間大小是長度占有的位元組數加上實際字元所占有的位元組數。當字元串長度在0255時,長度占1個位元組,當字元串長度超過255個字元時,長度占2個位元組。VARCHAR類型最多65535個字元。

 

mysql> create table s13 ( value varchar(10) primary key);

Query OK, 0 rows affected (0.02 sec)

 

mysql> insert into s13 values ('ABCD') , (' A B ');

Query OK, 2 rows affected (0.05 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select @@sql_mode;

+-------------------------+

| @@sql_mode              |

+-------------------------+

| PAD_CHAR_TO_FULL_LENGTH |

+-------------------------+

1 row in set (0.00 sec)

 

mysql> select length(value), char_length(value), value from s13;

+---------------+--------------------+-------+

| length(value) | char_length(value) | value |

+---------------+--------------------+-------+

|             5 |                  5 |  A B  |

|             4 |                  4 | ABCD  |

+---------------+--------------------+-------+

2 rows in set (0.00 sec)

 

從上述結果可以看到,PAD_CHAR_TO_FULL_LENGTH模式對於VARCHAR類型沒有作用,這個模式只對CHAR類型有作用。

 

3. 欄位長度限制

(1)主鍵為VARCHAR類型時的長度限製為3072個字元。

mysql> create table s5 ( value varchar(65535) primary key);

ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

mysql> create table s5 ( value varchar(3072) primary key);

Query OK, 0 rows affected (0.02 sec)

 

(2)VARCHAR類型的欄位的長度大於或等於65536時,自動轉化為TEXT相關類型。

原因就是因為VARCHAR類型在存儲時要保存字元串長度,而且最多占用2個位元組。

mysql> create table s6 ( value varchar(3072) primary key , v varchar(65536));

Query OK, 0 rows affected, 1 warning (0.03 sec)

 

mysql> show warnings;

+-------+------+--------------------------------------------+

| Level | Code | Message                                    |

+-------+------+--------------------------------------------+

| Note  | 1246 | Converting column 'v' from VARCHAR to TEXT |

+-------+------+--------------------------------------------+

1 row in set (0.00 sec)

 

mysql> show create table s6;

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                           |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| s6    | CREATE TABLE `s6` (

  `value` varchar(3072) NOT NULL,

  `v` mediumtext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

(3)一個行中的VARCHARCHAR類型的字元串的最大長度總和不能超過65535個字元。

mysql> create table s12 ( value  int  primary key , v varchar(65535));

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

 

mysql> create table s12 ( value  int  primary key , v varchar(65500));

Query OK, 0 rows affected (0.03 sec)

 

 

(4)CHAR類型的欄位插入超過定義長度的數據時,將自動截取為定義長度。

mysql> show create table s1;

+-------+---------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                  |

+-------+---------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> insert into s1 values ('12345678901234');

Query OK, 1 row affected, 1 warning (0.01 sec)

 

mysql> show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1265 | Data truncated for column 'value' at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

 

mysql> select * from s1;

+--------------+

| value        |

+--------------+

|              |

| 1234567890   |

| 中           |

+--------------+

3 rows in set (0.00 sec)

 

 

(5)VARCHAR類型的欄位在插入數據時長度超過定義的長度,將自動截取到定義的長度。

mysql> insert into s13 values ('12345678901234');

Query OK, 1 row affected, 1 warning (0.01 sec)

 

mysql> show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1265 | Data truncated for column 'value' at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

 

mysql> select * from s13;

+------------+

| value      |

+------------+

|  A B       |

| 1234567890 |

| ABCD       |

+------------+

3 rows in set (0.00 sec)

 

 

 

 

 

4. 字元集

預設情況下,數據表的字元集為latin1。可以在create table或者alter table時修改數據表的字元集為utf8

 

mysql> show variables like '%character%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | utf8                       |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.01 sec)

 

mysql> show create table s1;

+-------+---------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                  |

+-------+---------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+-------+

| length(value) | char_length(value) | value |

+---------------+--------------------+-------+

|             3 |                  1 | 中    |

+---------------+--------------------+-------+

1 row in set (0.00 sec)

 

LENGTH表示位元組數,CHAR_LENGTH表示字元數。在使用UTF8字元集時,一個漢字的位元組數為3,即LENGTH3,;而一個漢字的字元數仍然為1,即CHAR_LENGTH仍然為1

 

5. BINARY

BINARY用法與CHAR類似,只是可以存儲所有字元值,包括空字元(ASCII值為0),而且末尾補足長度的字元為空字元,而不是空格。BINARY類型最大長度255個位元組,並非255個字元。

 

mysql> create table b1 (value binary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

 

mysql> insert into b1 values('1234567890') , ('123');

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select value,hex(value) from b1;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

| 123        | 31323300000000000000 |

| 1234567890 | 31323334353637383930 |

+------------+----------------------+

2 rows in set (0.00 sec)

 

 

使用unhex()函數可以將十六進位字元串轉化為不可見字元組成的字元串,插入不可見字元的例子如下:

mysql> insert into b1 values ( unhex('01020300010203'));

Query OK, 1 row affected (0.01 sec)

 

mysql> select value,hex(value) from b1;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

|      | 01020300010203000000 |

+------------+----------------------+

1 row in set (0.00 sec)

 

 

BINARY類型超過255個位元組時,將報錯。

mysql> create table b10 ( value int  primary key, v binary(256));

ERROR 1074 (42000): Column length too big for column 'v' (max = 255); use BLOB or TEXT instead

 

6. VARBINARY

VARBINARYBINARY類似,二者之間差異與 VARCHARCHAR之間的差異類似。而VARBINARYVARCHAR也很類似,二者之間的差異與BINARYCHAR之間的差異類似。

當最大長度為0255位元組時,長度首碼為1個位元組,欄位總長度為1+最大長度個位元組。

當最大長度為25665535位元組時,長度首碼為2個位元組。

 

mysql> create table b2 ( value varbinary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

 

mysql> insert into b2 values ( '1234567890'), ("123"), (unhex('01020300010203'));

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

 

mysql> select value, hex(value) from b2;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

|      | 01020300010203       |

| 123        | 313233               |

| 1234567890 | 31323334353637383930 |

+------------+----------------------+

3 rows in set (0.00 sec)

 

 

VARBINARY類型超過65535位元組時,將自動轉換為BLOB相關類型。

mysql> create table b9 ( value int  primary key, v varbinary(65536));

Query OK, 0 rows affected, 1 warning (0.02 sec)

 

mysql> show warnings;

+-------+------+----------------------------------------------+

| Level | Code | Message                                      |

+-------+------+----------------------------------------------+

| Note  | 1246 | Converting column 'v' from VARBINARY to BLOB |

+-------+------+----------------------------------------------+

1 row in set (0.00 sec)

 

mysql> show create table b9;

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                     |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| b9    | CREATE TABLE `b9` (

  `value` int(11) NOT NULL,

  `v` mediumblob,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

7. TEXT

有四種TEXT相關類型,它們之間的差別在於允許的最大長度不相同。

TINYTEXT1255個位元組。欄位長度首碼1個位元組。

 TEXT25665535個位元組。欄位長度首碼2個位元組。

 MEDIUMTEXT65536224次方-1個位元組。欄位長度首碼3個位元組。

LONGTEXT224次方到232次方-1個位元組。欄位長度首碼4個位元組。

 

在創建數據表時,在CREATE TABLE語句中只使用TEXT類型即可,MySQL將根據TEXT(N)中的N自動決定實際使用TINYTEXTTEXTMEDIUMTEXTLONGTEXT。在使用其它三個類型時則沒有這種根據長度自動決定實際類型的功能,而且不能指定最大長度。

 

mysql> create table b3 ( value int primary key , v text(30) );

Query OK, 0 rows affected (0.04 sec)

 

mysql> show create table b3;

+-------+--------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                   |

+-------+--------------------------------------------------------------------------------------------------------------------------------+

| b3    | CREATE TABLE `b3` (

  `value` int(11) NOT NULL,

  `v` tinytext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+--------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> create table b4 ( value int primary key , v text(65536) );

Query OK, 0 rows affected (0.02 sec)

 

mysql> show create table b4;

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                     |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| b4    | CREATE TABLE `b4` (

  `value` int(11) NOT NULL,

  `v` mediumtext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> create table b5 ( value int primary key , v text(300) );

Query OK, 0 rows affected (0.02 sec)

 

mysql> show create table b5;

+-------+----------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                               |

+-------+----------------------------------------------------------------------------------------------------------------------------+

| b5    | CREATE TABLE `b5` (

  `value` int(11) NOT NULL,

  `v` text,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

 

TEXT類型和VARCHAR類型類似,並不會進行長度補足的操作。

 

8. BLOB

BLOB相關類型也有類似的四種類型:

有四種BLOB相關類型,它們之間的差別在於允許的最大長度不相同。

TINYBLOB1255個位元組。欄位長度首碼1個位元組。

 BLOB25665535個位元組。欄位長度首碼2個位元組。

 MEDIUMBLOB65536224次方-1個位元組。欄位長度首碼3個位元組。

LONGBLOB224次方到232次方-1個位元組。欄位長度首碼4個位元組。

mysql> create table b11 ( value int primary key, v blob(100));

Query OK, 0 rows affected (0.03 sec)

 

在定義數據表時,如果使用BLOB(N)的形式定義欄位,則實際欄位類型被自動調整為最適合最大長度NBLOB相關類型。

mysql> show create table b11;

+-------+---------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                    |

+-------+---------------------------------------------------------------------------------------------------------------------------------+

| b11   | CREATE TABLE `b11` (

  `value` int(11) NOT NULL,

  `v` tinyblob,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+---------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

BLOB相關類型在實際存儲和讀取時,不會發生長度補足操作和截取操作,而是存儲和讀取原始二進位數據內容。

 

mysql> insert into b11 values (1,unhex('01020300010203')),(2,'1234567890');

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select value, v,hex(v) from b11;

+-------+------------+----------------------+

| value | v          | hex(v)               |

+-------+------------+----------------------+

|     1 |      | 01020300010203       |

|     2 | 1234567890 | 31323334353637383930 |

+-------+------------+----------------------+

2 rows in set (0.00 sec)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創,轉發請註明出處。 MapReduce是hadoop這隻大象的核心,Hadoop 中,數據處理核心就是 MapReduce 程式設計模型。一個Map/Reduce 作業(job) 通常會把輸入的數據集切分為若幹獨立的數據塊,由 map任務(task)以完全並行的方式處理它們。框架會對map的輸出 ...
  • Spark對很多種文件格式的讀取和保存方式都很簡單。Spark會根據文件擴展名選擇對應的處理方式。 Spark支持的一些常見文件格式如下: 1、文本文件 使用文件路徑作為參數調用SparkContext中的textFile()函數,就可以讀取一個文本文件。也可以指定minPartitions控制分區 ...
  • 一.Oracle資料庫的安裝(安裝在虛擬機的xp系統里) 1.安裝虛擬機 2.虛擬機內安裝xp系統,以下步驟在虛擬機內進行 3.雙擊setup.exe,在出現的界面中設置口令,及確認口令(此口令即為system賬號的密碼),點擊下一步 4.先決條件檢查,將"用戶已驗證前面的覆選框打勾,下一步 5.概... ...
  • 如果是重覆安裝,首先需要清除已經存在的軟體安裝記錄(首次安裝只需執行紅色部分): rm -fr /usr/local/bin/*oraenv rm -fr /usr/local/bin/dbhome rm -fr /usr/tmp/.oracle rm -fr /tmp/.Oracle rm -fr... ...
  • 轉載請註明原創出處,謝謝! 最近沒有什麼實戰,準備把JVM知識梳理一遍,先以開發人員的交流來談談jvm這塊的知識以及重要性,依稀記得2、3年前用solr的時候老是經常oom,提到oom大家應該都不陌生,那個時候也並沒有從根本解決oom,由於對jvm不熟悉,只是去百度,到處都是配置jvm參數的,那個時 ...
  • Sql Server 查看存儲過程最後修改時間 select * from sys.procedures order by modify_date desc ...
  • 問題:在存儲過程中使用臨時表時,不Create臨時表就會報錯。 分析了下,總結了臨時表創建方式的區別。 創建臨時表有兩種方法: 方法一 create table #臨時表名 ( 欄位1 約束條件, 欄位2 約束條件, …… ) create table ##臨時表名 ( 欄位1 約束條件, 欄位2 ...
  • 實現方式: 1、將欄位類型設為 TIMESTAMP 2、將預設值設為 CURRENT_TIMESTAMP 舉例應用: 1、MySQL 腳本實現用例 --添加CreateTime 設置預設時間 CURRENT_TIMESTAMP ALTER TABLE `table_name`ADD COLUMN ` ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...