2013-10-15 26 views
0

我遇到一些特殊字符的問題。當一個人試圖利用例如字母「O」,我得到這個錯誤信息在我的網站上註冊:我應該使用什麼character_set和table collat​​ion?

1366 - Incorrect string value: '\xF6m' for column 'username' at row 1 

insert into phpbb3_users (username, username_clean, user_password) values ('Ström', 'Ström', '$H$9iK6K37VoHM//') 

我理解字符設置可能是問題,當我檢查數據庫,我可以看到一些表具有歸類:

latin1_swedish_ci 

和一些表具有核對(例如,其具有在上面的例子中的問題的表「phpbb3_users」):

utf8_bin 

和W母雞我檢查我的MySQL設置我看到,我有這些混合設置:

| 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 
  1. 你建議我什麼CHARACTER_SET使用?我已經知道將character_set更改爲utf8mb4可以解決問題,但我的MySql版本(5.1.4)是否支持?
  2. 我應該改變character_set嗎?在/etc/my.cnf的所有實例和所有表格歸類中?

謝謝。

+0

無處不在使用utf8。表,MySQL連接,PHP代碼,MIME類型等等。 – h2ooooooo

回答

2

您需要:

  1. 設置的字符集的(或表/數據庫/服務器的下一個更高的默認字符集),以支持您想要的字符的字符集儲藏。如果你想存儲「ö」,latin1會做。如果你想存儲更多「異國情調」的字符,utf8是一個不錯的選擇,因爲它支持幾乎所有的東西。*
    請注意,排序latin1_swedish_ci幾乎是不相關的。排序依據您選擇的字符集,但字符集首先是最重要的輸入變量。
  2. 連接字符集設置爲要發送文本的字符集。如果要將UTF-8編碼的文本發送到數據庫,則需要通過將連接字符集設置爲utf8 。這很可能是您的問題所在。如何設置取決於你如何連接到數據庫。 mysql_set_charset,您的DSN連接字符串中的charset參數或SET NAMES utf8查詢都會執行。在編碼編碼
  3. 發送文本您在步驟2

*宣佈MySQL的utf8不是「真正的」 UTF-8,只支持所有Unicode的一個子集。 utf8mb4是「真正的」UTF-8,支持一切。在MySQL 5.1上不可用utf8mb4,只有5.5+。

欲瞭解更多信息,請參閱UTF-8 all the way throughHandling Unicode Front To Back In A Web AppWhat Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

+0

謝謝! ** 1。**這是否意味着我應該更新MySQL設置爲: '| character_set_client | ** utf8 ** | | character_set_connection | ** utf8 ** | | character_set_database | ** utf8 ** | | character_set_filesystem |二進制| | character_set_results | ** utf8 ** | | character_set_server | ** utf8 ** | | character_set_system | utf8 | | collat​​ion_connection | ** utf8 ** | | collat​​ion_database | ** utf8 ** | | collat​​ion_server | ** utf8 **' ** 2。**是否應該將phpMyAdmin中的所有表和列整理從latin1_swedish_ci更新爲utf8_bin?不要以爲utf8存在那裏。 – Carl

+0

1.您不需要將所有這些設置爲'utf8',所有這些設置都有他們獨立使用的地方。重要的是,*連接編碼參數*的設置是正確的,您最好在客戶端API中進行設置(在PHP中,使用您選擇的數據庫適配器中使用的任何方法)。如果您有興趣,請查閱手冊中的設置。 2.如果你想存儲'utf8',你的列需要是'utf8',是的。如果'latin1'可以,那也沒關係。這取決於您和您希望存儲哪種文本。 – deceze

+0

** 1。**我決定使用'utf8',我將列更新爲'utf8_bin'(因爲'utf8'在我的表中不存在)。我希望這是正確的? ** 2。**你寫過「重要的是連接編碼參數設置正確」。我的MySQl的哪些設置是「連接編碼參數」?或者,最好將它們全部更改爲'utf8'?謝謝你幫助我。 – Carl

相關問題