了解 MySQL 如何存储和显示你的字符串变量,以便你能更好地控制你的数据。
字符串是你在 MySQL 中使用的最常见的数据类型之一。许多用户在他们的数据库中插入和读取字符串,而没有认真地了解过它们。本文旨在让你深入了解 MySQL 如何存储和显示你的字符串变量,以便你能更好地控制你的数据。
你可以把字符串分成两类:二进制和非二进制。你可能在大多数时候想到的是非二进制字符串。非二进制字符串有字符集和排序的不同。另一方面,二进制字符串存储诸如 MP3 文件或图像等东西。即使你在二进制字符串中存储了一个词,比如“歌曲”,它的存储方式也与非二进制字符串不同。
我将重点讨论非二进制字符串。MySQL 中的所有非二进制字符串都与字符集和排序相关。字符串的字符集控制哪些字符可以存储在字符串中,而它的排序方式控制当你显示字符串时如何排序。
字符集
要查看你系统中的字符集,请运行以下命令:
SHOW CHARACTER SET;
这个命令将输出四列数据,包括字符集:
- 名称
- 简要描述
- 默认的排序方式
- 字符集中每个字符的最大尺寸
MySQL 过去默认为 latin1
字符集,但自 8.0 版以来,默认为 utf8mb4
。现在的默认排序方式是 utf8mb4_0900_ai_ci
。ai
表示该排序对音调不敏感( á
= a
),而 ci
则指定它对大小写不敏感(a
= A
)。
不同的字符集将其字符存储在内存中不同大小的块中。例如,从上面的命令可以看出,存储在 utf8mb4
的字符被存储在 1 到 4 个字节大小的内存中。如果你想看看一个字符串是否包含多字节的字符,你可以使用 CHAR_LENGTH()
和 LENGTH()
函数。CHAR_LENGTH()
显示一个字符串包含多少个字符,而 LENGTH()
显示一个字符串有多少个字节,根据字符集的不同,它可能与一个字符串的字符长度相同,也可能不相同。下面是一个例子:
SET @a = CONVERT('data' USING latin1);
SELECT LENGTH(@a), CHAR_LENGTH(@a);
++--+
| 4 | 4 |
++--+
| s |
+--+
在不区分大小写的情况下,你的数据会按字母顺序返回,但不能保证大写的单词会排在小写的单词之前,如下图所示:
SELECT * FROM sample ORDER BY s COLLATE utf8mb4_turkish_ci;
+--+
| AAAAA |
| aaaaa |
| bbbbb |
| BBBBB |
| ccccc |
| CCCCC |
+--+
| s |
+--+
而按二进制排序方式将返回所有大写的值,然后再返回小写的值:
SELECT * FROM sample ORDER BY s COLLATE utf8mb4_0900_bin;
+--+
| AAAAA |
| ccccc |
| bbbbb |
| BBBBB |
| aaaaa |
| CCCCC |
++--+
| s1 | s2 | CHAR_LENGTH(s1) | CHAR_LENGTH(s2) |
+++--+
总结
字符串是数据库中最常用的数据类型之一,而 MySQL 仍然是当今最流行的数据库系统之一。我希望你能从这篇文章中学到一些新的东西,并能用你的新知识来提高你的数据库技能。
via: https://opensource.com/article/23/1/strings-mysql
作者:Hunter Coleman 选题:lkxed 译者:wxy 校对:wxy
发表回复