Archiwum działu Ogólne (posty do 12.2007) - [Problem] Alfabetyczne sortowanie tematów z polskimi znakami
Orlin - 25-02-2007, 02:47 Temat postu: [Problem] Alfabetyczne sortowanie tematów z polskimi znakami Hejka!
Mam mały problem - na forum jest trochę działów, w których jest ustawione alfabetyczne sortowanie tematów. Niestety przy sortowaniu polskie litery trafiają na koniec alfabetu.
Podejrzewam, że ma to jakiś związek z ustawieniem "Metoda porównywania napisów" (-> phpMyAdmin). Przy wszystkich polach tekstowych (VARCHAR, TEXT,...) w bazie danych mam ustawione na latin1_swedish_ci, pozostałe ustawienia:
System kodowania znaków dla MySQL: UTF-8 Unicode (utf8)
System porównań dla połączenia MySQL: utf8_unicode_ci
Gdy zmieniełem metodę porównywania dla topic_title (przez phpma) na latin2_general_ci lub latin2_polish_ci (nie jestem pewien) to zamiast polskich liter zrobiły się: ? Całe szczęście pierwszy post w temacie ma taki sam tytuł jak temat - to wróciłem do latin1_swedish_ci i skopiowałem tytuły postów (post_subject) w miejsce tytułów tematów.
No i dochodzimy do sedna - jak to poprawić? - żeby sortowało poprawnie wg polskiego alfabetu.
Swoją drogą będę w tym tygodniu przenosił bazę na nowy serwer - więc mogę ewentualne porady zastosować także przy przenoszeniu - jeśli tak będzie prościej...
Niestety kopię bazy mogę wygenerować tylko przez "webpanel" (phpma wysiada przy eksportowaniu pojedynczych, dużych tabel) - a webpanelowa kopia / zrzut wygląda mniej więcej tak:
Kod: | -- MySQL dump 10.10
--
-- Host: localhost Database: phpbb_db
-- ------------------------------------------------------
-- Server version 5.0.26-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `phpbb_admin_notes`
--
DROP TABLE IF EXISTS `phpbb_admin_notes`;
CREATE TABLE `phpbb_admin_notes` (
`text` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Dumping data for table `phpbb_admin_notes`
--
LOCK TABLES `phpbb_admin_notes` WRITE;
/*!40000 ALTER TABLE `phpbb_admin_notes` DISABLE KEYS */;
INSERT INTO `phpbb_admin_notes` VALUES ('Przemo is the best :P');
/*!40000 ALTER TABLE `phpbb_admin_notes` ENABLE KEYS */;
UNLOCK TABLES;
[........] // kolejne tabele...
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2007-02-24 23:58:37
|
Będę wdzięczny za wszelkie wskazówki,
pozdrawiam,
Orlin
=================================================================
[ Dodano: 01-03-2007, 19:21 ]
Tak jak się domyślałem - zmiana na latin2_general_ci pomogła - przy czym zrobiłem to dopiero przy wspomnianym przenoszeniu forum na nowy serwer, ponieważ sama taka zmiana na istniejącej bazie kończy się utratą polskich znaczków...
Było trzeba jeszcze wprowadzić parę zmian, więc opiszę w skrócie jak ja to robiłem - może się komuś przyda...
1. Na początku zrobiłem zrzut starej bazy (UTF8 + latin1_swedish_ci) - utworzony np. skryptem:
Kod: | <?
echo "Zrzut DB........<br>";
system("mysqldump --host=serwer_sql --user=nazwa_bazy --password=hasło nazwa_bazy > nazwa_bazy.sql");
echo "Done!";
?> |
lub można bezpośrednio z shella, albo przerobić na Perla - w zależności do czego i jaki mamy dostęp... (phpMyAdmin i PA->SQL->Kopia zapasowa nie radziły sobie u mnie z dużą bazą - nawet przy pojedynczych tabelach...)
2. a) Znaczki były zakodowane w ISO-8859-2 - więc obeszło się bez zmian (do których notabene polecam edytory szesnatkowe - nawet przy ponad 100 megowych plikach się nie zawieszają, gdy się wrzuci im "zamień wszystko")
b*) Nie zmieniałem polskich znaczków, ale od razu podmieniłem we wszystkich postach, PW, shoutboxie itp. linki www.staryadres.com/... na www.nowyadres.net/... [tylko muszą być w bazie takie same indexy przy postach, tematach (autoincrement) - bo inaczej co z tego, że prowadzą na nowe forum jak do złych tematów...]
c) wszystkie wpisy: DEFAULT CHARSET=latin1; (przy CREATE TABLE)] zamieniłem na DEFAULT CHARSET=latin2;
d) powywalałem komentarze i te niby zakomentowane instrukcje /*....*/
e) na początku pliku dopisałem: Kod: | SET NAMES 'latin2';
SET CHARACTER SET 'latin2';
SET SESSION collation_connection = 'latin2_general_ci'; |
f*) jeszcze wywaliłem tabele search i sessions...
3. Utworzyłem na nowym serwerze nową bazę danych - UTF8 + latin2_general_ci (latin2_polish_ci nie było)
4. Wgrałem (ten wcześniej lekko przerobiony) zrzut bazy poleceniem (przez ssh):
Kod: | cat plik_z_baza.sql | mysql --host=adres_serwera_mysql --user=uzytkownik --password=haslo nazwa bazy |
gdy wyskoczył jakiś błąd o zduplikowanym kluczu w linii 5725 (ale to tylko gdy wgrywałem razem z tabelami search i sessions), to kontynuowałem tak:
Kod: | tail +5726 plik_z_baza.sql | mysql --host=adres_serwera_mysql --user=uzytkownik --password=haslo nazwa bazy |
4.W pliku mysql4.php dodałem:
Kod: | mysql_query("set names 'latin2'",$this->db_connect_id); |
zaraz po: Kod: | $this->dbname = $database;
$dbselect = mysql_select_db($this->dbname); |
I wszystko działa i sortuje jak należy
Wcześniej jeszcze próbowałem z metodą porównywania utf8_polish_ci - ale mimo że polskie literki prawidłowo się pojawiały, to sortowanie nie działało (tutaj dla odmiany polskie trafiały na początek alfabetu)
Pozdrawiam,
Orlin
|
|
|