mySQL4 1以上版本資料庫亂碼問題徹底研究

2021-04-07 01:36:49 字數 2845 閱讀 2081

看到不少使用者反映轉換完以後是亂碼的情況,出現這種現象的主要原因是這類使用者使用的都是mysql4.1以上的版本.下面作乙個說明,希望出現這個問題的朋友都能耐心的把這個文件看完!!!

原理注意:本文件只對mysql 4.1及以上的資料庫版本有效,之前的mysql版本,由於沒有提供對字符集的完整支援,因此也不存在此類問題。

mysql 4.1開始,對多語言的支援有了很大變化 (這導致了問題的出現)。儘管大部分的地方 (包括個人使用和主機提供商),mysql 3、4.0 仍然佔主導地位;但 mysql 4.1 是 mysql 官方推薦的資料庫,已經有主機提供商開始提供並將會越來越多;因為 latin1 在許多地方 (下邊會詳細描述具體是哪些地方) 作為預設的字符集,成功的蒙蔽了許多 php 程式的開發者和使用者,掩蓋了在中文等語言環境下會出現的問題。

mysql 4.1 對於字符集的指定可以細化到一台機器上安裝的 mysql,其中的乙個資料庫,其中的一張表,其中的一欄,應該用什麼字符集。但是,傳統的 web 程式在建立資料庫和資料表時並沒有使用那麼複雜的配置,它們用的是預設的配置,那麼,預設的配置從何而來呢?

編譯 mysql 時,指定了乙個預設的字符集,這個字符集是 latin1;

安裝 mysql 時,可以在配置檔案 (my.ini) 中指定乙個預設的的字符集,如果沒指定,這個值繼承自編譯時指定的;

啟動 mysqld 時,可以在命令列引數中指定乙個預設的的字符集,如果沒指定,這個值繼承自配置檔案中的;

此時 character_set_server 被設定為這個預設的字符集;

當建立乙個新的資料庫時,除非明確指定,這個資料庫的字符集被預設設定為 character_set_server;

當選定了乙個資料庫時,character_set_database 被設定為這個資料庫預設的字符集;

在這個資料庫裡建立一張表時,表預設的字符集被設定為 character_set_database,也就是這個資料庫預設的字符集;

當在表內設定一欄時,除非明確指定,否則此欄預設的字符集就是表預設的字符集;

這個字符集就是資料庫中實際儲存資料採用的字符集,mysqldump 出來的內容就是這個字符集下的;

想要進行「正確」的儲存和得到「正確」的結果,最方便的是在所有query開始之前執行一下:

set names 'gbk';

其中gbk是資料庫字符集。

常見問題解決方案

我的資料使用latin1或其他編碼儲存中文資訊,但phpmyadmin中中文為亂碼

這問題是由於新版本的phpmyadmin都是強制使用正確的字符集進行資料庫連線和顯示的,因此如果儲存內碼和實際內碼不一致,phpmyadmin是無法識別的。對於簡體中文,phpmyadmin可識別gbk/utf8;正體中文,可識別big5/utf8。如果你確定想使用這種「不正確」的字符集(事實上通常在mysql 4.1之前大家都是用「不正確」的字符集儲存資料的)儲存中文論壇資料,那麼請使用phpmyadmin 2.5.x的老版本,他會使用最老和最普通的方式連線資料庫,這樣便可以正常管理。

我的論壇原來使用discuz! 4.0.0 rc版本+mysql 4.1沒有問題,但公升級到正式版後就有了亂碼

瀏覽這問題前請您先看一下上乙個問題的解答,您的情況和上面的情況差不多。rc版本使用「最老和最普通的方式」連線資料庫,因此你如果使用「不正確」的字符集儲存,事實上是沒有問題的,但discuz! 4.0.0正式版使用了與phpmyadmin新版本相同的「正確」的資料庫字符集,因此導致原來「不正確」的儲存和「正確」的連線產生衝突,進而發生亂碼。

解決此類問題,有如下兩種方案:

更改儲存字符集

主要的思想就是把資料庫的字符集有latin1改為gbk,big5,或者utf8; 以下操作必須擁有主機許可權。假設當前操作的資料庫名為:database

匯出首先需要把資料導為mysql4.0的格式,具體的命令如下: mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > test.sql

--default-characte-set 以前資料庫的字符集,這個一般情況下都是latin1的,

--set-charset 匯出的資料的字符集,這個可以設定為gbk,utf8,或者big5

匯入首先使用下面語句新建乙個gbk字符集的資料庫(test)

create database `test` default character set gbk collate gbk_chinese_ci;

然後把剛才匯出的資料匯入到當前的資料庫中就ok了。

mysql -uroot -p --default-character-set=gbk -f testlatin1)

總結:折衷方案。資料使用「不正確」的內碼儲存,但顯示和使用能夠正常,phpmyadmin新版本亂碼,老版本可用。備份和恢復時候需要特別注意字符集問題。

應當如何公升級mysql 4.0的資料到mysql 4.1+中

如果資料檔案中有中文資訊,那麼將mysql 4.0的資料檔案,直接拷貝到mysql 4.1中就是不可以的,即便在my.ini中設定了default-character-set為正確的字符集。雖然貌似沒有問題,但mysql 4.1的字符集有一處非常惱人的地方,以gbk為例,原本mysql 4.0資料中varchar,char等長度都會變為原來的一半,這樣儲存中文容量不變,而英文的儲存容量就少了一半。這是直接拷貝資料檔案帶來的最大問題。

所以,公升級的根本,如果想使用「正確」的字符集,還是先用mysqldump匯出成檔案,然後匯入。

至於如果原來用的latin1,現在在mysql 4.1中還想繼續「錯誤的」使用latin1,那麼只需把default-character-set設定為latin1,並且在論壇中更改連線方式即可,這樣的情況是可以直接拷貝資料檔案的。

mySQL4 1以上版本資料庫亂碼問題徹底研究

看到不少使用者反映轉換完以後是亂碼的情況,出現這種現象的主要原因是這類使用者使用的都是mysql4.1以上的版本.下面作乙個說明,希望出現這個問題的朋友都能耐心的把這個文件看完 原理注意 本文件只對mysql 4.1及以上的資料庫版本有效,之前的mysql版本,由於沒有提供對字符集的完整支援,因此也...

版本資料庫 未來方向

我想很快發布sirixdb 1 的1.0.0版本,但是卻缺少乙個開放源 社群,我想在這裡討論您認為對未來發展方向最重要的內容。為了簡短起見,sirixdb通過巨大的完全基於寫時複製的索引嘗試結構將資料庫中每個資源的歷史記錄保留下來。這意味著它在修訂版之間共享未更改的資料庫頁面。sirixdb允許進行...

MySQL5 7版本資料庫安裝

python開發者使用mysql資料庫5.5 版本以上 diango2.0之後放棄mysql5,5之前的支援 在mysql版本當中5.7之前的版本都有.exe或者.msi的可執行安裝檔案,但是到5.7版本只有zip壓縮包安裝方法。mysql官網 2.編寫安裝配置檔案配置檔案 在5.7之前有自帶,後來...