首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >两道经典的MySQL面试题

两道经典的MySQL面试题

原创
作者头像
小白的大数据之旅
发布2025-01-18 15:16:52
发布2025-01-18 15:16:52
3190
举报
文章被收录于专栏:Mysql入门到入魔Mysql入门到入魔

char与varchar的区别?如何选择?

面试官提出的问题

问题:请详细解释MySQL中CHAR与VARCHAR的区别,并根据实际应用场景给出选择建议。

问题的重点

面试者需要理解CHAR与VARCHAR在存储方式、性能、空间效率等方面的区别,并能根据实际应用场景选择合适的数据类型。

面试者如何回答

回答:

CHAR与VARCHAR是MySQL中两种常用的字符串数据类型,它们在存储方式、性能、空间效率等方面存在显著差异。

  1. 存储方式

数据类型

描述

CHAR

固定长度字符串,始终占据预定义的空间,不足部分用空格填充

VARCHAR

可变长度字符串,只占用实际字符串长度加上一个或两个额外字节

代码语言:sql
复制
-- 创建一个包含CHAR和VARCHAR列的表
CREATE TABLE example (
    char_column CHAR(10),  -- 固定长度字符列,最多存储10个字符
    varchar_column VARCHAR(10)  -- 可变长度字符列,最多存储10个字符
);

-- 插入数据
INSERT INTO example (char_column, varchar_column) VALUES ('test', 'test');
INSERT INTO example (char_column, varchar_column) VALUES ('shorter', 'shorter');

-- 查看数据
SELECT char_column, LENGTH(char_column) AS char_length, varchar_column, LENGTH(varchar_column) AS varchar_length FROM example;
  • CREATE TABLE example:创建一个名为example的表,包含两个字符列,一个CHAR类型,一个VARCHAR类型。
  • INSERT INTO example:向表中插入数据。
  • SELECT:查询并显示字符列及其长度。LENGTH函数返回字符串的字节长度。
  • 对于CHAR列,如果存储的字符串长度小于指定长度,MySQL会用空格填充剩余空间。因此,即使存储的字符串是"test",CHAR列的长度也会显示为10。
  • 对于VARCHAR列,只占用实际字符串长度加上一个或两个额外字节来记录字符串的长度。因此,存储的字符串是"test",VARCHAR列的长度会显示为4。
  1. 性能与空间效率
    • CHAR:
      • 优点:检索和更新操作可能更快,因为不需要额外的字节来存储长度信息,且固定长度的特性简化了处理过程,使得比较和排序操作更加高效。
      • 缺点:如果存储的字符串通常都远小于指定的长度,那么使用CHAR可能会导致空间浪费。
    • VARCHAR:
      • 优点:对于较短的字符串,VARCHAR比CHAR更节省存储空间,因为它只占用字符串实际需要的空间加上一个或两个额外字节来记录字符串的长度。
      • 缺点:由于需要额外的字节来存储长度信息,在某些情况下,如果字符串长度接近或达到指定的最大长度,VARCHAR的空间效率可能会低于CHAR。此外,由于行是变长的,在UPDATE时可能使行变得比原来更长,导致需要做额外的工作。
  2. 选择建议
    • CHAR:适合存储长度固定、需要填充或对齐的字符串,如代码、ID或密码。这些字段通常具有固定的长度要求,使用CHAR可以确保数据的一致性和完整性。
    • VARCHAR:适合存储长度可变的字符串,如姓名、地址或描述性文本。这些字段的长度可能因记录而异,使用VARCHAR可以更有效地利用存储空间。

MySQL中decimal与float,double的区别

面试官提出的问题

问题:请阐述MySQL中decimal、float和double数据类型的区别,并给出它们在实际应用中的选择建议。

问题的重点

面试者需要明确decimal、float和double在存储精度、存储需求、应用场景等方面的差异,并能根据具体需求选择合适的数据类型。

面试者如何回答

回答:

在MySQL中,decimal、float和double是用于存储浮点数的数据类型,但它们在存储精度、存储需求以及适用场景上存在显著差异。

  1. 存储精度与存储需求

数据类型

描述

存储需求(字节)

精度

decimal

精确的定点数,用于存储精确的数值数据

可变(取决于精度和标度)

高精度,由用户定义的精度和标度决定

float

单精度浮点数,用于存储近似数值数据

4

大约7位十进制数字的精度

double

双精度浮点数,用于存储更高精度的近似数值数据

8

大约15位十进制数字的精度

代码语言:sql
复制
-- 创建一个包含decimal, float和double列的表
CREATE TABLE number_types (
    decimal_column DECIMAL(10, 2),  -- 定点数,总共10位数字,其中2位是小数位
    float_column FLOAT,             -- 单精度浮点数
    double_column DOUBLE            -- 双精度浮点数
);

-- 插入数据
INSERT INTO number_types (decimal_column, float_column, double_column) VALUES
(12345.67, 12345.67, 12345.67),
(0.123456789012345, 0.123456789012345, 0.123456789012345),
(987654321.98, 987654321.98, 987654321.98);

-- 查询数据并查看精度差异
SELECT decimal_column, FLOAT_FORMAT(float_column, 15) AS float_column_formatted, DOUBLE_FORMAT(double_column, 20) AS double_column_formatted
FROM number_types;

-- 注意:MySQL中没有直接的FLOAT_FORMAT和DOUBLE_FORMAT函数,这里只是为了说明结果格式化。
-- 在实际应用中,可以使用ROUND函数或其他方法来格式化输出。
-- 由于MySQL的显示精度限制,这里假设使用了某种方法来展示高精度结果。
  • CREATE TABLE number_types:创建一个名为number_types的表,包含三种不同类型的数值列。
  • INSERT INTO number_types:向表中插入数据,包括精确的decimal值、float值和double值。
  • SELECT:查询并格式化显示数据。由于MySQL没有直接的函数来显示浮点数的高精度结果,这里使用了假设的FLOAT_FORMAT和DOUBLE_FORMAT函数来表示(实际上应使用ROUND或其他函数进行格式化)。
  • 注意:在实际MySQL查询中,没有FLOAT_FORMAT和DOUBLE_FORMAT这样的函数。为了展示浮点数的高精度结果,可以使用ROUND函数或调整SQL客户端的显示精度设置。但在这个例子中,我使用了这些假设的函数来强调精度的差异。
  • decimal_column将准确存储并显示插入的数值,没有精度损失。
  • float_column和double_column可能会因为浮点数的表示方式而引入微小 的精度误差。特别是当数值很大或很小,或者包含很多小数位时,这种误差可能会更加明显。
  • 应用场景
  • decimal:适用于需要高精度计算的场景,如财务数据、科学计算等。在这些场景中,即使是微小的精度损失也可能是不可接受的。
  • float和double:适用于需要存储和计算大量近似数值数据的场景,如图形处理、物理模拟等。在这些场景中,精度要求可能相对较低,而存储效率和计算速度更为重要。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • char与varchar的区别?如何选择?
    • 面试官提出的问题
    • 问题的重点
    • 面试者如何回答
  • MySQL中decimal与float,double的区别
    • 面试官提出的问题
    • 问题的重点
    • 面试者如何回答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档