MySQL 字符集
MySQL中的字符集是一个由 字符、编码 和 符号 组成的字符串,这些字符串在一定程度上是合法的。本文将解释如何获取MySQL中的所有字符集,如何为客户端连接配置正确的字符集,以及如何在多个字符集之间转换字符串。
让我们以一个假想字符集的例子来理解它。假设我们拥有从 A到B,或a到b 的字母。接下来,我们为每个字母赋予一个数字: A = 0, B = 1 。在这里,字母A或B是一个符号,而数字0或1是编码。我们称这些字母(从A到B,或a到b)及其关联的编码的组合为 字符集 。
同样,如果我们想要比较两个字符串值,例如A和B。最简单的方法是使用它们的编码,A的编码为0,B的编码为1。从编码中可以清楚地看出,0小于1,所以我们可以说 A小于B 。
MySQL 支持各种字符集,每个字符集总是至少使用一个排序规则。排序规则定义了在字符集中比较字符的规则。字符集允许我们在字符串中存储任何字符。我们可以使用下面的语句查看MySQL数据库服务器中的所有字符集:
SHOW CHARACTER SET;
它将返回以下输出:
默认情况下,上述语句在MySQL中生成所有可用的字符集。如果我们想要获取任何特定字符集族的名称,可以使用一个可选的 LIKE 或者 WHERE **子句来返回匹配的字符集名称。下面的语句显示基于UTF(Unicode转换格式)的一些 **Unicode字符集 :
SHOW CHARACTER SET LIKE 'utf%';
我们可以看到输出如下:
在这个图像中, Maxlen 列中的值代表字符集中容纳一个字符所需的字节数。MySQL中的每个字符集都包含一个 单字节字符 ,例如latin1、latin2、cp850,或 多字节字符 。
latin1 是MySQL中使用的默认字符集。如果我们将来自不同语言的字符或符号存储在同一列中,我们将使用Unicode字符集,例如utf8或ucs2。
MySQL的 LENGTH() 函数返回字符串的字节长度,而 CHAR_LENGTH() 函数用于查找字符串的字符长度。如果我们使用LENGTH()函数来计算包含多字节字符的字符串的长度,那么得到的结果会高于CHAR_LENGTH()函数的结果。下面的示例更清楚地说明了这一点,示例使用了ucs2字符集。
SET @str = CONVERT('MySQL Character Set' USING ucs2);
SELECT LENGTH(@str), CHAR_LENGTH(@str);
我们可以看到以下输出,其中LENGTH函数返回的结果大于CHAR_LENGTH函数的结果:
CONVERT 函数用于将字符串转换为特定的字符集。上面的示例将MySQL字符集字符串转换为ucs2字符集。由于字符集ucs2包含双字节字符,因此 @str 的字节长度大于它的字符长度。
再次看一个例子。需要注意的是,许多字符集包含多字节字符,但它们的字符串只包含单字节字符,例如utf8,如下所示:
SET @str = CONVERT('MySQL Character Set' USING utf8);
SELECT LENGTH(@str), CHAR_LENGTH(@str);
我们可以看到输出如下:
然而,如果字符集为utf8的字符串中包含任何特殊字符,则其字节长度会有所不同。请参考以下示例:
SET @string = CONVERT('pingüino' USING utf8);
SELECT LENGTH(@string), CHAR_LENGTH(@string);
我们将得到以下输出:
字符集转换
MySQL 主要提供两个函数来在不同字符集之间进行字符串转换。这些函数分别是 CONVERT() 和 CAST() 。我们已经在上面的示例中看到了 CONVERT 函数的工作方式。在这里,我们只会看到与 CONVERT 函数类似的 CAST 函数的工作方式。
以下是 CONVERT() 函数的基本语法:
CONVERT(expression USING character_set_name)
以下是CAST()函数的基本语法: CAST()函数的基本语法如下:
CAST(string AS character_type CHARACTER SET character_set_name)
查看下面的示例,该示例使用CAST函数在不同字符集之间进行转换:
SELECT CAST(_latin1 'MySQL character set' AS CHAR CHARACTER SET utf8mb4) CHAR_SET;
将输出结果为以下内容:
配置客户端连接的字符集
当数据库应用程序与MySQL服务器交换数据时,它使用名为latin1的默认字符集。如果应用程序在字符集UTF8中存储Unicode字符串,则数据库应用程序中的默认字符集latin1可能不足够。因此,在我们的应用程序连接到MySQL数据库服务器时,需要指定一个合适的字符集。
我们可以使用以下方式之一来配置客户端连接的字符集:
- 当客户端连接到MySQL数据库服务器时,可以使用 SET NAMES 命令。例如,如果需要为客户端连接设置一个 UTF8MB4 Unicode字符集,我们将使用以下语句:
SET NAMES 'utf8mb4';
- 在MySQL中,MySQL连接器提供了一些其他字符集。假设我们正在使用 PHP PDO, 那么我们可以在数据源名称中设置字符集,如下所示:
$dsn ="mysql:host=$host;dbname=$db;charset=utf8";
- 我们还可以使用 default-character-set 选项来设置字符集,如果我们的数据库应用程序支持的话。例如,MySQL Client Tool总是支持这个选项,可以使用以下语句在配置文件中进行设置:
[mysql]
default-character-set= utf8
为确保我们使用的方式,我们的数据库应用使用的字符集应与存储在MySQL服务器中的字符集相匹配。