Исключение повторяющихся значений на основе только одного столбца таблицы

В конечном счете эта проблема не может быть решена простым способом без использования перекодированных строк (UTF-8 → Windows-1252 или ISO-8859-1), как это было предложено ΤΖΩΤΖΙΟΥ из-за очевидной ошибки PHP, обнаруженной Huppie. Чтобы обобщить эту проблему, я создал следующий фрагмент кода, который наглядно демонстрирует, что проблема связана с функцией strcoll () при использовании кодовой страницы Windows-UTF-8 65001.

function traceStrColl($a, $b) {
    $outValue=strcoll($a, $b);
    echo "$a $b $outValue\r\n";
    return $outValue;
}

$locale=(defined('PHP_OS') && stristr(PHP_OS, 'win')) ? 'German_Germany.65001' : 'de_DE.utf8';

$string="ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß";
$array=array();
for ($i=0; $i

Результат:

string(20) "German_Germany.65001"
a B 2147483647
[...]
array(59) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "s"
  [3]=>
  string(1) "C"
  [4]=>
  string(1) "k"
  [5]=>
  string(1) "D"
  [6]=>
  string(2) "ä"
  [7]=>
  string(1) "E"
  [8]=>
  string(1) "g"
  [...]

Тот же фрагмент работает на машине Linux без каких-либо проблем, создавая следующий вывод:

string(10) "de_DE.utf8"
a B -1
[...]
array(59) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "A"
  [2]=>
  string(2) "ä"
  [3]=>
  string(2) "Ä"
  [4]=>
  string(1) "b"
  [5]=>
  string(1) "B"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "C"
  [...]

Фрагмент также работает при использовании Windows-1252 (ISO-8859-1 ) закодированные строки (конечно, кодировки mb_ * и локаль должны быть изменены затем).

Я отправил отчет об ошибке на bugs.php.net : Ошибка # 46165 strcoll () не работает с строками UTF-8 в Windows . Если у вас возникла та же проблема, вы можете дать свои отзывы команде PHP на странице отчета об ошибке (две другие, возможно связанные с этим, ошибки были классифицированы как bogus - я не думаю, что это ошибка bogus ; -).

Спасибо всем вам.

24
задан Ned 6 July 2013 в 23:07
поделиться