0

PHP を使用して MySql 5.6 DB に挿入すると、「不正な文字列値」というエラーが表示されます (v5.5 を含む複数のサーバーから複数のバージョンの PHP を試しました - すべての Windows マシン)。

私はフォーラムを精査し、すべてを試しましたが、これを理解できないようです! 以下、詳細です。シンプルなものが欠けていることを願っています。すべてのヘルプが大歓迎です。前もって感謝します!

================================================== ===================

現在の MySQL 5.6 構成(関連部分):

[client]
default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

サーバー設定の検証:

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_general_ci
---------------------------------------------------
collation_database        |  utf8mb4_general_ci
---------------------------------------------------
collation_server          |  utf8mb4_unicode_ci
---------------------------------------------------

データベースステートメントを作成します(これは、この問題を解決するために厳密に作成したテスト DB です):

CREATE DATABASE `chartest` /*!40100 COLLATE 'utf8mb4_general_ci' */

テーブル ステートメントの作成:

CREATE TABLE IF NOT EXISTS `testtable` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `testcol` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

テスト/サンプル PHP コード: (1 つのメモ - PDO または MySQLi を使用する必要があることはわかっています。現在、移行/アップグレードを進めていますが、多くのレガシー コードがあるため、当面の間、この問題を解決する必要があります。 / 現在非推奨の mysql 関数を使用する短期)。

<?php   
    //Establish DB connection
    $DBConnection = mysql_connect('my_db_server_IP', 'my_db_username', 'my_db_password');

    if (!$DBConnection) {
        die('Could not connect: ' . mysql_error());
    }

    if (!mysql_select_db('chartest', $DBConnection)) {
        echo 'Could not select database';
        exit;
    }    

    //Set misc charset options in mysql
    /*Note: these should not really be needed given the 
    character-set-client-handshake = FALSE setting in the MySQL config file.  
    Also, I have tried every combination of these, building 
    from the ground up - no luck. 
    I have left these in here just for the sake of being thorough */

    mysql_query("SET character_set_client=utf8mb4", $DBConnection); 
    mysql_query("SET character_set_connection=utf8mb4", $DBConnection); 
    mysql_query("SET character_set_database=utf8mb4", $DBConnection); 
    mysql_query("SET character_set_results=utf8mb4", $DBConnection); 
    mysql_query("SET character_set_server=utf8mb4", $DBConnection); 


    mysql_set_charset("utf8mb4", $DBConnection);            
    mysql_query("SET CHARACTER SET utf8mb4", $DBConnection);
    mysql_query("SET NAMES utf8mb4", $DBConnection);



    //The query below contains a "middle dot" which is what causes the error (or at least is an example)
    $SQLQuery = "INSERT INTO testtable (testcol) VALUES ('test · middle dot insert')";  

    //Execute query
    $result = mysql_query($SQLQuery, $DBConnection);

    if (!$result)
    {
        echo mysql_error();
        exit;
    }
    else
    {
        echo 'worked - '. mysql_insert_id();
    }

    mysql_close($DBConnection); 
?>

エラーが返されました

正しくない文字列値: 行 1 の列 'testcol' の '\xB7 middle dot insert'

……またよろしくお願いします。

================================================== ================

編集 RE: 重複した質問: 提案された重複した質問/回答UTF-8 を最後まで確認しましたが、何が欠けているのかわかりません (明らかに何かが欠けているに違いありません!!)。

より具体的には (参照された投稿によると)、私の「データ ストレージ」は utf8mb4 であり、私の「データ アクセス」は mysql_set_charset を使用しています。実際にこれらの文字を「出力」しようとはしていません (少なくとも、ここでは私の問題ではありません)。 /SQL クエリはハードコードされているため、この問題はデータの「入力」には関係ありません。そして最後に、「その他の考慮事項」に関して、私は文字列関数を使用していないので、私が知る限り問題にはなりません。

繰り返しになりますが、フィードバックは大歓迎です。ありがとう。

4

0 に答える 0