本文介紹了UTF-8字符有問題;我看到的不是我存儲(chǔ)的內(nèi)容的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我嘗試使用UTF-8,但遇到了問題。
我嘗試了很多方法,以下是我得到的結(jié)果:
????
而不是亞洲字符。即使是歐洲文本,我也得到了Se?or
。
奇怪的胡言亂語(Mojibake?)例如Se?±or
或?–°?μa?–°é—?
。
黑色鉆石,如Se?或.
最后,我遇到了數(shù)據(jù)丟失或至少被截?cái)嗟那闆r:Se
forSe?or
。
即使我將文本放在外觀正確時(shí),它也無法正確地排序。
我做錯(cuò)了什么?我如何修復(fù)代碼?我是否可以恢復(fù)數(shù)據(jù),如果可以,如何恢復(fù)?
推薦答案
此問題困擾著此網(wǎng)站的參與者以及其他許多人。
您已經(jīng)列出了CHARACTER SET
故障的五個(gè)主要案例。
最佳實(shí)踐
接下來,最好使用CHARACTER SET utf8mb4
和COLLATION utf8mb4_unicode_520_ci
。(有較新版本的Unicode排序規(guī)則正在進(jìn)行中。)
utf8mb4
是utf8
的超集,因?yàn)樗幚淼氖?字節(jié)的UTF8代碼,這是Emoji和一些中文用戶需要的。
在MySQL之外,”UTF-8″是指所有大小的編碼,因此實(shí)際上與MySQL的utf8mb4
相同,而不是utf8
。
在下面的內(nèi)容中,我將嘗試使用這些拼寫和大寫來區(qū)分MySQL內(nèi)部和外部。
應(yīng)做的內(nèi)容概述
將您的編輯器等設(shè)置為UTF-8。
HTML表單的開頭應(yīng)類似<form accept-charset="UTF-8">
。
將您的字節(jié)編碼為UTF-8。
將UTF-8設(shè)置為客戶端中使用的編碼。
聲明列/表CHARACTER SET utf8mb4
(與SHOW CREATE TABLE
核對(duì)。)
<meta charset=UTF-8>
在HTML開頭
存儲(chǔ)的例程獲取當(dāng)前的字符集/排序規(guī)則。它們可能需要重建。
UTF-8 all the way through
More details for computer languages(及其后續(xù)章節(jié))
測(cè)試數(shù)據(jù)
不能使用工具或SELECT
查看數(shù)據(jù)。
太多這樣的客戶端,尤其是瀏覽器,試圖補(bǔ)償不正確的編碼,并向您顯示正確的文本,即使數(shù)據(jù)庫已損壞。
因此,選擇一個(gè)包含一些非英文文本的表和列,并執(zhí)行
SELECT col, HEX(col) FROM tbl WHERE ...
正確存儲(chǔ)的UTF-8的十六進(jìn)制將為
表示空格(任何語言):20
英文:4x
、5x
、6x
或7x
對(duì)于大多數(shù)西歐國(guó)家,重音字母應(yīng)為Cxyy
西里爾語、希伯來語和波斯語/阿拉伯語:Dxyy
亞洲大部分地區(qū):Exyyzz
表情符號(hào)和一些中文:F0yyzzww
More details
所見問題的具體原因和修復(fù)
截?cái)?/strong>文本(Se
用于Se?or
):
要存儲(chǔ)的字節(jié)未編碼為utf8mb4。解決此問題。
還要檢查閱讀過程中的連接是否為UTF-8。
黑色鉆石,帶問號(hào)(Se?or
表示Se?or
);
存在以下情況之一:
情況1(原始字節(jié)不是UTF-8):
要存儲(chǔ)的字節(jié)未編碼為UTF8。解決此問題。
INSERT
和SELECT
的連接(或SET NAMES
)不是utf8/utf8mb4。解決此問題。
另外,檢查數(shù)據(jù)庫中的列是否為CHARACTER SET utf8
(或utf8mb4)。
案例2(原始字節(jié)為UTF-8):
SELECT
的連接(或SET NAMES
)不是utf8/utf8mb4。解決此問題。
另外,檢查數(shù)據(jù)庫中的列是否為CHARACTER SET utf8
(或utf8mb4)。
僅當(dāng)瀏覽器設(shè)置為<meta charset=UTF-8>
時(shí)才會(huì)出現(xiàn)黑色菱形。
問號(hào)(普通問號(hào),不是黑色方塊)(Se?or
表示Se?or
):
要存儲(chǔ)的字節(jié)未編碼為utf8/utf8mb4。解決此問題。
數(shù)據(jù)庫中的列不是CHARACTER SET utf8
(或utf8mb4)。解決這個(gè)問題。(使用SHOW CREATE TABLE
。)
還要檢查閱讀過程中的連接是否為UTF-8。
Mojibake(Se?±or
forSe?or
):
(此討論也適用于雙重編碼,但不一定可見。)
要存儲(chǔ)的字節(jié)需要進(jìn)行UTF-8編碼。解決此問題。
INSERTing
和SELECTing
文本時(shí)的連接需要指定utf8或utf8mb4。解決此問題。
該列需要聲明為CHARACTER SET utf8
(或utf8mb4)。解決此問題。
HTML應(yīng)以<meta charset=UTF-8>
開頭。
如果數(shù)據(jù)看起來正確,但排序不正確,則
要么你選擇了錯(cuò)誤的校對(duì),
或者沒有符合您需要的排序規(guī)則,
或者您有雙重編碼。
重復(fù)編碼可以通過執(zhí)行上述SELECT .. HEX ..
進(jìn)行確認(rèn)。
é should come back C3A9, but instead shows C383C2A9
The Emoji