數值數據類型
整數數據類型
類型 | 存儲空間 | 最小值(有符號/無符號) | 最大值(有符號/無符號) |
---|---|---|---|
TINYINT | 1 | -128 / 0 | 127 / 255 |
SMALLINT | 2 | -32768 / 0 | 32767 / 65535 |
MEDIUMINT | 3 | -8388608 / 0 | 8388607 / 16777215 |
INT | 4 | -2147483648 / 0 | |
BIGINT | 8 | -9223372036854775808 / 0 | 9223372036854775807 / 18446744073709551615 |
注意unsigned: 不允許負數
insert into T values(pow(2,10)); # pow: 2^10 2的10次方
定點數據類型
用于精確數值:整數、小數或兩者
-
數據類型:
- decimal:
- 固定十進制
- 保持精度
- decimal:
-
示例
貨幣: cost decimal (10,2)
輸出:385.72
10: 整數+小數一共多少位
2: 小數的位數
浮點數據類型
用于近似值:整數、小數或兩者
類型 | 存儲空間 |
---|---|
FLOAT | 4 |
FLOAT(p) | 如果 0 <= p <= 24 為 4 個字節(jié),如果 25 <= p <= 53 為 8 個字節(jié) |
DOUBLE | 8 |
數值字面值
- 精確值字面值:
- 在SQL語句中顯示的即為其具體數值
- 寫為整數或十進制,滅有指數
-近似值 - 并不總按照SQL語句中指定的那樣使用
- 用科學計數法寫成浮點,帶指數
- 有誤差
mysql> select 1.1+2.2,1.1E0+2.2E0;
+---------+--------------------+
| 1.1+2.2 | 1.1E0+2.2E0 |
+---------+--------------------+
| 3.3 | 3.3000000000000003 |
+---------+--------------------+
1 row in set (0.00 sec)
BIT數據類型
BIT 類型
比特值類型。M 表示比特位的長度,取值范圍從1到64,其默認值是1。
BIT[(M)]
示例
存儲4位: status_column BIT(4)
字面值可表達為:
b’1101’
0b1101
mysql> create table tt(id bit(2));
Query OK, 0 rows affected (0.40 sec)
mysql> insert into tt values(b'0101010');
ERROR 1406 (22001): Data too long for column 'id' at row 1
mysql> insert into tt values(b'010');
Query OK, 1 row affected (0.04 sec)
mysql> select collation(id) from tt;
+---------------+
| collation(id) |
+---------------+
| binary |
+---------------+
1 row in set (0.02 sec)
mysql> select hex(id) from tt; # hex : 轉16進制
+---------+
| hex(id) |
+---------+
| 2 |
+---------+
1 row in set (0.01 sec)
布爾表達式
布爾類型,別名為 BOOL,和 TINYINT(1) 等價。零值被認為是 False,非零值認為是 True。在 TiDB 內部,True 存儲為 1,False 存儲為 0。
mysql> select 1=true,1=TRUE,True;
+--------+--------+------+
| 1=true | 1=TRUE | TRUE |
+--------+--------+------+
| 1 | 1 | 1 |
+--------+--------+------+
1 row in set (0.00 sec)
時間數據類型
timestamp : 受時區(qū)影響,并且最大范圍是2038年
數據類型 | 大小 | 范圍 |
---|---|---|
DATE | 3 | 0000-00-00 to 9999-12-31 |
TIME | 3 | -838:59:59 to 838:59:59 |
DATETIME | 8 | 0000-00-00 00:00:00 to 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 to 2038-01-19 03:14:07 |
YEAR | 1 | 1901-2155 |
mysql> create table dropme(day datetime);
Query OK, 0 rows affected (0.17 sec)
mysql> set sql_mode='';
Query OK, 0 rows affected (0.02 sec)
mysql> insert into dropme(day) values('0000 00-00-00');
Query OK, 1 row affected, 1 warning (0.04 sec)
mysql> set sql_mode='strict_trans_tables';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dropme(day) values('0000 00-00-00');
ERROR 1292 (22007): Incorrect datetime value: '0000 00-00-00' for column 'day' at row 1
時間戳和時區(qū)
- 當前時區(qū): select @@time_zone;
- 在被存儲時,timestamp值從當前時區(qū)轉換為UTC
- 在被查詢時,數據從UTC轉換為當前時區(qū)
mysql> set time_zone='+08:00';
Query OK, 0 rows affected (0.01 sec)
mysql> create table dropme(d1 timestamp,d2 datetime);
Query OK, 0 rows affected (0.14 sec)
mysql> insert into dropme values(now(),now());
Query OK, 1 row affected (0.04 sec)
mysql> select * from dropme;
+---------------------+---------------------+
| d1 | d2 |
+---------------------+---------------------+
| 2023-06-30 06:48:44 | 2023-06-30 06:48:44 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone='+09:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dropme;
+---------------------+---------------------+
| d1 | d2 |
+---------------------+---------------------+
| 2023-06-30 07:48:44 | 2023-06-30 06:48:44 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone='+10:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dropme;
+---------------------+---------------------+
| d1 | d2 |
+---------------------+---------------------+
| 2023-06-30 08:48:44 | 2023-06-30 06:48:44 |
+---------------------+---------------------+
1 row in set (0.00 sec)
時間間隔關鍵字
- interval 用于指定持續(xù)時間的關鍵字
mysql> select '2022-01-01' + interval 10 day,'2022-01-01' + interval '5 2:3:4' day_second; # day_second 指定天和秒
+--------------------------------+----------------------------------------------+
| '2022-01-01' + interval 10 day | '2022-01-01' + interval '5 2:3:4' day_second |
+--------------------------------+----------------------------------------------+
| 2022-01-11 | 2022-01-06 02:03:04 |
+--------------------------------+----------------------------------------------+
1 row in set (0.00 sec)
字符串數據類型
字符集 單個字符字節(jié)數 VARCHAR 最大列長度的取值范圍
ascii 1 (0, 65535]
latin1 1 (0, 65535]
binary 1 (0, 65535]
utf8 3 (0, 21845]
utf8mb4 4 (0, 16383]
文本數據類型
- tinytext: 最大列長度為255
- text: 最大列長度為65535
- mediumtext/longtext: 這兩個數據類型的最大列長度受TiDB的txn_entry_size_limit 和 TiKV的raft-entry-max-size參數影響
二進制
- binary: 和char類似,固定長度二進制字節(jié)字符串。bin_val binary(6)
- varbinary: 和varchar類似,可變長度二進制字節(jié)字符串. varbin_val varbinary (6)
- 示例
mysql> create table bbb(id blob);
Query OK, 0 rows affected (0.18 sec)
mysql> insert into bbb values(cast('SD' as binary));
Query OK, 1 row affected (0.01 sec)
mysql> insert into bbb values('SD');
Query OK, 1 row affected (0.01 sec)
mysql> select id,cast(id as char) from bbb;
+------------+------------------+
| id | cast(id as char) |
+------------+------------------+
| 0x5344 | SD |
| 0x5344 | SD |
+------------+------------------+
2 rows in set (0.01 sec)
ENUM 類型
枚舉類型是一個字符串,它只能有一個值的字符串對象。其值必須是從一個固定集合中選取,這個固定集合在創(chuàng)建表的時候定義,語法是:
ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
例如:
ENUM(‘apple’, ‘orange’, ‘pear’)
枚舉類型的值在 TiDB 內部使用數值來存儲,每個值會按照定義的順序轉換為一個數字,比如上面的例子中,每個字符串值都會映射為一個數字:
值 | 數字 |
---|---|
NULL | NULL |
‘’ | 0 |
‘apple’ | 1 |
‘orange’ | 2 |
‘pear’ | 3 |
mysql> create table t5(id enum('Sunday','Monday','Tuesday','Wednesda,y','Thursday','Friday','Saturday'));
Query OK, 0 rows affected (0.10 sec)
mysql> insert into t5 values ('Monday');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5;
+--------+
| id |
+--------+
| Monday |
+--------+
1 row in set (0.00 sec)
mysql> create table s1(id set('A','B','C','a','ac','bca','ad') defaullt null);
Query OK, 0 rows affected (0.10 sec)
mysql> desc s1;
+-------+--------------------------------------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------------------+------+------+---------+-------+
| id | set('A','B','C','a','ac','bca','ad') | YES | | NULL | |
+-------+--------------------------------------+------+------+---------+-------+
1 row in set (0.00 sec)
mysql> insert into s1 values ('B');
Query OK, 1 row affected (0.02 sec)
mysql> insert into s1 values ('ABCDE');
ERROR 1265 (01000): Data truncated for column 'id' at row 1
mysql> insert into s1 values ('ABCD');
ERROR 1265 (01000): Data truncated for column 'id' at row 1
mysql> insert into s1 values ('ABC');
ERROR 1265 (01000): Data truncated for column 'id' at row 1
mysql> insert into s1 values ('C,B');
Query OK, 1 row affected (0.02 sec)
mysql> select * from s1;
+------+
| id |
+------+
| B |
| B,C |
+------+
2 rows in set (0.00 sec)
SET 類型
集合類型是一個包含零個或多個值的字符串,其中每個值必須是從一個固定集合中選取,這個固定集合在創(chuàng)建表的時候定義,語法是:
SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
例如:
SET('1', '2') NOT NULL
上面的例子中,這列的有效值可以是:
'' ,'1','2','1,2'
字符串數據類型比較
類型 | 最大限制 | 備注 |
---|---|---|
標識符最大長度 | 64 | |
總Table的數量 | 無限制 | |
columns | 默認為1017,最大可調至4096 | 通過table-couumn-count-limit 修改 |
indexs | 默認為64,最大可調至512 | 可通過index-limit修改 |
rows | 無限制 | |
單行size | 6MB | 可通過txn-entry-size-limit調整 |
單列size | 6MB | |
分區(qū)數量 | 1024 |
字段類型 | 最大長度 |
---|---|
CHAR | 255 characters |
Binary | 255 bytes |
varchar,varbinary | 65535 bytes |
tinyblob,tinytext | 255 bytes |
blob,text | 65535 bytes |
mediumblob,mediumtext | 16777215 bytes |
enum | 65535 values |
set | 64 members |
引號的使用
- 使用’ 或者"
- ansi_quotes SQL模式會將雙引號內的字符解釋為標識符
- 為了便于一直,應首選單引號
字符集和排序規(guī)則
- character set 是一組符號和編碼
- 所有字符串都屬于一個特定的字符集
- TiDB中默認的字符集是utf8mb4
- collation 是一組用于比較字符集中字符和字符排序順序的規(guī)則
- 影響字符和字符串的比較
- TiDB中的默認規(guī)則是utf8mb4_bin
- show character set : 顯示所有支持的字符集
- show collation: 顯示所有支持的排序規(guī)則
select 'A'='a' collate utf8mb4_bin,'A'='a' collate utf8mb4_general_ci,'A'='a' ;
CAST函數
- 語法
cast(expression as type) - cast函數將任何類型的值轉換為具有指定類型的值。目標類型可以是:BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED
- 例如: select cast(’ ‘as binary),binary(’ ');
select cast(' 'as binary),binary(' ');
select cast('123' as decimal),cast(' 123' as decimal),cast('123 ' as decimal),cast(' 1 23 ' as decimal);
選擇數據類型
- ABC原則
- Appropriate:合適
- Brief:消耗最少的資源
- Complete: 數據不可丟失
- 主鍵的設計和考慮
Null
-
NULL 是一個SQL關鍵字,用于定義允許缺失值的數據類型
- 未知:存在值,但目前尚不知道精確值
- 不適用: 如果指定了某個值,則該值將無法準確地具有代表性
- 默認情況下允許空值
- 如果列不允許空值,適用not null聲明確保數據完整性
- null 是order by中的最小值
-
示例文章來源:http://www.zghlxwxcb.cn/news/detail-535818.html
select NULL = NULL,NULL != NULL,NULL <=> NULL , NULL<=> 'X'
null 和誰計算都是null (除了<=> 這個符號)文章來源地址http://www.zghlxwxcb.cn/news/detail-535818.html
到了這里,關于030、SQL語句之數據類型與表達式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!