如何確保複製將使用latin1而不是utf-8?MySQL複製中的字符集
我在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測試VALUES(‘æøå’)」,這成爲對奴隸,當我從選擇它基於Latin1的終端
+--------+
| test |
+--------+
| æøå |
+--------+
上的複製從一個UTF-8的終端,測試包含:
+--------+
| test |
+--------+
| æøå |
+--------+
所以我的結論是,它被轉化爲utf8,即使表的定義是拉丁語1。這是一個正確的結論嗎?
當然,在主,在latin1的終端,還在說:
+------+
| test |
+------+
| æøå |
+------+
因爲這兩個系統的字符集是UTF-8,如果我設置兩端爲UTF-8並再次執行「 INSERT INTO測試VALUES(「æøå」)」上用UTF-8終端的主,在使用UTF-8我得到的奴隸:
+------------+
| test |
+------------+
| æøà |
+------------+
如果我的結論是正確的,我所有的複製數據被轉換成utf8(如果它是utf8,它將被視爲latin1並轉換爲utf8),而表中的所有舊數據,如CRE ATE TABLE建議,latin1。如果不是因爲遺留應用程序依賴於latin1,我很想將其全部轉換爲utf-8,所以我需要在latin1中保留它,但它們仍然存在。
我該怎麼做才能確保複製讀取latin1,將其視爲latin1並將其作爲latin1寫入從站?
乾杯
聶