這個問題似乎是$mysqli->set_charset()
不接受`utf8mb4' 作爲一個有效的編碼(在第一更新正如我‘猜測’)。 MySQL版本是5.5.41,PHP版本是5.4.41(沒有問題)。
很抱歉的標題,我一直在尋找/讀什麼/問題在那裏可以和我已經太糊塗了這個...
我使用utf8mb4最近開始在MySQL 。我使用utf8mb4作爲字符集和utf8mb4_unicode_ci作爲所有表/列的歸類。
所以我第一次我改變:
$mysqli->set_charset('utf8');
到
$mysqli->set_charset('utf8mb4');
確信我的PHP文件是UTF8(我使用Visual Studio代碼以便文件在UTF-8中創建默認情況下),和PHP/HTML頭被設置爲UTF-8:
的index.php
header('Content-type: Text/HTML; Charset=UTF-8');
main.php(包括在index.php的結束時)
<meta http-equiv="Content-Type" content="Text/HTML" />
<meta charset="UTF-8" />
的問題是,對於一些表我必須手動插入數據,並且該數據被存儲爲是:與特殊字符,與口音,ñ等...當我在我的網站顯示這些數據,我可以看到這些字符�
已經取代了特殊/重音字符。
所以我的問題是:有沒有辦法在mysql中存儲數據(無需替換/轉換特殊/重音字符),並能夠正常顯示它?
如果我恢復到$mysqli->set_charset('utf8');
數據顯示罰款......所以這讓我不知道,應該有與存儲UTF-8字符,因爲它們並有一些編纂問題的地方沒有問題... ...
我使用sqlyog社區(與葡萄酒)和我讀了一些地方,有時gui不能正常工作,當你改變一些數據庫/表配置和唯一的方法是舊的方式(運行自己的查詢),但我didn我還沒試過,但是。我運行查詢來設置所有表/列的字符集和排序規則。
您認爲如何?
UPDATE
我開始認爲的mysqli不接受utf8mb4爲有效的字符編碼,並從PHP使用UTF-8,而不是來自MySQL的...我也覺得mysql的fckd了創建utf8mb4代替更新現有的utf8以支持4個字節....
因爲我使用mysqli字符集utf8進行測試,所有東西都按原樣存儲並顯示(mysql字符集和排序規則設置爲utf8mb4 ...)。
更新2
SELECT name, HEX(name) FROM person LIMIT 1
這就是它輸出:
New Person has name Altaïr 416C7461C3AF72
但正如我已經說過,這是使用:
$mysqli->set_charset('utf8');
插入和選擇。如果我使用utf8mb4而不是這是它存儲的內容:
Altaïr
但它顯示正常。它沒有顯示好的是,如果名稱按原樣存儲,則顯示的名稱將是Alta�r
。
所以問題是:爲什麼mysqli/mysql存儲ï
爲ï
使用utf8mb4?爲什麼當utf8mb4設置爲mysqli時,php顯示特殊字符ï
爲�
?
有人可以確認mysqli::set_charset
接受utf8mb4作爲一個有效的編碼嗎?
UPDATE 3
我有一個類函數,其選擇從表中的字符串「ES」,例如:Iniciar Sesión
(這是什麼存儲),並且如果mysqli的字符集是UTF8,正被選擇什麼/顯示爲Iniciar Sesión
。
這可能是一個完全不同的問題,但它顯然是另一個編碼問題。根據我的理解,如果表/列是utf8mb4並且mysqli設置爲utf8,則mysql必須從utf8(3字節)到ut8mb4(全字節支持)進行編碼。所以這意味着mysqli
不使用來自php的utf8,而是使用mysql。這是正確的,對嗎?
我的應用程序,目前有一個粗略的時間與編碼...(但也許是一些服務器的配置問題...)
UPDATE 4
問題就在這裏?我真的沒有關於這種配置的思路:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
UPDATE 4-1/2(從評論複製)
CREATE TABLE es` (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
text varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY name (name)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`
沒有轉換?你的意思是BLOB?處理UTF8的經驗法則是:總是記錄轉換+編碼+解碼方法。 – mootmoot
什麼是BLOB?我認爲php爲我處理...如果PHP使用utf8並從MySQL中獲取utf8mb4,需要什麼樣的轉換? –
BLOB是一種MySQL數據類型,通常用於存儲大量的文本或二進制數據。看到這裏http://dev.mysql.com/doc/refman/5.7/en/blob.html。 – Vadim