[英]PHP/mysql site using utf8mb4 won't retrieve emojis correctly from database, despite utf8mb4 being specified everywhere that I can find to put it
[英]Using utf8mb4 with php and mysql
我已經讀過如果你對某個表/列使用編碼utf8mb4 ,mysql> = 5.5.3完全支持每個可能的字符http://mathiasbynens.be/notes/mysql-utf8mb4
看起來不錯。 只有我注意到php中的mb_functions沒有! 我無法在列表中找到它: http : //php.net/manual/en/mbstring.supported-encodings.php
我不僅讀了東西,還做了一個測試。
我使用php腳本將數據添加到mysql utf8mb4表,其中內部編碼設置為UTF-8: mb_internal_encoding("UTF-8");
並且,正如預期的那樣,數據庫中的字符看起來很亂。
知道我怎么能讓php和mysql談論相同的編碼(可能是一個4字節的編碼),並且仍然可以完全支持任何世界語言?
為什么utf8mb4與utf32不同?
MySQL的utf8
編碼不是真正的UTF-8。 它的編碼有點像UTF-8,但只支持UTF-8支持的子集。 utf8mb4
是實際的 UTF-8。 這種差異是MySQL的內部實現細節 。 兩者在PHP方面看起來都像UTF-8。 無論您使用utf8
還是utf8mb4
,PHP都會在兩種情況下獲得有效的UTF-8。
您需要確保PHP和MySQL之間的連接編碼設置為utf8mb4
。 如果設置為utf8
,MySQL將不支持所有字符。 您可以使用mysql_set_charset()
,PDO charset
DSN連接參數或任何其他適合您所選數據庫API的方法來設置此連接編碼。
mb_internal_encoding
只設置所有mb_*
函數具有的$encoding
參數的默認值。 它與MySQL無關。
UTF-8和UTF-32在編碼字符方面有所不同。 UTF-8對一個字符使用至少 1個字節,最多使用4個字符.UTF-32 總是為每個字符使用4個字節。 UTF-16至少使用2個字節,最多使用4個字節。
由於其長度可變,UTF-8有一點開銷。 可以用UTF-16中的2個字節編碼的字符可以采用UTF-8中的3或4; 另一方面,UTF-16從不使用少於 2個字節。 如果您要存儲大量亞洲文本,UTF-16可能會使用較少的存儲空間。 如果您的大多數文本是英文/ ASCII,則UTF-8使用較少的存儲空間。 UTF-32始終使用最多的存儲空間。
這就是我使用的,並且使用歐元符號和轉換為json_encode失敗來解決我的問題。
php配置腳本(api等..)
header('Content-Type: text/html; charset=utf-8');
ini_set("default_charset", "UTF-8");
mb_internal_encoding("UTF-8");
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "UTF-8");
mysql表/或特定列
utf8mb4
mysql PDO連接
$dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';
(...你的聯系...)
在執行查詢之前(可能不需要):
$dbh->exec("set names utf8mb4");
MySQL的utf-8不支持超過3個字符編碼的字符,因此他們添加了utf-8mb4,這實際上是utf-8。
在運行實際查詢之前,請執行mysql_query('SET NAMES utf8mb4')
還要確保您的mysql服務器也配置為使用utf8mb4。 有關方法的更多信息,請參閱文章: https : //mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.