Mysql collation hiba

Den képe

Ezt az üzenetet kapom, ha a pathauto modullal a node alias-okat akarom legeneráltatni

("Node path settings" - "Bulk generate aliases for nodes that are not aliased")

user warning: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_hungarian_ci,IMPLICIT) for operation '=' query: SELECT n.nid, n.vid, n.type, n.title, n.uid, n.created, n.language, alias.src, alias.dst FROM node n LEFT JOIN url_alias alias ON CONCAT('node/', CAST(n.nid AS CHAR)) = alias.src WHERE alias.src IS NULL AND n.type IN ('story','page','glossary') LIMIT 0, 50 in /home/donci/old-stuff/WebApps/Drupal-sites/Fact-intezet/sites/all/modules/pathauto/pathauto_node.inc on line 101.

Az adatbázis utf8 és a default collation utf8_hungarian_ci. Ezt csak úgy sikerül elérnem, hogy: telepítem a drupalt, az létrehozza az adatbázist. Ezt dump-olom, és a tábla definiciókban lévő collationt (utf8_general_ci) cserélem utf8_hungarian_ci-re. Másképp nem megy.

Ha parancssoros mysql-el hozok létre egy táblát uft8_hungarian_ci-s adatbázisban, akkor az a tábla jól örökli a collation-t. Ha a php (drupal) hozza létre, akkor nem.

Közben, kinyírva néhány macskát, lefut a query. Ehhez a database.mysql.inc-ben a db_connect()-nél megadok néhány + értéket:

// Force UTF-8.
  //mysql_query('SET NAMES "utf8"', $connection);
  mysql_query('SET NAMES "utf8" collation "utf8_hungarian_ci"', $connection);
 
 
  mysql_query('SET character_set_client "utf8"', $connection);
  mysql_query('SET collation_connection "utf8_hungarian_ci"', $connection);

Ez még nem elég, csak ha settings.php-ben a kapcsolat típusát mysqli-ről mysql-re teszem.

Ekkor lefut az alias-ok generálása, nem kiabál az összeakadó collation-ökre (general sortlen 1, hungarian-nál 8). Ellenben az ékezetes karaktereket teljesen elfelejti, "fogalomtr/kdolsi-utasts" készít fogalomtar/kodolasi-utasitas helyett (ha general_ci, akkor megy, az i18n-ascii.txt beállítva, természetesen).

Jah, és ha mysql a connection, akkor minden admin oldalon az alábbi üzenet fogad:
warning: array_merge() [function.array-merge]: Argument #2 is not an array in /home/donci/old-stuff/WebApps/Drupal-sites/Fact-intezet/includes/theme.inc on line 930.
Mysqi kapcsolat esetén ez azonnal megszűnik.

Tehát, most van 2 nem működő megoldásom. Ha a szöveg magyar, akkor az utf8_general_ci-s adatbázis/táblák majdnem működnek. De nekem kellene a glossary view is, ami general_ci-nél nem tudja a magyar betűket. A probléma leírása itt: http://drupal.hu/forum/lexikon-szószedet

Ha jól számolom ez a 3 verzió, ami nem ok.

A mysql collation-ös probléma leírása itt: http://drupal.hu/forum/mysql-konfigurálása-megfelelő-collation-táblákban

Nem tudom eldönteni, mysql, php hiba, vagy egyszerűen csak én akarok túl sokat...

Valami ötlet? Hogyan lehetne megoldani ezeket a problémákat?

Most megpróbálom a kész, mysql adatbázist valahogy postgresql-esíteni. (bár ott meg már telepítés során is vannak gondok: http://drupal.hu/forum/magyar-nyelv-hozzáadás-hiba-postgresql-en)

(Egy egyszerű kis weblapot akarok ~ 50 oldal tartalom van fenn. Bizonyára a drupal beli tapasztalat hiánya is, hogy folyton ilyen falakba ütközöm...)

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Den képe

Arra rájöttem menet közben:

hiába adom meg, hogy a tábla collation utf8_hungarian_ci, néhány mező (type, lang) utf8_general_ci lett. Ez csak a squirrel sql client-el tudtam kideríteni. A db-dump-ban mindenütt hungarian_ci van. Rejtély.

Átolvastam a fél mysql docs oldat (utálat vacak a doksi), és rájöttem. Ez az idióta mysql megint nem azt csinálja, mint amit kell. Ha a query-t egy részét átírom, akkor lefut:

LEFT JOIN {url_alias} alias ON CONCAT('node/', CAST(n.nid AS CHAR)) = cast(alias.src as char)

A lényeg itt van cast(alias.src as char), vagyis az scr-t ami amugy is CHAR convertálom char típussá (van értelme, úgyamúgy?), akkor ez az idióta mysql, valamiféle kényszerből uft8_general_ci-t fog ráhúzni a konvertált típusra ebben a query-ben. Én nem tettem mást, csak a CAST(n.nid AS CHAR) formájára - ami utf8_general_ci szintén - hoztam az egyenlet második felét, így már össze tudja vetni a két értéket.

Gratulálok.

0
0
Den képe

Az includes/database.mysqli.inc-be kell a következőt betenni

// Force UTF-8.
  mysqli_query($connection, 'SET NAMES "utf8" collate "utf8_hungarian_ci"');

Tehát, a connection-t rá kell venni, hogy a megfelelő collation használatára.

Nem elegáns megoldás. Hogy kellen szebben? -> Új thread itt?: http://drupal.hu/forum/sql-kiadása-db-connect-után

thx!

0
0
aries képe

A sorbarendezés miatt nem jó neked a general_ci ? Sajnos elegánsabb megoldást nem tudok, a másik thread-re sem, mivel ez elég mélyen van a drupalban ahhoz, hogy ne legyen hozzá hook.

0
0
Den képe

A glossary view a general-al nem tud magyar ékezeteket. Meg úgy általában a magyar szerinti sorbarendezés nem ok.

De megoldom, amint megtanulom programozni a drupalt... Addig jó ott ahol van, macskáknak annyi. :)

0
0