2015-04-02 74 views
0

我的UTF8使用Windows軟件連接數據庫並查看數據時看起來數據看起來很糟糕。 雖然我的PHP腳本功能雖然很好(包括閱讀和寫作)。UTF8 character_set_server和DataTables插件

我已經嘗試過我的本地主機上的腳本,一切都很好,從客戶端查看時也很好。但在共享主機服務器上的事情是不同的。

從我所知,唯一的區別是被character_set_server是latin1,而我的本地服務器上的utf8

 
| character_set_client  | utf8         | 
| character_set_connection | utf8         | 
| character_set_database | utf8         | 
| character_set_filesystem | binary         | 
| character_set_results | utf8         | 
| character_set_server  | latin1         | 
| character_set_system  | utf8         | 
| character_sets_dir  | /usr/share/mysql/charsets/    | 

我可以排序的通過發出SET NAMES UTF8其正確地對數據進行編碼到解決這個問題服務器。

但這樣做會導致DataTables Jquery插件無法顯示該字段。根據作者,它不會顯示一個字段,如果其格式不正確UTF8

怎麼回事?如果我沒有root訪問權限來更改服務器的設置,我可以解決這個問題嗎?

+0

首先,讓我們來判斷數據是在_input_上還是在_output_上被損壞。請提供'SELECT col,HEX(col)...'的輸出,從某個表中讀取一些破損的列。 – 2015-04-02 22:37:00

+0

@Rick James價值「25英鎊」的HEX = C382C2A33235。 – PapaLazarou 2015-04-02 23:14:04

回答

0

鑑於£25被存儲爲十六進制C382 C2A3 32 35,您有「雙編碼」問題,我在my blog討論。

很可能發生了什麼事情是,當你插入它時,你有用utf8編碼的£25(十六進制:C2A3 32 35; 32 35是'25')。但是你宣稱客戶端正在使用latin1。 (這是許多情況下的默認設置,但這裏是錯誤的。)同時,您的專欄聲明爲CHARACTER SET utf8。 (檢查點:我的分析聽起來是否正確?)

因此,MySQL信任你所說的並將C2 A3 32 35轉換爲如同latin1一樣轉換爲utf8。 latin1 C2成爲utf8 C382和latin1 A3成爲utf8 C2A3。 (該25沒有改變;編碼在兩個字符集相同。)

如果與客戶端讀取它錯誤地宣佈latin1的,這些步驟將被扭轉,而你不會知道什麼是錯誤。但是,顯然,您的第二個客戶的聲明是不同的。 (檢查點:這聽起來是否正確?)

您應該修復錯誤地插入內容的客戶端,並且應該修復數據。這是兩個獨立的任務,應該基本同時完成。博客解釋了它,但可能不容易梳理出來。你現在想做什麼?

+0

是的,我認爲你的雙重編碼點的權利。在我的第二個客戶端上,我通過更改my.ini配置文件手動將服務器設置爲處理UTF8。那麼如何解決這個有問題的服務器?我只有3條記錄需要UTF8,因此可以手動更改它們。我是否需要更改表格或發出命令PHP命令來修復後續的插入/更新?我記得當我做正確的事情,並得到C2A33235數據表的HEX值拒絕顯示字段內容(無效的UTF8數據)。 – PapaLazarou 2015-04-03 00:33:20

+0

手動更新行可能是最簡單和最安全的。你知道他們應該說什麼,並且這些字符串是可管理的大小嗎? – 2015-04-03 01:57:57

+0

那麼我確實玩過數據庫,我得到了正確的值,例如£25 = C2A33235對不對?但是當它像這個Datatables不顯示任何字段時,它似乎只有Double編碼字段。如果我能改變character_set_server,我想我可以解決這個問題。 – PapaLazarou 2015-04-03 23:53:52