Hejsan
Mitt problem: Hur jag än gör så blir tabellerna i Drupal i collation utf8_general_ci istället för utf8_swedish_ci (och det ställer till med sortering av ÅÄÖ)
Skulle bara ändra så att det blev rätt collation på databasen, trodde inte att det skulle vara så svårt....
Kör på en rätt standardmässig Ubuntu-server. Som standard är collation på utf8_general_ci och det gör att ÅÄÖ sorteras fel (Å kommer efter A etc). Efter MÅNGA timmars googlande har jag testad flera 10-tal olika konfigurationer av my.cfn (och även varit inne och rotat i php.ini och .htacess). Just nu har jag i my.cfn:
[mysqld]
init-connect='SET NAMES utf8'
init_connect='SET collation_connection = utf8_swedish_ci'
default-character-set=utf8
default-collation=utf8_swedish_ci
collation_server=utf8_swedish_ci
character-set-server=utf8
character-set-client=utf8
character-set-client-handshake
character-set-client-handshake=0
skip-character-set-client-handshake
(har även provat en hel del konfigurationer som lagts under [client])
När jag startar om Mysql och med:
mysql> SHOW VARIABLES LIKE 'c%';
tittat hur det blev så får jag:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | utf8_swedish_ci |
| collation_database | utf8_swedish_ci |
| collation_server | utf8_swedish_ci |
| completion_type | 0 |
| concurrent_insert | 1 |
| connect_timeout | 10 |
+--------------------------+----------------------------+
Det verkar helt rätt!
Sen skapar jag en databas med:
create database drupal character set utf8 collate utf8_swedish_ci;
Sen går jag in i phpmyadmin och tittat - databasen är mycket riktigt i utf8_swedish_ci
NU KOMMER PROBLEMET:
Sen installerar jag Drupal och tittar på nytt och varenda tabell i den förbannade jävla skitdatabasen (har suttit ganska många timmar med detta) är nu i utf8_general_ci !!!! För att vara exakt så skapar installationen 50 tabeller som är i utf8_general_ci och sen för att retas visar phpmyadmin en summarad längst ner som säger utf8_swedish_ci (men går man in och tittat på valfri tabell så är den i utf8_general_ci).
Kom över ett script som ändrar collation i befintlig databas:
http://www.phoca.cz/download/category/17-phoca-changing-collation-tool
och scriptet fungerar jättebra. Varenda tabell konverteras så att det blir utf8_swedish_ci MEN så fort jag lägger till en ny modull så skapar modullen en ny tabell som gissa vad - jo är i utf8_general_ci........ (om man lägger till views så får man alltså 50 tabeller med utf8_swedish_ci och 5 nya med utf8_general_ci) Har hittat lite antydningar att vissa moduler ska ha detta problem så jag har provat med några olika men varenda modull som man lägger på skapar tabeller i fel collation.
Snälla hjälp! Vad ska jag göra för att tvinga igenom utf8_swedish_ci?
Verkar inte vara en så hållbar lösning att så fort man gjort någon ändring så måste man in med ett script och bygga om collation i databasen.
Comments
Collation kan läggas på flera
Collation kan läggas på flera olika nivåer. Först kommer de övergripande default-inställningarna för MySQL. Därefter tar databasinställningarna vid, vilka du har konfigurerat. Nivåerna efter det är tabellerna, kolumnerna och SQL-satserna. Alla nivåer kan explicit sätta sin individuella collation, vilket tar över från den ovanstående nivån. Du har satt collation på databasen men Drupal skapar tabellerna med explicit collation.
Johan Håkans skrev om en idé han hade kring detta. Det är en briljant idé men den fungerar, som han själv sammanfattar, endast för webbplatser med mindre innehåll.
Jag rekommenderar att du ser över vilka kolumner som du egentligen behöver svensk collation på och sedan sätter det manuellt. På så sätt skriver du över Drupals collation, som är satt på tabellnivån, men kan fortfarande dra nytta av de många kritiska indexeringarna.
Tobias Sjösten
Tack så hemskt mycket för
Tack så hemskt mycket för svar!
Men det väcker fler frågor...
Anledningen att jag vill ändra collation är för att jag har sidor gjord i views som listar innehåll i bokstavsordning och där kommer åäö fel nu.
Vidare har jag diverser lustigheter med pathauto och bredcrumbs som blir konstiga med åäö som kanske beror på detta (men det vet jag inte)
Är det alltså OK att ha en databas med en blandning av collation:s?
Som i mitt exempel med views - finns det någon "best practice" på vilka tabeller man ska ändra eller är det prova sig fram som gäller?
Om man installerar ALLA moduller man vill ha och sen slår med script över ALLT till utf8_swedish_ci - vad innebär det för:
Prestanda - länkad artikel pratar om prestandaförsämring men jag kan inte hitta något som förklarar (vet inte vad jag ska googla på)? I mitt fall är det en liten sida och en liten prestandaförsämmring borde inte spela någon större roll, tror inte att jag är speciellt ensam om den situationen.
Funktioner - fungerar sökningar, backup and migrate etc (alltså rent generellt: är moduller skrivna för en viss collation och blir ledsna om databasen är i en annan collation)?
Framtiden - kommer databasen att behålla denna collation allteftersom man lägger till nytt innehåll och uppdaterar moduler/Drupal?
När man sitter med ett problem tycker man att det är det enda "riktiga" problem som finns men är ändå lite förvånad att detta inte diskuterats mer.
Hoppas verkligen Johan eller någon annan gör slag i saken och skriver en modul!
Det är helt okej att ha en
Det är helt okej att ha en databas med blandning av collations.
Sorterar du på nodtitlar? I så fall bör du lägga utf8_swedish_ci på node.title (eller node_revisions.title). Kolla på SQL:en som din vy producerar och se vilken tabell och fält som används i ORDER BY-klasulen.
Prestanda - indexeringar görs per collation. Om du byter collation så bör alltså eventuella index byggas om. Det finns massor med information om index och prestanda där ute, om du är intresserad av att lära dig mer.
Funktioner - jag kan inte komma på något som skulle kunna strula. Det finns självklart alltid edge cases men jag skulle bli väldigt förvånad om du stöter på något som helt omöjliggörs av collation-bytet.
Framtiden - ja, det kommer att behållas. Om Drupal däremot skapar nya tabeller, för nya moduler, med utf8_general_ci så kommer de naturligtvis inte att få din svenska collation.
Tobias Sjösten
Tack igen! Har hittat mer
Tack igen!
Har hittat mer information än någon rimligen kan vilja veta...
Collationerna kan spöka har jag märkt.
Pathaut blir surt OM man ställer om fel tabeller till utf8_swedish_ci
Men å andra sidan:
Node:Import fungerar i vissa situationer bara OM man ställer om collationer till utf8_swedish_ci
Funderar på om man ska buggrapportera:
Vad gäller pathauto så får man ett felmeddelande så fort man försöker blanda olika collationer och det kanske snarare är en feature request.
Men vad gäller Node:Import så kan man alltid importera innehåll och ha med EN taxonomiterm MEN vill man ha flera kommaseparerade så MÅSTE man slå över till svensk collation, annars får man ett felmeddelande att namnet inte finns bland taxonomierna (!).
Hursom. Kan inte låta bli att fundera - problemet med coallitioner verkar i praktiken bara vara för sorteringsordning i views (mitt itdigare yrande om pathauto var nog fel) - skulle man inte istället kunna hoppas på en modul som modifierar Views sorteringsordning i enlighet med en bifogad konfigureringsfil (så har alla språk med konstiga bokstäver nytta av modulen)?! Verkar mycket enklare än att tvinga folk att modifiera i databasen med alla eventuella följdskador.
/Collationshataren
Till den glädje det kan ha
Till den glädje det kan ha för andra så fyller jag på med några länkar:
Svensk sammlingstråd: http://groups.drupal.org/node/25149
Skript: http://www.phoca.cz/documentation
Allmänt om att ställa in mysql:
http://www.geeklog.net/forum/viewtopic.php?showtopic=66443
http://www.confighell.com/MySQL
http://www.oreillynet.com/onlamp/blog/2006/01/turning_mysql_data_in_lati...
http://www.saiweb.co.uk/mysql/mysql-forcing-utf-8-compliance-for-all-con...
http://forums.theplanet.com/lofiversion/index.php/t85706.html
http://forums.mysql.com/read.php?103,202533,205027#msg-205027
http://dev.mysql.com/doc/refman/5.5/en/charset-table.html
Tackar!
Har haft samma problem som jag försökt lösa i månader. Har skapat en ordbok med kökstermer på matochvanner.com. Nu funkar det med ditt tips ovan:
Sorterar du på nodtitlar? I så fall bör du lägga utf8_swedish_ci på node.title (eller node_revisions.title). Kolla på SQL:en som din vy producerar och se vilken tabell och fält som används i ORDER BY-klasulen.
Tack Tack
Mvh David
Tack!
Tack!