030、SQL语句之数据类型与表达式

news/2024/10/18 12:22:13/

数据类型与表达式

  • 数值数据类型
    • 整数数据类型
    • 定点数据类型
    • 浮点数据类型
    • 数值字面值
    • BIT数据类型
    • 布尔表达式
  • 时间数据类型
    • 时间戳和时区
    • 时间间隔关键字
  • 字符串数据类型
    • 文本数据类型
    • 二进制
    • ENUM 类型
    • SET 类型
    • 字符串数据类型比较
    • 引号的使用
    • 字符集和排序规则
    • CAST函数
    • 选择数据类型
    • Null

数值数据类型

整数数据类型

类型存储空间最小值(有符号/无符号)最大值(有符号/无符号)
TINYINT1-128 / 0127 / 255
SMALLINT2-32768 / 032767 / 65535
MEDIUMINT3-8388608 / 08388607 / 16777215
INT4-2147483648 / 0
BIGINT8-9223372036854775808 / 09223372036854775807 / 18446744073709551615

注意unsigned: 不允许负数

insert into T values(pow(2,10));  # pow: 2^10 210次方 

定点数据类型

用于精确数值:整数、小数或两者

  • 数据类型:

    • decimal:
      • 固定十进制
      • 保持精度
  • 示例
    货币: cost decimal (10,2)
    输出:385.72
    10: 整数+小数一共多少位
    2: 小数的位数

浮点数据类型

用于近似值:整数、小数或两者

类型存储空间
FLOAT4
FLOAT(p)如果 0 <= p <= 24 为 4 个字节,如果 25 <= p <= 53 为 8 个字节
DOUBLE8

数值字面值

  • 精确值字面值:
    • 在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 : 受时区影响,并且最大范围是2038年

数据类型大小范围
DATE30000-00-00 to 9999-12-31
TIME3-838:59:59 to 838:59:59
DATETIME80000-00-00 00:00:00 to 9999-12-31 23:59:59
TIMESTAMP41970-01-01 00:00:01 to 2038-01-19 03:14:07
YEAR11901-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

时间戳和时区

  • 当前时区: select @@time_zone;
  • 在被存储时,timestamp值从当前时区转换为UTC
  • 在被查询时,数据从UTC转换为当前时区
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 用于指定持续时间的关键字
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)

字符串数据类型

字符集 单个字符字节数 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类似,固定长度二进制字节字符串。bin_val binary(6)
  • varbinary: 和varchar类似,可变长度二进制字节字符串. 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 类型

枚举类型是一个字符串,它只能有一个值的字符串对象。其值必须是从一个固定集合中选取,这个固定集合在创建表的时候定义,语法是:

ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]

例如:

ENUM(‘apple’, ‘orange’, ‘pear’)
枚举类型的值在 TiDB 内部使用数值来存储,每个值会按照定义的顺序转换为一个数字,比如上面的例子中,每个字符串值都会映射为一个数字:

数字
NULLNULL
‘’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 类型

集合类型是一个包含零个或多个值的字符串,其中每个值必须是从一个固定集合中选取,这个固定集合在创建表的时候定义,语法是:

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无限制
单行size6MB可通过txn-entry-size-limit调整
单列size6MB
分区数量1024
字段类型最大长度
CHAR255 characters
Binary255 bytes
varchar,varbinary65535 bytes
tinyblob,tinytext255 bytes
blob,text65535 bytes
mediumblob,mediumtext16777215 bytes
enum65535 values
set64 members

引号的使用

  • 使用’ 或者"
  • ansi_quotes SQL模式会将双引号内的字符解释为标识符
  • 为了便于一直,应首选单引号

字符集和排序规则

  • character set 是一组符号和编码
    • 所有字符串都属于一个特定的字符集
    • TiDB中默认的字符集是utf8mb4
  • collation 是一组用于比较字符集中字符和字符排序顺序的规则
    • 影响字符和字符串的比较
    • TiDB中的默认规则是utf8mb4_bin
  • show character set : 显示所有支持的字符集
  • show collation: 显示所有支持的排序规则
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中的最小值
  • 示例

select NULL = NULL,NULL != NULL,NULL <=> NULL , NULL<=> 'X'

null 和谁计算都是null (除了<=> 这个符号)


http://www.ppmy.cn/news/775002.html

相关文章

macbook pro的漏电

问题&#xff1a; macbook pro 2015漏电。 解决办法&#xff1a; 1&#xff0c;使用三相插座。 你懂的&#xff0c;很多时候不具备这个条件。 2&#xff0c;笔记本外壳接地。 其实跟上面的原理一样。 一般书房也不靠近接地的线路啊。 3&#xff0c;电工胶布 把跟手腕接触的部…

【硬件】漏电

原理&#xff1a;设备外壳与火线由于某种原因连通&#xff08;非绝缘状态&#xff09;&#xff0c;导致外壳与地之间有一定的电位差&#xff0c;就会产生漏电。 检测&#xff1a;电笔接触带电体。亮后即灭是静电&#xff0c;长亮是漏电。也可用万用表测对地电压。 原因&#…

主板漏电短路50Ω

故障现象&#xff1a;电话口无电压输出 维修结果&#xff1a;更换SI3217x芯片 附件&#xff1a; 分析过程&#xff1a; 原来故障为电话口无电压&#xff0c;更换SI3217x芯片后工作正常&#xff0c;但发现SI3217x芯片轻微发热主供电3.3V短路到50欧姆&#xff0c;正常阻值为k欧…

服务器主板电池的电压不稳定怎么办,主板因静电造成的故障现象与解决方法

故障现象一&#xff1a;一台机器&#xff0c;cpu为c466&#xff0c;主板为华硕p2b&#xff0c;内存为64mb&#xff0c;开机运行一段时间后&#xff0c;机箱内出现打火声&#xff0c;屏幕上出现许多杂乱字符&#xff0c;并随机出现奇偶校验错误&#xff0c;提示“parity check1或…

主板电流声解决方法

主板是华擎z390的itx主板 在浏览网页&#xff0c;拖动鼠标等cpu低负载状态下主板发出滋滋的电流声&#xff0c;声音不大但有点烦 排除过程 开始以为是显卡电流声&#xff0c;原因是这块1070显卡在高负载时有啸叫烦不胜烦后仔细听了一阵&#xff0c;确认时主板电流声在搜索一…

QT 之蓝牙BLE编程

简介 使用PC蓝牙和蓝牙透传模块通讯。 准备 QT core gui bluetoothQT蓝牙库相关头文件 #include <QtBluetooth/qbluetoothglobal.h> #include <QtBluetooth/qbluetoothlocaldevice.h> #include <qbluetoothaddress.h> #include <qbluetoothdev…

笙默考试管理系统-MyTestMean(3)

笙默考试管理系统-MyTestMean&#xff08;3&#xff09; 目录 一、 笙默考试管理系统-MyTestMean 二、 笙默考试管理系统-MyTestMean 三、 笙默考试管理系统-MyTestMean 四、 笙默考试管理系统-MyTestMean 五、 笙默考试管理系统-MyTestMean 笙默考试管理系统-MyTest…

Windows 11 家庭版、专业版、企业版、教育版、SE 版之间的区别

Windows 11 上市不到一年&#xff0c;于 2021 年 10 月首次亮相&#xff0c;以各种版本的形式向公众提供。 对于仅使用 Windows 11 浏览 Internet 或执行基本任务的人来说&#xff0c;版本可能无关紧要。 但是&#xff0c;如果您有兴趣对您的操作系统进行更多控制&#xff0c;那…