成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL存儲(chǔ)秘密揭示:CHAR vs.VARCHAR,解鎖定長(zhǎng)神器的終極選擇指南!

數(shù)據(jù)庫(kù) MySQL
了解CHAR和VARCHAR類(lèi)型的差異對(duì)于有效地設(shè)計(jì)和管理MySQL數(shù)據(jù)庫(kù)極為重要。選擇合適的數(shù)據(jù)類(lèi)型和了解它們的行為有助于避免意外的數(shù)據(jù)處理問(wèn)題。同時(shí),開(kāi)發(fā)人員應(yīng)根據(jù)具體需求和預(yù)期行為來(lái)選擇合適的數(shù)據(jù)類(lèi)型,以確保數(shù)據(jù)存儲(chǔ)和檢索的一致性和準(zhǔn)確性。

CHAR和VARCHAR類(lèi)型在存儲(chǔ)和檢索方式上有相似之處,但在最大長(zhǎng)度以及是否保留尾隨空格方面存在差異。

一、存儲(chǔ)方面

1、存儲(chǔ)對(duì)比

CHAR和VARCHAR類(lèi)型的聲明包含一個(gè)長(zhǎng)度,表示要存儲(chǔ)的最大字符數(shù)。例如,CHAR(30)可以容納最多30個(gè)字符。

CHAR列的長(zhǎng)度在創(chuàng)建表時(shí)被固定為您聲明的長(zhǎng)度。長(zhǎng)度可以是從0到255的任何值。當(dāng)存儲(chǔ)CHAR值時(shí),它們會(huì)被右填充到指定的長(zhǎng)度。當(dāng)檢索CHAR值時(shí),除非啟用了PAD_CHAR_TO_FULL_LENGTH SQL模式(默認(rèn)沒(méi)啟用),否則會(huì)刪除尾隨空格。

VARCHAR列中的值是可變長(zhǎng)度字符串。長(zhǎng)度可以指定為0到65,535的值。VARCHAR的有效最大長(zhǎng)度取決于最大行大小(65,535字節(jié),這個(gè)大小被所有列共享)和所使用的字符集。

2、具體對(duì)比

假設(shè)當(dāng)前一個(gè)表里包含類(lèi)型為char(4)及varchar(4)的列(假設(shè)該列使用單字節(jié)字符集如latin1),則,存儲(chǔ)所需的大小對(duì)比如下:

圖片

注:

  • 如果字符集為其他類(lèi)型(utf8mb4),則根據(jù)存儲(chǔ)的內(nèi)容進(jìn)行換算即可
  • 上例中為了演示,非嚴(yán)格模式時(shí)可以截?cái)啻鎯?chǔ)

二、顯示及檢索對(duì)比

本文后續(xù)案例是在utf8的字符集的實(shí)例上進(jìn)行演示的

1、默認(rèn)SQL模式

默認(rèn)沒(méi)開(kāi)啟PAD_CHAR_TO_FULL_LENGTH SQL模式的情況下,char及varchar的顯示幾乎沒(méi)有區(qū)別,例如:

mysql> create table tb_char (id int primary key auto_increment, c_char char(10),c_varchar  varchar(10));
Query OK, 0 rows affected (0.01 sec)


mysql> insert into tb_char (c_char,c_varchar) values ('a','a'),('張三','張三'),('tc一','tc一');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

查詢(xún)顯示如下:

mysql> select * from  tb_char;
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  1 | a      | a         |
|  2 | 張三   | 張三      |
|  3 | tc一   | tc一      |
+----+--------+-----------+
3 rows in set (0.00 sec)

查看長(zhǎng)度如下:

mysql> select c_char,c_varchar, length(c_char)len_char,length(c_varchar)len_varchar,char_length(c_char),char_length(c_varchar) from tb_char;
+--------+-----------+----------+-------------+---------------------+------------------------+
| c_char | c_varchar | len_char | len_varchar | char_length(c_char) | char_length(c_varchar) |
+--------+-----------+----------+-------------+---------------------+------------------------+
| a      | a         |        1 |           1 |                   1 |                      1 |
| 張三   | 張三      |        6 |           6 |                   2 |                      2 |
| tc一   | tc一      |        5 |           5 |                   3 |                      3 |
+--------+-----------+----------+-------------+---------------------+------------------------+
3 rows in set (0.00 sec)

圖片

從顯示結(jié)果來(lái)看,char與varchar在此時(shí)看上去是一致的,即:查詢(xún)時(shí),char類(lèi)型的數(shù)據(jù)會(huì)將末尾空格去除。

此時(shí),如果寫(xiě)入末尾帶空格的值,則結(jié)果會(huì)如何呢?

mysql> insert into tb_char (c_char,c_varchar) values ('abc ','abc ');
Query OK, 1 row affected (0.01 sec)

mysql> select * from  tb_char;
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  1 | a      | a         |
|  2 | 張三   | 張三      |
|  3 | tc一   | tc一      |
|  4 | abc    | abc       |
+----+--------+-----------+
4 rows in set (0.00 sec)
mysql> select c_char,c_varchar, length(c_char)len_char,length(c_varchar)len_varchar,char_length(c_char),char_length(c_varchar) from tb_char;
+--------+-----------+----------+-------------+---------------------+------------------------+
| c_char | c_varchar | len_char | len_varchar | char_length(c_char) | char_length(c_varchar) |
+--------+-----------+----------+-------------+---------------------+------------------------+
| a      | a         |        1 |           1 |                   1 |                      1 |
| 張三   | 張三      |        6 |           6 |                   2 |                      2 |
| tc一   | tc一      |        5 |           5 |                   3 |                      3 |
| abc    | abc       |        3 |           4 |                   3 |                      4 |
+--------+-----------+----------+-------------+---------------------+------------------------+
4 rows in set (0.00 sec)

此時(shí),結(jié)果出現(xiàn)了不同,char類(lèi)型的顯示依舊將末尾空格去除,而varchar則原樣顯示

圖片

如果此時(shí)按條件查詢(xún)‘a(chǎn)bc’及‘a(chǎn)bc ’,結(jié)果會(huì)如何?

mysql> select * from  tb_char where c_char ='abc';
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  4 | abc    | abc       |
+----+--------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_varchar ='abc';
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  4 | abc    | abc       |
+----+--------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_char ='abc ';
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  4 | abc    | abc       |
+----+--------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_varchar ='abc ';
+----+--------+-----------+
| id | c_char | c_varchar |
+----+--------+-----------+
|  4 | abc    | abc       |
+----+--------+-----------+
1 row in set (0.00 sec)

結(jié)果是都可以顯示。

不過(guò),如果做了concat操作,結(jié)果如下:

mysql> select c_char,c_varchar,concat(c_char,'concat'),concat(c_varchar,'concat') from tb_char;
+--------+-----------+-------------------------+----------------------------+
| c_char | c_varchar | concat(c_char,'concat') | concat(c_varchar,'concat') |
+--------+-----------+-------------------------+----------------------------+
| a      | a         | aconcat                 | aconcat                    |
| 張三   | 張三      | 張三concat              | 張三concat                 |
| tc一   | tc一      | tc一concat              | tc一concat                 |
| abc    | abc       | abcconcat               | abc concat                 |
+--------+-----------+-------------------------+----------------------------+

圖片

2、PAD_CHAR_TO_FULL_LENGTH 模式

將SQL模式改為PAD_CHAR_TO_FULL_LENGTH后,再對(duì)比看一下。

mysql>  set sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from  tb_char;
+----+----------------+-----------+
| id | c_char         | c_varchar |
+----+----------------+-----------+
|  1 | a              | a         |
|  2 | 張三           | 張三      |
|  3 | tc一           | tc一      |
|  4 | abc            | abc       |
+----+----------------+-----------+
4 rows in set (0.00 sec)
mysql> select c_char,c_varchar, length(c_char)len_char,length(c_varchar)len_varchar,char_length(c_char),char_length(c_varchar) from tb_char;
+----------------+-----------+----------+-------------+---------------------+------------------------+
| c_char         | c_varchar | len_char | len_varchar | char_length(c_char) | char_length(c_varchar) |
+----------------+-----------+----------+-------------+---------------------+------------------------+
| a              | a         |       10 |           1 |                  10 |                      1 |
| 張三           | 張三      |       14 |           6 |                  10 |                      2 |
| tc一           | tc一      |       12 |           5 |                  10 |                      3 |
| abc            | abc       |       10 |           4 |                  10 |                      4 |
+----------------+-----------+----------+-------------+---------------------+------------------------+
4 rows in set (0.00 sec)

圖片

此時(shí)使用concat,結(jié)果如下:

mysql> select c_char,c_varchar,concat(c_char,'concat'),concat(c_varchar,'concat') from tb_char;
+----------------+-----------+-------------------------+----------------------------+
| c_char         | c_varchar | concat(c_char,'concat') | concat(c_varchar,'concat') |
+----------------+-----------+-------------------------+----------------------------+
| a              | a         | a         concat        | aconcat                    |
| 張三           | 張三      | 張三        concat      | 張三concat                 |
| tc一           | tc一      | tc一       concat       | tc一concat                 |
| abc            | abc       | abc       concat        | abc concat                 |
+----------------+-----------+-------------------------+----------------------------+
4 rows in set (0.00 sec)

圖片

可見(jiàn),此時(shí)char類(lèi)型每一行的末尾都已經(jīng)填充了空格。

使用‘a(chǎn)bc’及‘a(chǎn)bc ’查看結(jié)果:

mysql> select * from  tb_char where c_char ='abc';
+----+------------+-----------+
| id | c_char     | c_varchar |
+----+------------+-----------+
|  4 | abc        | abc       |
+----+------------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_varchar ='abc';
+----+------------+-----------+
| id | c_char     | c_varchar |
+----+------------+-----------+
|  4 | abc        | abc       |
+----+------------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_char ='abc ';
+----+------------+-----------+
| id | c_char     | c_varchar |
+----+------------+-----------+
|  4 | abc        | abc       |
+----+------------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_varchar ='abc ';
+----+------------+-----------+
| id | c_char     | c_varchar |
+----+------------+-----------+
|  4 | abc        | abc       |
+----+------------+-----------+
1 row in set (0.00 sec)
mysql> select * from  tb_char where c_char ='abc    ';
+----+------------+-----------+
| id | c_char     | c_varchar |
+----+------------+-----------+
|  4 | abc        | abc       |
+----+------------+-----------+
1 row in set (0.00 sec)

該結(jié)果是沒(méi)有區(qū)別的。

三、字符串長(zhǎng)度查看函數(shù)

在MySQL中,字符串計(jì)算函數(shù)有如下幾種,在使用是注意區(qū)分。

1、LENGTH 函數(shù)

用于返回字符串的字節(jié)數(shù)。對(duì)于英文字符,一個(gè)字符占用一個(gè)字節(jié);而對(duì)于一些多字節(jié)字符(如UTF-8編碼的中文字符),一個(gè)字符可能占用多個(gè)字節(jié)。

SELECT LENGTH('Hello'); -- 返回 5
SELECT LENGTH('你好');   -- 返回 6(UTF-8編碼中文字符占用3個(gè)字節(jié))

圖片

2、CHAR_LENGTH 函數(shù)

用于返回字符串的字符數(shù),而不是字節(jié)數(shù)。這意味著它會(huì)考慮字符的多字節(jié)性,確保正確地計(jì)算字符的數(shù)量。

SELECT CHAR_LENGTH('Hello'); -- 返回 5
SELECT CHAR_LENGTH('你好');   -- 返回 2(兩個(gè)中文字符)

圖片

3、CHARACTER_LENGTH 函數(shù)

 與 CHAR_LENGTH 函數(shù)功能相似,也用于返回字符串的字符數(shù)。

SELECT CHARACTER_LENGTH('Hello'); -- 返回 5
SELECT CHARACTER_LENGTH('你好');   -- 返回 2

圖片

4、BIT_LENGTH 函數(shù)

 返回字符串的位數(shù),而不是字節(jié)數(shù)或字符數(shù)。

SELECT BIT_LENGTH('Hello'); -- 返回 40(5個(gè)英文字符,每個(gè)字符8位)
SELECT BIT_LENGTH('你好');   -- 返回 48(2個(gè)中文字符,每個(gè)字符24位)

圖片

四、結(jié)語(yǔ)

了解CHAR和VARCHAR類(lèi)型的差異對(duì)于有效地設(shè)計(jì)和管理MySQL數(shù)據(jù)庫(kù)極為重要。選擇合適的數(shù)據(jù)類(lèi)型和了解它們的行為有助于避免意外的數(shù)據(jù)處理問(wèn)題。同時(shí),開(kāi)發(fā)人員應(yīng)根據(jù)具體需求和預(yù)期行為來(lái)選擇合適的數(shù)據(jù)類(lèi)型,以確保數(shù)據(jù)存儲(chǔ)和檢索的一致性和準(zhǔn)確性。

責(zé)任編輯:姜華 來(lái)源: 數(shù)據(jù)庫(kù)干貨鋪
相關(guān)推薦

2023-12-06 07:40:53

MySQL時(shí)間類(lèi)型

2022-02-09 09:00:00

云計(jì)算BigQuerySnowflake

2025-06-11 03:22:00

JavaScript開(kāi)發(fā)前端

2023-11-30 15:53:43

2011-09-01 14:22:06

OracleCharVarChar

2025-04-21 03:30:00

2024-07-12 15:27:58

2010-11-26 13:18:53

MySQL字符串

2022-06-30 08:00:00

MySQL關(guān)系數(shù)據(jù)庫(kù)開(kāi)發(fā)

2014-11-28 16:06:18

2023-05-05 17:20:04

2017-04-24 08:53:04

終極溝通技術(shù)Facebook

2011-04-27 09:25:13

MySQL字符型數(shù)據(jù)

2021-10-01 00:02:54

CHAR VARCHARMYSQL

2023-12-12 08:50:22

MySQL隱式轉(zhuǎn)換varchar

2010-09-14 15:34:41

Scala

2018-06-13 11:00:17

人工智能員工保留率

2010-02-23 16:00:21

Oracle數(shù)據(jù)庫(kù)機(jī)

2012-08-21 06:53:00

測(cè)試軟件測(cè)試

2025-03-11 00:54:42

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 色综合视频 | 国产精品乱码一区二三区小蝌蚪 | 91精品国产91 | 久在线| 天堂成人国产精品一区 | 99久久久久国产精品免费 | 羞羞视频网站免费观看 | 国产精品视频在线免费观看 | 一区二区三区四区在线视频 | 天天躁日日躁狠狠的躁天龙影院 | 婷婷丁香在线视频 | 玖玖在线免费视频 | 成人午夜视频在线观看 | 在线免费观看黄色 | 性色av香蕉一区二区 | 男人天堂社区 | 国产精品99久久久久久大便 | 亚洲在线视频 | 91视频一88av | 久久99精品久久久久久国产越南 | 大乳boobs巨大吃奶挤奶 | 在线午夜 | 久久精品| 国产特级毛片 | 亚洲精品一二三 | 国产日韩欧美一区二区 | 久久青| 日本不卡一区二区三区在线观看 | 日韩成人免费在线视频 | 一级毛片中国 | 亚洲精品综合一区二区 | 国产在线观看一区二区 | 亚洲第一色av | 久久精品亚洲一区 | 欧美在线一区二区三区 | 亚洲午夜电影 | 在线观看 亚洲 | 视频在线亚洲 | 男人的天堂亚洲 | 精品在线一区二区 | 中文天堂在线一区 |