2015-06-29 29 views
0

當我將某些字符保存到我的MariaDB數據庫中時,它們將以2至4個字符的字符串形式存儲。例如,作爲â„¢被保存在數據庫中。保存字符集和發送數據時使用UTF8保存奇怪字符的數據庫

從HTML頁面中包含我

<meta charset="utf-8"> 

形式head當我檢查發送到服務器的頭,它顯示

Content-Type:text/html; charset=UTF-8 

的PHP文件處理表單數據有

$mysqli->set_charset('utf8'); 

我已經將數據庫和錶轉換爲UTF8,這樣做:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

檢查中INFORMATION_SCHEMA表的數據庫和表的詳細信息,我可以看到數據庫和表的字符集是UTF8和默認排序規則名稱utf8_general_ci

但是錯誤編碼的字符是仍然被保存到數據庫。

我正在查看與終端的表數據,所以應該沒有問題與查看方的編碼。

我還缺少什麼?

== ==編輯

在迴應@裏克的評論 - SHOW CREATE TABLE search_templates;

search_templates | CREATE TABLE `search_templates` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `modified` timestamp NULL DEFAULT NULL, 
    `template` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `space` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `secure` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

SELECT title, HEX(title) FROM search_templates WHERE id = 25;

+-----------------------+--------------------------------------------+ 
| title     | HEX(title)         | 
+-----------------------+--------------------------------------------+ 
| Kiddicare abc â„¢  | 4B69646469636172652061626320C3A2E2809EC2A2 | 
+-----------------------+--------------------------------------------+ 

當至十六進制到文本轉換器通過它顯示:Kiddicare abc â„¢

所以這些字符被這樣保存到數據庫,這是否使問題更清楚?

== ==編輯

在建議從@rick(與新加入的數據,如前面標題欄得到了擦拭):

SELECT title, CONVERT(BINARY(CONVERT(CONVERT(UNHEX(title) USING utf8) USING latin1)) USING utf8) FROM search_templates LIMIT 3; 

- >

+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ 
| title                   | CONVERT(BINARY(CONVERT(CONVERT(UNHEX(title) USING utf8) USING latin1)) USING utf8) | 
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ 
| Kids' Games & Toys » Toy Shop » Toys R Us         | NULL                    | 
| Kiddicare - Pushchairs | Prams | Car Seats | Baby Equipment | Online Baby Shop | NULL                    | 
| Kiddicare â„¢                 | NULL                    | 
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ 
+0

爲了達到它的底部:'SHOW CREATE TABLE'和'SELECT col,HEX(col)FROM table where ...' –

+0

更新了我的問題 - 至少我現在知道它正在轉換之前被保存到數據庫,但我還沒有確保在進入數據庫之前將所有內容都設置爲UTF8? – Fisu

+0

哦,如果你可以重新添加數據,那麼讓我們看看如何在所有步驟中成爲「utf8」。開始學習http://stackoverflow.com/questions/279170/utf-8-all-the-way-through/279279#279279 –

回答

0
CONVERT(BINARY(CONVERT(
    CONVERT(UNHEX('C3A2E2809EC2A2') USING utf8) 
    USING latin1)) USING utf8) ==> '™' 

您在該字符串的末尾有一個「雙編碼」商標。

這是

Updating data in MySQL database after inserting in the wrong encoding

重複編輯

在上下文中,避免了最內層UNHEX;做

CONVERT(BINARY(CONVERT(
    CONVERT(title USING utf8) 
    USING latin1)) USING utf8) 

CONVERT(BINARY(CONVERT(
    CONVERT('Kiddicare â„¢' USING utf8) 
    USING latin1)) USING utf8) 
--> Kiddicare ™ 

但是,如果可以重新加載數據並且如果數據是UTF8編碼(它似乎不是),則具有UTF8所有的通過方式是'正確的解決方案'。

+0

所以將完整的代碼轉換列是'UPDATE search_templates SET title = CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C3A2E2809EC2A2')USING utf8)using the latin1))USING utf8)==>'™';'as這是拋出一個錯誤。我認爲這會轉換任何未來的符號,但其他符號會被放入數據庫中。我如何確保他們不會被炒到? – Fisu

+0

No. UPDATE search_templates SET title = CONVERT(CONVERT(CONVERT(UNHEX(title)USING utf8)USING utf8);'但是在應用到整個表之前先對其進行測試。 –

+0

清空整個「標題」列。 – Fisu

相關問題