1

State列を持つ Mysql テーブルがあります。状態はヨーロッパ全体からのもので、テーブルと列はutf8_unicode_ci.

使用するデータベースを呼び出すとき

mysql_select_db($database_WTF, $WTF);
mysql_query('SET NAMES utf8');
$query_Recordset1 = "SELECT * 
     FROM newmeets
     WHERE newmeets.`State` IS NOT NULL 
     AND newmeets.`State` !=  ''
     ORDER BY newmeets.`State` ASC ";

次に、この単純なループで実行します

mysql_select_db($database_WTF, $WTF);
mysql_query('SET NAMES utf8');
$query_Recordset1 = "SELECT * 
     FROM newmeets
     WHERE newmeets.`State` IS NOT NULL 
     AND newmeets.`State` !=  ''
     ORDER BY newmeets.`State` ASC ";

$LastState = "";
do {
    echo
    var_dump($LastState == $row_Recordset1['State']);
    echo $row_Recordset1['State'];
    $LastState = $row_Recordset1['State'];
    var_dump($LastState == $row_Recordset1['State']);
    echo "<hr>";
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));

期待どおりに新しい値に初めて到達すると、次のようになります。

boolean false
BRUSSELS
boolean true

次回私が得る時:

boolean true
BRUSSELS
boolean true

私が期待するほど。

問題は、各パスが生成されるときに非ラテン文字にヒットしたときに発生します。

boolean false
バーデン・ヴュルテンバー
boolean true

それらが等しくなるように設定すると、次のレコードがプルされると(そして各レコードが同じように入力された場合)、失敗します。これは、同じエンコーディングを使用した場合です。実際には、それらが同じであることを認識する必要があります文字が異なって入力されていても。

何が起こっているかに関係なく、比較から真の結果を得ようutf8_encodeと試みNormalizer::normalizeたので、これを制御構造で使用できます(たとえば、前回見た場合は、今回は印刷しないでください)が失敗します。

4

1 に答える 1

0

データベースに正規化の問題があるようです。同じ状態を文字列として何度も格納する代わりに、すべての状態名を独自のテーブルに入れて参照します。

これにより、たとえば偶然に、バイナリが異なるが同じように見えるデータを異なる行に配置して、後で適切に整列させることができなくなります。

または、個別の行をクエリして更新する必要があります。これにより、少なくとも同じ名前の州に対して同じバイナリ文字列データが得られます。たとえば、Mysql は実際にこれらの状態文字列を整列させることができますが、PHP は (文字列のバイナリの性質のために) そうではありません。

于 2012-12-28T11:09:54.547 に答える