MySQL复制中的字符集

时间:2010-06-15 08:20:27

标签: mysql utf-8 character-encoding replication iso-8859-1

如何确保复制使用latin1而不是utf-8?

我正在Linux系统上的MySQL 5.1.22服务器(主服务器)和FreeBSD系统上的MySQL 5.1.42服务器(从服务器)之间迁移。我的复制效果很好,但是当我的varchars中出现非ascii字符时,它们变得“怪异”。 Linux / MySQL-5.1.22显示以下字符集变量:

character_set_client=latin1
character_set_connection=latin1
character_set_database=latin1
character_set_filesystem=binary
character_set_results=latin1
character_set_server=latin1
character_set_system=utf8
character_sets_dir=/usr/share/mysql/charsets/
collation_connection=latin1_swedish_ci
collation_database=latin1_swedish_ci
collation_server=latin1_swedish_ci

FreeBSD显示

character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=binary
character_set_results=utf8
character_set_server=utf8
character_set_system=utf8
character_sets_dir=/usr/local/share/mysql/charsets/
collation_connection=utf8_general_ci
collation_database=utf8_general_ci
collation_server=utf8_general_ci

从MySQL CLI设置任何这些变量都没有效果,在my.cnf或命令行设置它们会使服务器无法启动。

当然,两个服务器都以相同的方式创建了相关的表,在这种情况下使用DEFAULT CHARSET = latin1。让我举个例子:

CREATE TABLE `test` (
  `test` varchar(5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

当我在主机上执行时,在Latin1终端中,“INSERT INTO test VALUES('æøå')”,当我从基于Latin1的终端选择它时,这将成为奴隶

+--------+
| test   |
+--------+
| æøå    |
+--------+

在复制从站上基于UTF-8的终端上,test包含:

+--------+
| test   |
+--------+
| æøå    |
+--------+

所以我的结论是它被转换为utf8,即使表定义是latin1。这是正确的结论吗?

当然,在主人的latin1终端上,它仍然说:

+------+
| test |
+------+
| æøå  | 
+------+

由于两个系统字符集都是utf-8,如果我将两个终端设置为utf-8并再次使用utf-8终端在主站上“INSERT INTO test VALUES('æøå')”,则在utf-8我得到了:

+------------+
| test       |
+------------+
| æøà     |
+------------+

如果我的结论是正确的,我的所有复制数据都会转换为utf8(如果是utf8,则将其视为latin1并转换为utf8),而表中的所有旧数据都是,如CREATE TABLE所示, latin1的。我喜欢将它全部转换为utf-8,如果它不是因为传统应用程序依赖于latin1这一事实,所以我需要将它保留在latin1中,而它们仍然存在。

我可以做些什么来确保复制读取latin1,将其视为latin1并将其作为latin1写入奴隶?

干杯

的Nik

2 个答案:

答案 0 :(得分:1)

支持全局character_set_%和collat​​ion%参数不同的服务器之间的复制。

http://dev.mysql.com/doc/refman/5.6/en/replication-features-charset.html

-- on both servers check the output of...
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collat%';

如果set& amp;排序规则不同,但在转换集/排序规则期间可能会导致不同的排序顺序和字符丢失。如果使用基于语句的复制,排序顺序可能会影响插入/更新等事项。

您最好配置新服务器以使用与旧服务器相同的集和排序规则。这将确保复制正常工作。您还要确保数据库,表和列在主服务器和从服务器之间具有相同的排序规则。迁移到新服务器后,您可以修改set&使用percona工具包中的5.6在线模式更改或pt-online-schema更改等工具进行整理。

我还建议运行percona的pt-table-checksum,以确保您的表在复制或初始导出/导入过程中没有分歧。

请点击此处了解有关差异影响的更多信息:

对于使用Amazon RDS的任何人,请记住默认的mysql 5.6设置使用混合utf8(mb3)和latin1(用于服务器和数据库)。如果从非RDS复制到RDS(匹配源/目标服务器),则应覆盖具有自定义参数组的那些。

答案 1 :(得分:0)

通常,您必须在从属服务器上使用完全相同的配置文件和mysql版本(在升级/迁移方案期间除外,以及在诸如server_id之类的从服务器上需要进行一些不同的操作)。

您需要编写数据库设置脚本,以便数据库服务器成为软件部署的一部分。所有数据库服务器(包括非生产环境中的服务器)都必须使用完全相同的配置。

无法同步配置将导致意外错误。

我不知道为什么你觉得需要在不同的服务器上运行不同的操作系统,但是如果你这样做,那么你的Ops工作人员的生活会更加艰难。