【发布时间】:2011-03-03 21:08:48
【问题描述】:
如何确保复制将使用 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
当我在 master 上做时,在 Latin1 终端中,“INSERT INTO test VALUES ('æøå')”,当我从基于 Latin1 的终端中选择它时,这变成了奴隶
+--------+
| test |
+--------+
| æøå |
+--------+
在复制从属设备上基于 UTF-8 的终端上,测试包含:
+--------+
| test |
+--------+
| æøå |
+--------+
所以我的结论是转换为utf8,即使表定义是latin1。这是一个正确的结论吗?
当然,在 master 上,在一个 latin1 终端上,它仍然说:
+------+
| test |
+------+
| æøå |
+------+
由于两个系统字符集都是 utf-8,如果我将两个终端都设置为 utf-8 并在使用 utf-8 终端的主设备上再次执行“INSERT INTO test VALUES ('æøå')”,在从设备上使用utf-8 我得到:
+------------+
| test |
+------------+
| æøà |
+------------+
如果我的结论是正确的,我所有复制的数据都被转换为utf8(如果是utf8,它被视为latin1并转换为utf8),而表中的所有旧数据,正如CREATE TABLE所暗示的那样,拉丁语1。如果不是因为遗留应用程序依赖它是 latin1 的事实,我很乐意将它全部转换为 utf-8,所以我需要在它们仍然存在时将其保留在 latin1 中。
如何确保复制读取 latin1、将其视为 latin1 并将其作为 latin1 写入从属设备?
干杯
尼克
【问题讨论】:
标签: mysql utf-8 character-encoding replication iso-8859-1