亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

執行 MySQL 查詢時,charset 如何影響 php?

執行 MySQL 查詢時,charset 如何影響 php?

PHP
MMTTMM 2022-01-24 10:40:26
我注意到在 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 utf8INSERT

該設置還聲明客戶端希望從SELECTs.

每個表CHARACTER SET中每一列上的可能是別的東西(例如,“latin1”)。如果是這樣,MySQL 將在傳輸過程中嘗試轉換編碼。

注意:MySQLCHARACTER SET utf8是眾所周知的UTF-8. 要獲得后者,請CHARACTER SET utf8mb4在表中和mysqli_set_charset($con,"utf8mb4");連接時使用。

展望未來,utf8mb4在大多數情況下是首選。

非文本內容(“原樣”)應放入BLOBVARBINARY列中——這會繞過對編碼的任何檢查。(想想 .jpg 或AES_ENCRYPT.)

MySQL 的MD5()函數返回一個十六進制字符串。 UNHEX(MD5('...'))返回二進制內容,并且必須存儲在例如BINARY(16)列中。

UTF-8 字符的麻煩中討論了許多形式的亂碼文本;我看到的不是我存儲的。


查看完整回答
反對 回復 2022-01-24
  • 1 回答
  • 0 關注
  • 152 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號