`

字符编码在MySQL中的应用

 
阅读更多

 

使用 MySQL 数据库涉及到字符编码的问题。早期的 MySQL 表没有字符集的概念,其字符串实际上都仅是字节序列。现在我们使用的 4.1.x 系列的 MySQL 已经非常清晰地定义了字符集的作用。字符集的设置作用于两个方面:一是存储的数据,二是数据库查询的字符转换。

每一个文本字段(char,varchar,text)都分别有一个 character set 和 collation 属性。前者指定该文本字段所包含的值(这是一个字符串)储存在磁盘上时所使用的编码。在编码的选择上可以考虑两方面的因素:一是存储所占空间(UTF-8编码可以表示任意字符,但是汉字通常需用3个字节表示;UCS-2用两个字节表示汉字,但是也用2个字节表示英文字母;因此相对来说GBK编码对于主要存储汉字的应用来说比较经济),二是查询时的转码开销。collation属性指定字符串比较的特性,这影响到字符串相等判断和排序。在此不累述。

每一个表也分别有一个 character set 和 collation 属性。当没有显示指定文本字段的字符集时,采用表的字符集。

以下语句建立一个默认gbk编码的表,其中一个字段显式地指定为utf-8编码。

CREATE TABLE t (
a char(8) character set utf8,
b char(8)
) DEFAULT CHARSET=gbk;

SHOW FULL COLUMNS FROM t 命令查看该表的实际结构:

+-------+---------+-----------------+------+-----+---------+-------+
| Field | Type | Collation | Null | Key | Default | Extra |
+-------+---------+-----------------+------+-----+---------+-------+
| a | char(8) | utf8_general_ci | YES | | NULL | |
| b | char(8) | gbk_chinese_ci | YES | | NULL | |
+-------+---------+-----------------+------+-----+---------+-------+

MySQL 中使用到字符编码的另一个方面是查询时的字符转换。每个数据库连接附有一个字符集属性,使用该连接执行任何查询时,MySQL都会将文本字段的值(这是一个字符串)按该连接字符集映射成字节序列。可以通过以下查询指定连接的字符集:

SET NAMES gbk;

如果使用 MySQL Connector/J (com.mysql.jdbc.Driver),也可以通过连接URL中的 characterEncoding 参数指定连接字符集,形如:

jdbc:mysql://localhost:3306/dbname?characterEncoding=GBK

这样,同一连接接下的查询中,字符串就都会以gbk编码的字节序列返回。这个命令通常是必须的,因为MySQL默认的连接编码是latin1,因此如果不设置连接字符集就直接查询文本字段的值,那么MySQL会企图用latin1编码映射字符,这时汉字都不能读出。

与此类似的MySQL的另一个至关重要的特性是,它在字段赋值时会自动将源字段的文本按目标字段的字符集编码,即使目标字符集无法映射源字符串也不报错(最新的MySQL会产生Warning,但是一来MySQL表通常不支持事务,二来对于ALTER TABLE之类的操作事务是无效的)。这个特性在移植数据表示可能导致严重后果。参考下面的例子:

假设一个现有的MySQL表使用latin1编码来储存文本(早期的MySQL表不支持字符集,那么默认为latin1;即使对于支持字符集的MySQL版本,仍有不少现有的程序能够“成功”地用latin1编码储存汉字):

mysql> show full columns from t;

+-------+--------------+-------------------+------+-----+---------+-------+
| Field | Type | Collation | Null | Key | Default | Extra |
+-------+--------------+-------------------+------+-----+---------+-------+
| a | varchar(100) | latin1_swedish_ci | YES | | NULL | |
+-------+--------------+-------------------+------+-----+---------+-------+

这个字段 a 中实际上存储的是汉字的gbk编码字节序列。一些应用程序可以以latin1编码读出字段的值,然后显示(通常这些程序并不在乎字符集;字符的解码交给终端或IE来做)。但是这种方法对最新的 MySQL J/Connector (com.mysql.jdbc.Driver) 不适用,因此我想把这个字段转换为gbk编码的。

下面这个是*错误*的做法:

ALTER TABLE t MODIFY a varchar(100) character set gbk;

根据这个查询,MySQL会将 a 字段中原先的字符串(它以为是一个字节一个拉丁字符,但实际上我们存储了gbk编码的字节序列)按gbk编码映射为新的字节序列。这时原先用来表示一个汉字的两个字节就被当作两个汉字来映射,但是由于gbk编码中没有对 >0x80 的单字节的映射,因此原字段中所有的中文都被映射为 ? 。而且无法挽救。

正确的做法是,依次执行以下两个查询:

ALTER TABLE t MODIFY a blob;
ALTER TABLE t MODIFY a varchar(100) character set gbk;

第一句话让MySQL保留原字段的字节序列,但是清除字符集标记。后一句话给字段加上新的字符集标记,并保留字节序列不动。

在两个不同字符集的字段间赋值也存在类似上面的注意事项。

分享到:
评论

相关推荐

    中英文字符编码查询助手.zip

    - 在网页开发中,确定正确的字符编码可以确保网页内容正确显示。 - 在数据库操作中,选择合适的字符集(如MySQL的`utf8mb4`)能确保存储和检索中文字符。 - 在文件处理中,了解文件的编码类型可以帮助正确打开和...

    MySQL中文编码设置

    在Web应用程序中,特别是针对中文环境的应用程序,正确设置MySQL的字符集对于确保数据的正确存储和检索至关重要。不正确的字符集设置不仅会导致数据读取时出现乱码,还可能引起搜索、排序等操作的错误结果。因此,...

    设置mysql字符集

    在IT领域,尤其是在数据库管理与应用中,字符集的设置对于确保数据的正确存储与显示至关重要。MySQL作为全球广泛使用的开源关系型数据库管理系统之一,其字符集的设置直接影响到数据的编码方式,进而影响到数据的...

    解决连接mysql中文显示乱码

    这主要涉及到字符编码的兼容性和设置问题,尤其是在使用MySQL数据库与不同编程语言(如Java、JSP)进行交互时更为突出。以下是对如何解决连接MySQL时中文显示乱码问题的详细解析。 ### 解决中文显示乱码的关键知识...

    mysql字符集转换

    在MySQL数据库管理中,字符集的正确设置至关重要。它直接影响到数据的存储与检索效果,尤其是对于包含多种语言文本的应用场景而言。本文将围绕“MySQL字符集转换”这一主题展开讨论,通过对给定文件中的标题、描述、...

    php字符编码确定

    在探讨“PHP字符编码确定”这一主题时,我们需深入理解如何在PHP与MySQL环境中确保一致且正确的字符编码设置,这对于处理多语言内容、避免乱码以及确保数据完整性和正确显示至关重要。 ### PHP与MySQL字符编码的...

    ubuntu mysql中中文乱码问题.docx

    在部分内容中,作者提供了多种解决方案,包括使用 SET 命令来设置字符编码,修改 MySQL 配置文件 my.cnf 以及使用 sudo 命令来重启 MySQL 服务。 知识点总结 1. MySQL 数据库中文乱码问题可能是由于字符编码设置不...

    mysql字符集设置

    MySQL字符集设置是数据库管理中的一个重要环节,尤其是在处理多语言数据或者有特殊字符需求的应用中。字符集决定了数据库、表以及字段如何存储和显示字符,影响到数据的正确性及兼容性。以下将详细讲解MySQL字符集的...

    深入UTF8字符编码.pdf

    深入探讨UTF-8字符编码,理解其在不同平台与应用中的表现及转换机制,对于现代软件开发、数据库管理和网络通信尤为重要。以下是从给定文件中提取的关键知识点,旨在全面解析UTF-8编码在Windows系统、文本工具、JAVA...

    字符编码表新版.zip

    在这个名为"字符编码表新版.zip"的压缩包中,我们有一个“字符编码表新版.pdf”文件,它很可能包含了最新的字符编码标准,特别是针对多语言环境的设计。这份文档对于开发者来说是一个宝贵的资源,因为它可以帮助他们...

    IDEA编码GBK不可映射字符解决方法

    5. 在IDEA中选择正确的编码方式:在IDEA中,可以选择正确的编码方式,例如UTF-8,以避免GBK编码的局限性。 tips: * 在IDEA中,可以使用“文件”菜单中的“保存为”选项来选择正确的编码方式。 * 在EditPlus中,...

    MySQL字符集

    “工具”标签可能是指用于处理字符集问题的一些实用工具,如`iconv`用于转换字符编码,或者MySQL自带的`mysql_client`和`mysql_convert_table_format`工具,它们可以帮助用户查看和修改数据库、表或列的字符集设置。...

    深入UTF8字符编码.doc

    总结,UTF-8字符编码在Windows、文本工具、Java和数据库中的应用需要全面理解和掌握,因为这些地方都可能遇到编码问题。理解并正确配置这些环境的字符编码,是确保数据完整性和跨平台兼容性的关键。在开发和日常使用...

    mysql保存微信昵称特殊字符的方法

    总之,为了在MySQL中成功保存微信昵称中的特殊字符,必须使用`utf8mb4`字符集,同时调整数据库配置、表结构以及应用程序代码。这将确保所有4字节Unicode字符,包括常见的表情符号,都能被正确地存储和处理。

    精通MySQL字符集与校对集

    ### 精通MySQL字符集与校对集 在MySQL中,正确地管理和配置字符集与校对集对于确保数据的正确性和一致性至关重要。...在实际应用中,应根据具体需求选择合适的字符集和校对集,并确保在各个层级保持一致性。

    MySQL数据库驱动及连接字符串

    在使用MySQL与应用程序交互时,驱动程序和连接字符串是两个关键组件。 MySQL驱动是编程语言与MySQL数据库之间沟通的桥梁,它允许你的应用程序执行SQL查询、管理数据等操作。不同的编程语言有不同的MySQL驱动,例如...

    MySql中文编码问题

    然而,确保整个系统(如Apache Tomcat、JSP应用等)的字符集设置与MySQL保持一致也很关键,避免在数据传输过程中出现乱码。在开发和部署过程中,应始终关注字符集的兼容性,确保数据的正确存储和显示。

    深入UTF8字符编码

    总的来说,深入理解UTF-8字符编码不仅包括其编码规则,如单字节、双字节和多字节序列,还包括如何在不同的操作系统、应用程序和开发环境中正确使用和转换UTF-8编码。这对于解决字符显示问题、保证数据的完整性和兼容...

Global site tag (gtag.js) - Google Analytics