Problem mit ORDER BY und Umlauten

Alles, was PHP betrifft, kann hier besprochen werden.

Problem mit ORDER BY und Umlauten

Postby Benni » 13. July 2005 21:09

Hi

ich habe in einer Tabelle viele Namen die ich per ORDER BY auslesen lasse. Das ging auf meinem alten Server noch ganz gut, da würden Umlaute wie ä ö ü richtig alphabetisch erkannt. Seit ich jetzt neuen Webspace gemietet hab, werden die Namen die zb mit "Sä...." beginnen nicht unter "Sa..." mit einsortiert, sondern einfach bei den "S..." Einträgen ganz am Schluss mit ausgegeben. Ich hab dazu noch folgendes gefunden, aber mein Provider weigert sich das so zu ändern:

http://mysql-faq.sourceforge.net/tables3.html

Jetzt würde ich gern wissen ob es eine Möglichkeit per php gibt, die Einträge alphabetisch richtig zu sortieren?

thx

BENNI
Benni
 
Posts: 21
Joined: 15. March 2004 18:58

Postby jakimo72 » 13. July 2005 23:05

Man kann bei MySQL zu jeder Tabelle angeben, welchen
Zeichensatz sie verwenden soll, dann muss man nicht die
globalen Einstellungen für die ganze Datenbank ändern.
Inzwischen wird üblicherweise UTF-8 verwendet, wie der
Sortieralgorithmus für UTF-8 implementiert ist, weiss ich nicht.


In PHP kann man sich eine deutsche Sortierung einfach selber bauen:
Code: Select all
// Für Telefonbuchsortierung
$trans = array('ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', 'á' => 'a',
                      'à' => 'a', 'â' => 'a', 'é' => 'e', 'è' => 'e', 'ê' => 'e',
                      'í' => 'i', 'ì' => 'i', 'î' => 'i', 'ó' => 'o', 'ò' => 'o', 'ô' => 'o',
                      'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ý' => 'y', 'ç' => 'c',
                      'ø' => 'oe',
                      'Ä' => 'ae', 'Ö' => 'oe', 'Ü' => 'ue',  'Á' => 'a',
                      'À' => 'a', 'Â' => 'a', 'É' => 'e', 'È' => 'e', 'Ê' => 'e',
                      'Í' => 'i', 'Ì' => 'i', 'Î' => 'i', 'Ó' => 'o', 'Ò' => 'o',
                      'Ô' => 'o', 'Ú' => 'u', 'Ù' => 'u', 'Û' => 'u', 'Ý' => 'y',
                      'Ç' => 'c', 'Ø' => 'oe');

// Für  Wörterbuchsortierung array('ä' => 'a', ... usw.

/* Viele weitere Umlaute machbar, insbesondere für Unicode,
   dieses soll aber erstmal ausreichen.
   Bitte achte darauf, dass die Strings gleich codiert sind, wie das
   Programm, ansonsten muss z.B. mit chr(228) usw. gearbeitet werden.
   eventuell noch uft8_decode verwenden */
   

function compare($eins, $zwei)
{
  global $trans;
  $eins = strtolower(strtr($eins,$trans));
  $zwei = strtolower(strtr($zwei,$trans));
  if ($eins == $zwei) return 0;
   return ($eins < $zwei) ? -1 : 1;
}

$meinarray = array('Hübner', 'Hubner', 'Huebner', 'André', 'Andre');
// Die $meinarray unsortiert aus der Datenbank nehmen.

usort($meinarray, 'compare');


Performanter ist immer die Sortierung in der Datenbank!
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Postby ollo » 15. July 2005 10:36

evtl. hilft auch die Verwendung von COLLATE in dem query, schau mal in der MySQL-Doku nach...
ollo
 
Posts: 85
Joined: 11. November 2004 12:29

Postby yeng » 15. July 2005 14:25

kann es sein, dass dieses COLLATE erst ab mysql 4.1 geht?
User avatar
yeng
 
Posts: 1
Joined: 15. July 2005 14:24

Postby ollo » 15. July 2005 16:16

yeng wrote:kann es sein, dass dieses COLLATE erst ab mysql 4.1 geht?


Ups! ja, das kann sein... :oops:

Drunter würde ich aber schon alleine wegen UTF-8 und Subselects nicht mehr verwenden... es sei denn, man muss einen Hoster nutzen, der nur 4.0 einsetzt...

Warum immer noch so viele Angst vor 4.1 haben versteh ich nicht... Das ist schon lange draußen, wird aber immer noch selten eingesetzt.
ollo
 
Posts: 85
Joined: 11. November 2004 12:29

Postby Benni » 16. July 2005 11:05

ja tut mir leid, aber mit Collate hats leider nicht funktioniert
ich habe noch einen sql Befehl gefunden der hieß convert() siehe hier:

http://dev.mysql.com/doc/mysql/en/charset-convert.html

weiß aber nicht ob mir das was hilft bzw wie ich das in meinen SELECT Befehl mit einbauen kann damit die Namen endlich richtig sortiert werden.
Benni
 
Posts: 21
Joined: 15. March 2004 18:58

Re: Problem mit ORDER BY und Umlauten

Postby halione » 03. July 2012 12:28

Hallo Community,
ich habe exakt die selbe Hearusforderung nur mit einem multidimensionalen Array.
Aufbau vereinfacht in etwa so:
$user[] = array('id' => 20121208,
'name' => "Wilfried",
surname' => "Sücher");

Hat jemand eine Idee wie ich die Sortierung der Spalte "surname" in PHP realisieren kann?

Wäre echt Super wenn jemand Rat weiss?

Gruß
Halione
halione
 
Posts: 1
Joined: 03. July 2012 12:23
Operating System: Linux

Re: Problem mit ORDER BY und Umlauten

Postby WilliL » 03. July 2012 15:59

ich würde das array ergänzen um die Spalte "sortsurname => Suecher" und direkt bei Datenanlage die Umlaute entsprechend ersetzen.
(Annahme: da PHP-Lösung - keine große Datenmenge)
Willi
WilliL
 
Posts: 660
Joined: 08. January 2010 10:54
Operating System: Win7Home Prem 64 SP1

Re: Problem mit ORDER BY und Umlauten

Postby Altrea » 03. July 2012 17:05

Einfach die richtige Collation für die Datenbanktabelle wählen und die Sortierung der Datenbank überlassen.
Die Sortierung an PHP zu übergeben ist ein echter Performancekiller.

mit freundlichen Grüßen,
Altrea
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 11926
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 11 Pro x64


Return to PHP

Who is online

Users browsing this forum: No registered users and 16 guests