MySQL 如何使用MySQL Unicode字符字面值,以及如何将Unicode字符插入MySQL数据库中

MySQL 如何使用MySQL Unicode字符字面值,以及如何将Unicode字符插入MySQL数据库中

MySQL是一个重要的开源关系型数据库管理系统,在使用它时,我们通常也需要考虑字符集的问题,因为不同的字符集可能会影响到数据库的正确性。本文将深入讲解MySQL中的Unicode编码及其相关的字符集,介绍如何使用MySQL Unicode字符字面值,以及如何将Unicode字符插入MySQL数据库中。

阅读更多:MySQL 教程

Unicode介绍

Unicode是一种字符编码方案,其目的是为了解决字符编码的问题。Unicode的主要特点是可以简单的表示大多数语言使用的大量字符。Unicode组成的范围是0x0000到0x10FFFF,其中第0平面(Plane 0)中是最基本的字符,已经包含了ASCII字符。

Unicode字符集按照编码位数不同,分别有UTF-8, UTF-16和UTF-32等多种编码标准,其中UTF-8应用最为广泛。Unicode字符集能够映射包含多少字符的范围,并在字符编码时为每个字符分配唯一的单一代码点。

MySQL字符集介绍

MySQL中支持多种字符集,包括utf8(实际上是一种变形,有一个bug)、utf8mb4、gbk、latin、cp850等,其中utf8mb4能够支持完整的Unicode字符集。在 MySQL 5.5.3 之前的版本中,MySQL使用utf8编码中只支持基本的Unicode字符,不支持辅助字符(Supplementary Characters)。因此,我们在 MySQL 应用 UTF-8 编码时,必须使用 utf8mb4 字符集(Mb4代表可以使用4个字节缩写“most bytes”)。下面给出具体的范例。

我们先创建一个名为test的数据库,并切换到该数据库:

CREATE DATABASE test;
USE test;
Mysql

MySQL Utf8编码支持范例

MySQL8.0以下版本无法支持所有四个字节的Unicode字符编码,所以需要使用utf8mb4来替代。下面是一个尝试将Emojis插入MySQL 5.7及更新版本以前版本中的 utf8 字符集的失败范例:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8mb4_unicode_ci;
Mysql

上面的代码片段创建一个表格,其中 name 字段已经设置为 UTF-8mb4文字集合,并使用utf8mb4_unicode_ci通过utf8mb4表示不同字符和图像的排序顺序。默认情况下,utf8mb4_unicode_ci是最好的选择,因为它是根据标准的Unicode排序顺序进行排序。值得注意的是,🎉的Unicode编码为U+1F381 和十进制编码为127881。当我们尝试将这个 Emoji 插入表格时,MySQL就会抛出下面这个错误:

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x8E\x81' for column 'name' at row 1
Mysql

这个错误表明,您试图将包含无法表示的字符集转换为指定的Unicode编码。换句话说,MySQL 尝试将 Emoji 存储为占位符,而不是将其解析为 Unicode 编码。

为了解决这个问题,我们需要使用 utf8mb4 字符集来存储所有的 Unicode 字符,而不仅仅是基本的 ASCII 码或子集。下面是改进后的代码片段:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Mysql

该表使用 utf8mb4_unicode_ci 排序规则并设置字符集为 utf8mb4。在这样的情况下,上述 Emoji 将会在数据库中正常存储,不再会引发错误。

MySQL Unicode字符字面值

MySQL支持类似于其他编程语言中的Unicode字符字面值,可以用于表示Unicode字符的编码。它们的语法是\uxxxx\Uxxxxxxxx,其中xxxx是对应Unicode字符的编码。

下面的代码片段演示如何使用MySQL Unicode字面值来插入Unicode字符:

INSERT INTO `test` (`name`) VALUES (UNICODE('\u592a\u9633'));
SQL

Unicode字面值\u592a\u9633对应太阳这个汉字的Unicode编码,该代码片段将其插入到test表中的name字段中。我们可以使用SELECT语句来验证插入是否正确:

SELECT `name` FROM `test` WHERE `id` = 1;
SQL

查询结果应该为太阳对应的汉字“太阳”。

我们还可以使用另一种Unicode字符字面值\Uxxxxxxxx来插入较大编码号的Unicode字符,例如:

INSERT INTO `test` (`name`) VALUES (UNICODE('\U0001F602'));
SQL

上面的代码将笑脸Emoji插入test表中的name字段。

Unicode编码转换函数

MySQL提供了一组有用的函数来进行Unicode编码转换。下面介绍两个常用的函数:

HEX()

HEX()函数返回给定字符串的十六进制字符串表示形式。

下面是一个使用HEX()函数将Unicode字符从UTF-8编码转换为十六进制表示的范例:

SELECT HEX(CONVERT('你好', USING utf8mb4));
SQL

这个查询返回该字符串Unicode编码的十六进制表示形式。

UNHEX()

UNHEX()函数是HEX()函数的反函数,将十六进制字符串转换为原始字符串。

下面是一个使用UNHEX()函数将Unicode字符从UTF-8编码转换为正确表示的范例:

SELECT CONCAT('"', CONVERT(UNHEX('E4BDA0E5A5BD'), USING utf8mb4), '"');
SQL

这个查询将Unicode码值为4f60 597d的字符串转换为UTF-8编码为“你好”的字符串。

总结

本文详细介绍了MySQL Unicode编码、UTF-8编码方案和MySQL支持的字符集,同时也探讨了如何使用MySQL Unicode字符字面值和Unicode编码转换函数处理Unicode字符。由于MySQL 5.5.3之前的版本不支持完整的Unicode字符集,我们需要使用utf8mb4字符集来存储标准的UTF-8编码字符。尽管Unicode编码转换函数速度较慢,但是在需要进行编码转换时,它们仍然非常有用。通过了解和掌握这些知识,我们可以更好地理解和操作MySQL数据库。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册