2017-10-05 91 views
0

MySql支持cyrilic字母表,我有一個奇怪的問題。數據庫從一開始就在utf8_unicode_ci中創建,但這些表不是。現在表格數據,如果提供cyrrilic看起來像這樣????????,如果我從UTF開始創建一個表是沒有問題的,但是如果我嘗試通過使用MySql數據庫將現有表更改爲UTF8

來更改現有表編碼
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

這是應該改變現有的數據或

ALTER TABLE Strategies 
    CHARACTER SET utf8, 
    COLLATE utf8_unicode_ci; 

這是應該改變未來的數據,這是行不通的。

我也改變my.cnf文件和

[mysqld] 
# 
#default-character-set=utf8 this one breaks mysql restart 
character-set-server=utf8 
skip-character-set-client-handshake 
collation-server=utf8_unicode_ci 
init-connect='SET NAMES utf8' 
init_connect='SET collation_connection = utf8_general_ci' 

添加如果我運行SHOW VARIABLES WHERE變量名LIKE 'character_set_%' 或變量名LIKE '歸類%';我得到:

enter image description here

我也直接在PHP我管理改爲UTF,它實際上表明該表是UTF但沒有任何反應現有?????????或未來的西里爾文輸入。

希望別人經歷過這類問題,對於任何幫助或建議都會非常有幫助。謝謝。

+0

您從information_schema獲得什麼... SELECT CHARACTER_SET_NAME,COLLATION_NAME。其中table_schema =''和table_name =''的列。 ? –

+0

問題中表格/列的* original *編碼是什麼? – Binarus

+0

它曾經是latin1_swedish_ci –

回答

0

如果一個表開始爲LATIN1 在已處理latin1編碼的字符,請使用ALTER TABLE ... CONVERT TO CHARACTER SET utf8(像你一樣)

轉換之前,先測試舊編碼做兩件事情:

SHOW CREATE TABLE ... -- to see that the columns say latin1 
SELECT HEX(col) ... -- to see what the encoding looks like: é should show E9 

我說「之前」,因爲可能會錯誤地將utf8塞進latin1中。 é應該顯示C3A9 - 這是「雙重編碼」。

也這樣做轉換:

SHOW CREATE TABLE ... -- to see that the columns say utf8 
SELECT HEX(col) ... -- to see what the encoding looks like; é should show C3A9 

C383C2A9將表明雙重編碼。一團糟。

,如果你連接爲rootinit-connectroot和任何其他SUPER用戶忽略不依賴於init-connect='SET NAMES utf8'

但是...你說你把西里爾文文本放到latin1列中?這是「不可能的」,因爲拉丁文1不能代表拉丁文西歐文字以外的任何其他文字。所以......你可能有「雙重編碼」。請參考Trouble with utf8。特別注意「問號」。

要修復雙重編碼,請參閱Fixes,然後選擇相應的情況。這個鏈接還說你應該應該已經完成(2步改變),而不是你做了什麼。

相關問題