概述
有没有发现自己在构建数据库时,会问自己应该对特定列使用哪些数据类型?在MySQL数据类型系列文章中,我们将探讨将字符串和文本保存到数据库的各种方法,以帮助揭开您作为开发人员所拥有的选项的神秘面纱,从 VARCHAR 和 CHAR 开始。
VARCHAR 和 CHAR
VARCHAR 可能是字符串使用最广泛的数据类型。它存储一个可变长度的字符串,最多 65535 个字符。创建 VARCHAR 字段时,您将能够使用 VARCHAR(n) 格式指定字段将接受的最大字符数,其中 n 是要存储的最大字符数。由于它是可变长度,因此它只会分配足够的磁盘空间来存储字符串的内容,而不是传入的内容的完整长度。
VARCHAR 还会为每个存储的值分配一点额外的空间。根据存储数据所需的空间,将分配 1 或 2 个字节的开销。如果所需的空间小于 255 字节,则将添加 1 字节前缀,否则将使用 2 字节前缀。存储值所需的确切空间取决于所使用的字符集(稍后将对此进行详细介绍)。
CHAR 是另一种存储字符串的方法,但它的最大长度为 255 并且是固定长度。与 VARCHAR 一样,您可以选择使用 CHAR(n)n 格式设置 CHAR 字段中的最大字符数。如果未指定 n,则默认为 1。存储在列中的值用空格右填充,因此无论保存的字符串如何,它都将始终存储字符 n。在某些情况下,这实际上可以提高数据库的性能。
分解字符集
虽然大多数编程语言使用英语中的字符,但世界各地的人类使用不同类型的字符进行书写和阅读。这可以是像西班牙语 Ñ 一样简单的东西,也可以像日语中 データベース 一样非常不同的东西。为了解决这个问题,MySQL有不同的字符集(或字符集)来解决不同语言中使用的符号。字符集会影响文本在数据库中的存储方式,但也会影响保存数据时分配的存储空间量。
例如,当使用默认的 utf8mb4 字符集时,MySQL将为每个存储的字符分配4个字节。考虑到这一点,以及所有列的最大行大小为 65,535 字节,由于每个字符的存储要求,您实际上只能创建最大长度为 16,383 个字符的 VARCHAR 列。
可视化差异
将数据保存到 CHAR 字段时,一个副作用是:在保存值时,字符串中的任何尾随空格实际上都会丢失。实际上,当您从 CHAR 列中查询数据时,MySQL甚至不会返回尾随空格,因为它必须假设额外的空格只是填充。
为了演示这一点,让我们创建一个包含两列,一列 VARCHAR(20) 和一列 CHAR(20)
的表。然后,我们将在数据末尾插入一些带有五个空格的数据,以查看其存储方式。
CREATE TABLE strings(
id INT PRIMARY KEY AUTO_INCREMENT,
variable VARCHAR(20),
fixed CHAR(20)
);
INSERT INTO strings (variable, fixed) VALUES ("Drifter ", "Drifter ");
现在,如果我运行 SELECT 语句,则返回的数据似乎是相同的。
SELECT * FROM strings;

但是,如果我使用该 CHAR_LENGTH 函数来计算每个字段中使用的字符数,您会注意到存储在 VARCHAR 字段中的数据(用 varchar_data_length 表示)为 12,这考虑了末尾的 5 个额外空格字符,而 CHAR 字段仅显示 7 个。这是因为MySQL在 VARCHAR 值的末尾存储空格,但它假设 CHAR 值末尾的额外空间是基于数据类型追加的填充。
SELECT CHAR_LENGTH(variable) AS varchar_data_length, CHAR_LENGTH(fixed) AS char_data_length FROM strings;

如前所述,当数据写入磁盘时,VARCHAR 值也会产生额外的开销。这意味着,如果您要存储长度为 6 个字符的字符串“Spider”,并且同时将其存储在 VARCHAR(6) 和 CHAR(6) 列中,则该 VARCHAR 值将使用 25 个字节(使用 utf8mb4 字符集时每个字符 4 个字节加上 1 个字节的开销),而该 CHAR 值将使用 24 个字节。
但是,如果您将“Eido”存储在这些相同的列中,则 VARCHAR 将仅使用5个字节,并且仍 CHAR 将使用6个字节。由于 CHAR 数据类型是固定长度的,因此它用 2 个空格右填充,总共有 6 个。
| Value | VARCHAR(6)Stored value | VARCHAR(6) Space used | CHAR(6) Stored value | CHAR(6) Space used |
|---|---|---|---|---|
| “Spider” | “Spider” | 25 字节 | “Spider” | 24 字节 |
| “Eido” | “Eido” | 17 字节 | “Eido " | 24 字节 |
| “Eido " | “Eido " | 25 字节 | “Eido " | 24 字节 |
何时使用:VARCHAR and CHAR?
现在,您已经了解了 VARCHAR 和 CHAR 之间的差异,下面是一些提示,可帮助您确定哪种数据类型最适合您的应用程序:
在以下情况下使用 VARCHAR:
- 您需要存储一个超过 255 个字符的字符串。
- 您发现自己处于一种罕见的情况中,您确实需要保留尾随空格。
在以下情况下使用 CHAR:
- 您等于或低于 255 个字符,并且您始终知道字符串的长度。
- 固定长度的序列号将是一个很好的例子,说明 CHAR 何时有用。
原文标题:Db2 for z/OS: SEPARATE_SECURITY and SECADM
原文作者:Robert Catterall
原文地址:https://planetmainframe.com/2022/09/db2-for-z-os-separate_security-and-secadm/




