簡體   English   中英

使用PHP操縱MySQL的utf8mb4數據

[英]Manipulating utf8mb4 data from MySQL with PHP

這可能很簡單。 我發誓我一直在網上尋找答案而沒有找到答案。 由於我的特殊情況有點不典型,我終於決定在這里問。

我在MySQL中有一些表用於中文程序。 它需要能夠支持所有可能的漢字,包括沒有很好字體支持的稀有字符。 表中的示例單元格可能是這樣的:

東菄鶇䍶𠍀倲𩜍𢘐涷蝀凍鯟𢔅崠埬𧓕䰤

為了使其在數據庫中正常工作,我必須將編碼/校對設置為utf8mb4。 到現在為止還挺好。 不幸的是,當我將相同的字符串拉入PHP時,它將被打印為:

東菄鶇䍶?倲??涷蝀凍鯟?崠埬?䰤

我怎么能最終殺掉剩下的問號並讓它們顯示為unicode字形呢? 我已經在標簽中使用UTF8編碼並將其作為元標記獲得了php頁面。

為什么他們不能互相溝通? 我究竟做錯了什么?

我只是猜測你將表設置為utf8mb4 ,但你的連接編碼設置為utf8 你必須將它設置為utf8mb4 ,否則MySQL會將存儲的utf8mb4數據轉換為utf8 ,后者不能編碼“高”Unicode字符。 (是的,那是MySQL的特質。)

在原始MySQL連接上,它必須如下所示:

SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;

根據您從PHP(mysql,mysqli或PDO)連接到MySQL的方式,您必須根據客戶端的最佳方式進行調整。


要真正澄清(是的,為了簡單起見使用mysql_擴展,不要在家里這樣做):

mysql_connect(...);
mysql_select_db(...);
mysql_set_charset('utf8mb4');     // adapt to your mysql connector of choice

$r = mysql_query('SELECT * FROM `my_table`');

var_dump(mysql_fetch_assoc($r));  // data will be UTF8 encoded

只是為了添加@deceze的答案,我推薦一個配置良好的MySQL服務器(對我來說,在/etc/mysql/mysql.conf.d/mysqld.cnf )。 以下是確保您使用utfmb4的配置選項,雖然我建議您utfmb4檢查每個MySQL配置選項,但實際上令人生畏,有很多默認值非常不理想。

[client]

default-character-set           = utf8mb4

[mysql]

default_character_set           = utf8mb4

[mysqld]

init-connect                    = "SET NAMES utf8mb4"
character-set-client-handshake  = FALSE
character-set-server            = "utf8mb4"
collation-server                = "utf8mb4_unicode_ci"
autocommit                      = 1
block_encryption_mode           = "aes-256-cbc"

最后一個只是一個應該是默認的。 此外, init-connect處理不必每次都執行。 保持代碼清潔。 現在運行:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

您應該返回類似以下內容:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

看起來你已經這樣做了,但是明確定義表創建並沒有什么壞處:

CREATE TABLE `mysql_table` (
  `mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

希望這有助於某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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