簡體   English   中英

使用PHP 5.5 UTF-8問題將更新插入MYSQL

[英]Insert Update to MYSQL with PHP 5.5 UTF-8 issues

我無法理解什么是問題。 我用php和utf-8問題將數據寫入mysql

用HTML形式寫Binəqədir。 Çiçəkqəs

Writed數據庫Bin?q?di r。 ÃÆ'Æ•••â€

當我使用mysqli_set_charset($conn,"utf8"); 插入更新查詢中

Writed數據庫Bin?q?di r。 中投?KQ?的

手動將數據直接寫入數據庫並使用mysqli_set_charset($conn,"utf8"); 選擇工作正常。

我該如何解決? 使用UTF-8進行INSERTUPDATE 這是我的插入代碼

public function insert($sql) {
    $conn = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    mysqli_set_charset($conn,"utf8");
//  $conn->set_charset("utf8"); use same this.
    if ($conn->query($sql) === TRUE) {
        return 1;
    } else {
        return 0;
    }
    $conn->close();
}

注意:此問題在Linux和OSX上。 在windows工作的商品。 我如何修復它為Linux托管?

嘗試

AddDefaultCharset utf-8

在你的apache配置中

或者在你的php文件中使用

header( 'content-type: text/html; charset=utf-8' );

並嘗試

default_charset = "utf-8";

在你的php.ini

你也可以試試

  [client]
  default-character-set=utf8

  [mysql]
  default-character-set=utf8

  [mysqld]
  character-set-client-handshake = false #force encoding to uft8
  character-set-server=utf8
  collation-server=utf8_general_ci

  [mysqld_safe]
  default-character-set=utf8

在你的my.ini中重新啟動mysql惡魔

請考慮所有這些:

  1. 在查詢之前,請執行以下操作:

     $conn->query('SET NAMES utf8'); 
  2. 確保您的文件編碼是utf8(不是html編碼)。 我指的是IDE正在使用的文件編碼。

  3. 確保你的桌子字符集

這顯然是一個眾所周知的問題的重復,但由於賞金,不能標記為關閉。 所以,清單:

  1. 確保將數據庫列,表和數據庫設置為字符集utf8mb4
  2. 確保使用$conn->set_charset("utf8mb4");將連接設置為相同的字符集$conn->set_charset("utf8mb4");
  3. 確保您的服務器配置為通知Web瀏覽器它將發送Unicode文本。 在PHP中,執行header("Content-Type: text/html;charset=utf8"); 或者在Web服務器配置中進行設置。

嘗試使用集名稱

public function insert($sql) {
    $conn = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
   // $conn->set_charset("utf8");
    $conn->query("SET NAMES 'utf8'");
    if ($conn->query($sql) === TRUE) {
        return 1;
    } else {
        return 0;
    }
    $conn->close();
}

來自MySQL( http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html ):

  • SET NAMES'charset_name'[COLLATE'collat​​ion_name']

SET NAMES指示客戶端將用於將SQL語句發送到服務器的字符集。 因此, SET NAMES 'cp1251'告訴服務器,“來自此客戶端的未來傳入消息是字符集cp1251。”它還指定了服務器用於將結果發送回客戶端的字符集。 (例如,如果使用SELECT語句,它指示要用於列值的字符集。)

SET NAMES 'charset_name'語句等同於這三個語句:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

將character_set_connection設置為charset_name也會將collat​​ion_connection隱式設置為charset_name的默認排序規則。 沒有必要明確設置該排序規則。 要指定特定的排序規則,請使用可選的COLLATE子句:

  • SET CHARACTER SET charset_name

SET CHARACTER SET類似於SET NAMES但將character_set_connection和collat​​ion_connection設置為character_set_database和collat​​ion_database。 SET CHARACTER SET charset_name語句相當於這三個語句:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET collation_connection = @@collation_database;

設置collat​​ion_connection還隱式將character_set_connection設置為與排序規則關聯的字符集(相當於執行SET character_set_connection = @@ character_set_database)。 沒有必要顯式設置character_set_connection。

我的觀點是,在某些時候,使用存儲過程時沒有指定字段描述的正確字符集。 再次檢查您的數據庫/表/字段是否具有字符集utf8_general_ci

來自MySQL( http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html ):

示例:假設column1定義為CHAR(5) CHARACTER SET latin2 如果您沒有說SET NAMESSET CHARACTER SET ,那么對於SELECT column1 FROM t ,服務器使用客戶端連接時指定的字符集發回column1所有值。 另一方面,如果在發出SELECT語句之前說SET NAMES 'latin1'SET CHARACTER SET latin1 ,服務器會在發送結果之前將latin2值轉換為latin1。 如果兩個字符集中都沒有字符,則轉換可能會有損。

您顯示的亂碼似乎涉及多個錯誤。 Çiç ,當Çiç到latin1給Çiç

請提供SELECT col, HEX(col) FROM ...用於“壞”的內容。

同時,您對存儲過程的回復 - 執行SHOW CREATE PROCEDURE ...並檢查SHOW CREATE PROCEDURE ...時有效的character set 可能是問題的一部分。 (我注意到你提到的這個十年前的錯誤報告沒有考慮到這方面。)

暫無
暫無

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

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