簡體   English   中英

使用utf8mb4與PHP和MySQL

[英]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");
  • utf-32:這是一個使用每個字符固定4個字節的字符編碼
  • utf-8:這是一個字符編碼,每個字符最多使用4個字節,但最常用的字符只能編碼1,2或3個字符。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM