我能做些什么来确保复制将使用 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 终端的主机上再次使用 utf-8 在从机上执行“INSERT INTO test VALUES ('æøå')”我得到:
+------------+
| test |
+------------+
| æøà |
+------------+
如果我的结论是正确的,我所有的复制数据都被转换为 utf8(如果是 utf8,它被视为 latin1 并转换为 utf8),而表中的所有旧数据,正如 CREATE TABLE 建议的那样,都是 latin1。如果不是因为遗留应用程序依赖它是 latin1 的事实,我很乐意将它全部转换为 utf-8,所以我需要在它们仍然存在时将它保留在 latin1 中。
我该怎么做才能确保复制读取 latin1,将其视为 latin1 并将其作为 latin1 写入从属设备?
干杯
尼克