2015-12-02 58 views
0

我正在將使用PHPExcel的電子表格轉換爲數據庫,並且單元格值恰好包含俄語。如果我運行mb_detect_encoding()我被告知文本是UTF8,如果我設置了UTF8的頭文件,那麼我會看到正確的俄文字符。包含俄語的批量插入字符串

但是如果我把它編譯成一個字符串(只參與過程和addslashes),並插入到表中我看到很多????的。我將表格字符集設置爲utf8mb4,並將排序規則設置爲utf8mb4_general_ci。我也運行$ this-> db-> query(「SET NAMES'utf8mb4'」);在我的數據庫連接上。

我運行PDO查詢()與我的多部插入,並獲得???秒,但如果我輸出的查詢,篩選,我得到ПоÑ這將是有效的UTF8。爲什麼這不會被正確地存儲在數據庫中?

回答

0

我一直保留這個問題而不是刪除它,所以有人可能會發現答案有幫助。

我掙扎的原因是因爲在SQLyog的它不會告訴你該列字符集默認。有一個選項在Alter表格視圖中讀取「隱藏語言選項」,然後將顯示當SQLyog創建表時,它將使用默認服務器Charset,而不是您定義表Charset的內容。我不確定這是否正確 - 但解決方法只是打開列字符集設置並檢查它們是否符合您的預期。

0

По是變爲亂碼的По。可能...

  • 你在客戶端中的字節是正確編碼在utf8(好)。
  • 您與SET NAMES latin1(或set_charset('latin1')或...)連接,可能是默認情況下。 (它應該是utf8。)
  • 表中的列可能已經或可能不是CHARACTER SET utf8,但應該是這樣的。

問號暗示...

  • 您已經UTF8編碼的數據(好)
  • SET NAMES latin1已生效(默認,但錯)
  • 列被宣佈CHARACTER SET latin1(默認但錯誤)

幫助診斷問題的一種方法是運行

SELECT col, HEX(col) FROM tbl WHERE ... 

對於По,十六進制應該是D09FD0BE。每個西里爾字符在utf8中都是十六進制的D0xx