关于copy_and_convert
在对MySQL做业务压力测试的时候,我们在perf结果中发现 copy_and_convert 是一个耗费cpu的操作。这个函数的意思,就是在字符集之间做内容转换。
如果源和目标的字符集相同,就可以直接用memcpy,这显然比做字符集转换(按字节或字长拷贝更快,和节省cpu)
当整个系统是CPU瓶颈时,我们希望能够减少这种cpu消耗。
一次查询涉及的拷贝
如果我们执行一个简单的select语句,会涉及到两部分的内容:metadata和data。MySQL的返回包是能够“自解析”的,也就是说不仅有内容,还有描述信息。这些描述信息我们称为metadata。
在将这两部分信息返回给客户端的时候,就涉及到字符串拷贝,如果源字符集和目标字符集不同,就需要作转换。
字符集里面可以定义的部分
1、 表的字符集
比如我们创建如下的表
CREATE TABLE `t` (
`c` int(11) DEFAULT NULL,
`d` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
这就定义了这个表的字符集,要求存入数据按照gbk格式存储。在我们查询的时候,从表中读出的数据,就是我们上文说到的“源字符集”,在这里是gbk.
比如
Insert t values(2012, ‘南方很冷’);
2、连接字符集
在连接的时候我们可以在mysql客户端指定参数 mysql -default-character-set=gbk ,表示我们接收的内容希望是gbk编码,这个就是上文说的“目标字符集”。
一般我们会被建议:连接字符集和表字符集相同。
有的文章说防止乱码—-乱码倒是不会,实际的原因就是在内容拷贝时避免字符集转换计算。
本文要说的“但是”
但是即使这么做,在压力测试(或者你gdb)时,还是会发现会调用到 copy_and_convert。
原因有二:
首先,metadata部分,是固定的使用utf8,这个值可以从show variables like ‘character_set_system’;的结果看到,hardcode,配置无法修改。
其次,虽然我们定义表字符集是gbk, 但是整型字段是是Latin1存储,
#define my_charset_numeric my_charset_latin1,配置无法修改。
因此在我们上面的设置中,一次查询,在传回metadata的时候需要utf8->gbk, 返回结果中c这个字段需要latin1->gbk.
问题和建议
从上面分析知道,这存在的问题就是,无论用户怎么设置,都无法完全避免这种转换。
由于数字类型转成字符串后,使用什么字符集都占用一样的空间。
1) 在代码上最简单的修改可以如下:
将 #define my_charset_numeric my_charset_latin1 改成
#define my_charset_numeric my_charset_utf8_general_ci
这样跟metadata部分相同,然后建表和客户端都是使用utf-8。
2) 更灵活一点是把character_set_system改成可配置,然后整型存储按照用户定义的字符集。
分享到:
相关推荐
在IT领域,尤其是在数据库管理与应用中,字符集的设置...通过上述方法,可以有效避免和解决由字符集配置不当导致的乱码问题,确保MySQL中的数据能够被正确地存储、检索和展示,从而提高数据库系统的稳定性和用户体验。
MySQL 字符集查看和修改 MySQL 字符集是 MySQL 数据库中最重要的配置之一,它影响着数据库的字符存储和比较方式。本文将介绍如何查看和修改 MySQL 字符集。 查看 MySQL 字符集 要查看 MySQL 字符集,可以使用 ...
MySQL作为一款广泛使用的开源关系型数据库管理系统,在处理各种语言环境下的数据时,字符集和校对集的正确配置至关重要。本文旨在深入探讨MySQL中的字符集(Character Set)与校对集(Collation)的相关概念及其应用。 ...
MySQL的字符集支持主要涉及两个方面:**字符集(Character set)**和**排序方式(Collation)**。字符集定义了如何存储和表示不同的字符,而排序方式则决定了如何比较这些字符。 MySQL对字符集的支持非常细致,可以...
修改 MySQL 的字符集可以提高 MySQL 的性能和可靠性。在 Linux 系统下,我们可以通过编辑 `/etc/my.cnf` 文件来修改 MySQL 的字符集。同时,我们还需要了解 MySQL 中的多个变量,以便更好地优化 MySQL 的性能。
### MySQL字符集转换详解 #### 一、引言 在MySQL数据库管理中,字符集的正确设置至关重要。它直接影响到数据的存储与检索效果,尤其是对于...希望本文能够帮助读者更好地理解和掌握MySQL字符集转换的方法和技术要点。
以下将详细讲解MySQL字符集的概念、设置方法以及在实际应用中可能出现的问题和解决方案。 1. **字符集概念**: - **字符集(Character Set)**:是一系列字符的集合,例如ASCII、GBK、UTF-8等,定义了字符的编码...
“工具”标签可能是指用于处理字符集问题的一些实用工具,如`iconv`用于转换字符编码,或者MySQL自带的`mysql_client`和`mysql_convert_table_format`工具,它们可以帮助用户查看和修改数据库、表或列的字符集设置。...
在MySQL中,正确地管理和配置字符集与校对集对于确保数据的正确性和一致性至关重要。字符集主要用于定义如何存储和表示文本数据,而校对集则定义了如何比较这些文本数据。本篇文章将深入探讨MySQL中的字符集和校对集...
在MySQL数据库管理与维护的过程中,修改字符集是一个常见...通过以上步骤,你可以有效地解决MySQL中的字符集修改问题,确保数据的一致性和准确性。希望这些信息能帮助你在实际工作中更加高效地管理和维护MySQL数据库。
2. **更改表字符集**:如果发现表的字符集与系统默认不一致,可以使用`ALTER TABLE 表名 CONVERT TO CHARACTER SET GBK;`命令来更新表的字符集。 #### 四、注意事项 - 在进行上述操作时,确保已经备份了重要的数据...
### MySQL字符集与乱码问题解析 在MySQL数据库管理中,字符集的配置与使用是十分重要的环节之一,尤其在处理多语言环境的数据时更是如此。如果字符集配置不当,很容易导致数据插入、查询过程中出现乱码问题。本文将...
查看mysql字符集MySQL 乱码的根源是的 MySQL 字符
Mysql字符集编码详解 Mysql数据库中的字符集编码问题是许多开发者经常遇到的一个问题,特别是在JAVA项目中。解决这个问题需要从多方面入手,包括服务器、数据库、数据表和连接等四个层次。这篇文章将详细介绍如何...
本文将详细探讨“MySQL_MySQL字符集互转”这一主题,以及如何利用工具如"MSSQL2MySQLSync"进行数据库之间的转换与同步。 MySQL是一种广泛使用的开源关系型数据库管理系统,其支持多种字符集,包括UTF-8、GBK等。...
在MySQL数据库管理中,正确地理解和设置字符集对于数据的准确存储和检索至关重要。本文将深入探讨MySQL字符集的基础概念、设置方法以及如何在实际操作中进行字符集的转换。 #### 一、理解MySQL字符集与校对规则 **...
在 MySQL 中,有多个与字符集相关的系统变量,这些变量决定了数据在客户端和服务端之间的传输以及存储方式: 1. **`character_set_client`**:表示客户端向服务器发送 SQL 命令时所使用的字符集。 2. **`character_...
为了支持多语言或特定字符集的需求,如中文、日文等,配置MySQL字符集至关重要。UTF-8字符集是一种非常常见且兼容性极强的编码方式,它可以表示世界上几乎所有的文字。本教程将详细介绍如何在Linux环境下设置MySQL...
navicat_for_mysql_10.0.1_cn_linux.tar安装包 下载后copy到指定安装目录 ...[hcr@localhost navicat111_mysql_en]$ tar -zxvf navicat111_mysql_en.tar.gz [hcr@localhost navicat111_mysql_en]$ ./start_navicat
在MySQL中,字符集主要分为全局字符集、数据库字符集、表字符集和字段字符集四级。全局字符集是服务器级别的设置,影响所有数据库;数据库字符集在创建数据库时指定,适用于该数据库的所有表;表字符集用于单个表,...