字符串是您将在MySQL中使用的最常见的数据类型之一。许多用户在没有认真理解字符串的情况下在他们的数据库中插入和读取字符串。本文旨在让您深入了解MySQL如何存储和显示您的字符串变量,以便您可以更好地控制您的数据。您可以将字符串分为两类:二进制和非二进制。大多数时候您可能会想到非二进制字符串。非二进制字符串具有字符集和排序规则差异。另一方面,二进制字符串存储诸如MP3文件或图像之类的内容。即使您在二进制字符串中存储像“song”这样的词,它的存储方式也与非二进制字符串不同。我将专注于非二进制字符串。MySQL中的所有非二进制字符串都与字符集和排序规则相关。字符串的字符集控制哪些字符可以存储在字符串中,排序规则控制字符串在显示时的排序方式。字符集要查看系统中的字符集,请运行以下命令:SHOWCHARACTERSET;这条命令会输出四列数据,包括字符集:名称简要描述了默认的排序方式字符集中每个字符的最大大小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'USINGlatin1);SELECTLENGTH(@a),CHAR_LENGTH(@a);+------------+---------------+|长度(@a)|CHAR_LENGTH(@a)|+------------+------------------+|4|4|+------------+----------------+这个例子说明latin1字符集以单-字节单位。其他字符集,如utf16,允许多字节字符:SET@b=CONVERT('data'USINGutf16);SELECTLENGTH(@b),CHAR_LENGTH(@b);+------------+--------------------+|长度(@b)|CHAR_LENGTH(@b)|+-----------+----------------+|8|4|+------------+--------------------+排序当您运行带有ORDERBY子句的SQL语句时,字符串排序将决定值的显示方式。您选择的排序方法取决于您选择的字符集。当您运行上面的SHOWCHARACTERSET命令时,您会看到每个字符集的默认排序。您可以轻松查看特定字符集的所有排序规则。例如,如果您想查看utf8mb4字符集允许哪些排序规则,请运行:SHOWCOLLATIONLIKE'utf8mb4%';排序规则可以不区分大小写、区分大小写或二进制。让我们创建一个简单的表,向其中插入一些值,并查看不同排序的数据,看看输出有何不同:CREATETABLEsample(sCHAR(5));插入样本值('AAAAA'),('ccccc'),('bbbbbb'),('BBBBB'),('aaaaa'),('CCCCC');从样本中选择*;+---------+|s|+------------+|啊啊啊||ccccc||bbbbb||BBBBB||啊啊啊||CCCCC|+------------+在不区分大小写的情况下,您的数据将按字母顺序返回,但不能保证大写单词先于小写单词,如下图所示:SELECT*FROMsampleORDERBYsCOLLATEutf8mb4_turkish_ci;+----------+|s|+------------+|啊啊啊||啊啊啊||bbbbb||BBBBB||ccccc||CCCCC|+-----------+另一方面,当MySQL运行区分大小写的搜索时,每个字母的小写字母将排在大写字母之前:SELECT*FROMsampleORDERBYsCOLLATEutf8mb4_0900_as_cs;+-------------+|s|+----------+|啊啊啊||啊啊啊||bbbbb||BBBBB||ccccc||CCCCC|+-------------+二分排序会返回所有大写值,然后返回小写值:SELECT*FROMsampleORDERBYsCOLLATEutf8mb4_0900_bin;+-----------+|s|+------------+|啊啊啊||ccccc||bbbb||BBBBB||啊啊啊||CCCCC|+------------+如果你想知道一个字符串使用哪个字符集和排序规则,你可以使用恰当命名的字符集和排序规则功能运行MySQL8.0或更高版本的服务器将使用utf8mb4字符集和utf8mb4_0900_ai_ci默认排序:SELECTcharset('data');+------------------+|字符集('数据')|+--------------------+|utf8mb4|+------------------+SELECTcollat??ion('data');+------------------+|整理('数据')|+--------------------+|utf8mb4_0900_ai_ci|+--------------------+您可以使用SETNAMES命令更改使用的字符集或排序方法。要从utf8mb4更改为utf16,请运行以下命令:SETNAMES'utf16';如果要选择默认以外的排序方法,可以在SETNAMES命令中添加一个COLLATE子句。例如,假设您的数据库存储西班牙语单词。MySQL的默认排序规则(utf8mb4_0900_ai_ci)将ch和ll视为两个不同的字符并对它们进行排序。但是在西班牙语中,ch和ll是不同的字母,所以如果您希望它们按正确的顺序排序(分别在c和l之后),您需要使用不同的排序方式。一种选择是使用utf8mb4_spanish2_ci排序:SETNAMES'utf8mb4'COLLATE'utf8mb4_spanish2_ci';存储字符串MySQL允许您为字符串值选择不同的数据类型。(甚至超过其他流行的数据库,如PostgreSQL和MongoDB。)以下是MySQL的二进制字符串数据类型、它们的非二进制对应物及其最大长度的列表:Binary:char(255)varbinary:varchar(65,535)tinyblob:tinytext(255)blob:text(65,535)mediumblob:mediumtext(16,777,215)longblob:longtext(4,294,967,295)需要记住的重要一点是,与varbinary、varchar、text和不同于blob类型(即,仅使用尽可能多的空间),MySQL将二进制(binary)和字符(char)类型存储在固定长度的字段中。因此,像char(20)或binary(20)这样的值将始终占用20个字节,即使您在其中存储的字符少于20个。MySQL用二进制类型的ASCIINUL值(0x00)和字符类型的空格填充这些值。选择数据类型时要考虑的另一件事是是否要保留或去除字符串后的空格。显示数据时,MySQL会从以字符数据类型存储的数据中去除空格,但不会从varchar中去除。创建表sample2(s1CHAR(10),s2VARCHAR(10));插入样本2(s1,s2)VALUES('cat','cat');从样本2中选择s1、s2、CHAR_LENGTH(s1)、CHAR_LENGTH(s2);+--------+--------+------------------------------------+|s1|s2|字符长度(s1)|CHAR_LENGTH(s2)|+--------+--------+--------------------------------+|猫|猫|3|10|+---------+--------+----------------------------------+summary字符串是数据库中最常用的数据类型之一,MySQL仍然是当今最流行的数据库系统之一。我希望您从本文中学到了一些新东西,并可以使用您的新知识来提高您的数据库技能。
