我注意到在 PHP 中進行數據庫查詢時(例如 Zend_db、mysqli...),您可以設置字符集。例如:mysqli_set_charset($con,"utf8"); 對于這在幕后的實際作用,我有點模糊。如果我使用 php 進行數據庫 SELECT 查詢,并且我指定了一個字符集,如果它與數據庫中定義的列不同的字符集會發生什么?我的意思是,數據庫返回一個二進制序列,但是如果兩個字符集中的字符編碼不同,實際返回的是什么?mySQL 會獲取內部二進制數據并“按原樣”返回嗎?或者 MySQL 是否會嘗試將其轉換為與您指定的字符集中等效的二進制序列?我想我的問題的要點是,我想知道當 PHP 在查詢中發送時數據是如何編碼的,它是如何從 MySQL 傳回的,以及 PHP 將其取回并將其存儲到后是否還有另一個翻譯步驟PHP 內存中的字符串。同樣,如果您正在執行 INSERT 或更新,它是如何從 PHP 發送到 MySQL 的?PHP 是否將其轉換為正確的二進制編碼然后將其發送到 MySQL?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 更新:感謝雷蒙德·奈蘭德。我能夠修復我的錯誤。但我確實注意到,對于非標準字符,字符集似乎很重要。我使用 $db = new \PDO("mysql:host=$host;dbname=$database;charset=latin1", $dbuser, $dbpassword); 做了一個選擇語句。首先,我嘗試了 latin1,然后我嘗試了 utf8。我的問題是我有一個包含加密數據的列,我猜其中有一些奇怪的字符。如果我直接在數據庫查詢中對該字段執行 md5,它給了我一個以 889 開頭的編碼......但是,我試圖用 SELECT 語句將它拉入 PHP。如果我使用帶有 latin1 字符集的 PDO,然后在 PHP 中執行 MD5(),它會給我相同的哈希值 (889...)。這意味著 PHP 擁有數據庫中二進制文件的精確副本。但是如果我確實使用了帶有字符集“UTF-8”的 PDO,然后在 PHP 中做了一個 MD5(),它給了我一個以 087 開頭的哈希......所以在某個地方,必須進行轉換。至此,我的原始錯誤已修復,但我仍然對正在發生的事情感到好奇。MYSQL 是在將其返回給 PHP 之前進行轉換,還是 PDO 在 PHP 端進行某種轉換?
1 回答

Helenr
TA貢獻1780條經驗 獲得超4個贊
mysqli_set_charset($con,"utf8");
(或其他客戶端庫的其他代碼)向 MySQL 聲明客戶端中的編碼將是MySQL 的. 如果將不同編碼的字節發送到(想想)mysql,就會發生垃圾或錯誤。CHARACTER SET utf8
INSERT
該設置還聲明客戶端希望從SELECTs
.
每個表CHARACTER SET
中每一列上的可能是別的東西(例如,“latin1”)。如果是這樣,MySQL 將在傳輸過程中嘗試轉換編碼。
注意:MySQLCHARACTER SET utf8
是眾所周知的UTF-8
. 要獲得后者,請CHARACTER SET utf8mb4
在表中和mysqli_set_charset($con,"utf8mb4");
連接時使用。
展望未來,utf8mb4
在大多數情況下是首選。
非文本內容(“原樣”)應放入BLOB
或VARBINARY
列中——這會繞過對編碼的任何檢查。(想想 .jpg 或AES_ENCRYPT
.)
MySQL 的MD5()
函數返回一個十六進制字符串。 UNHEX(MD5('...'))
返回二進制內容,并且必須存儲在例如BINARY(16)
列中。
UTF-8 字符的麻煩中討論了許多形式的亂碼文本;我看到的不是我存儲的。
- 1 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消