✉️ Saņem šito visu e-pastā. Tā vietā, lai palaistu garām kaut ko no tā, ko es rakstu savā blogā, tagad vari pierakstīties un saņemt e-pastā visu, ko es te rakstu. Tas nav bieži.

← Uz sākumu

MySQL un UTF8

2006. gada 28. decembrī, 27 komentāri

Superfeini. Tagad, viens un tas pats atradīsies, meklējot “glāžšķūņ”, “GLĀŽŠĶŪŅ”, “glazskun”, vai “GlĀžŠķŪņ” (jā, tā dikti daudzi dara!). Beidzot izauga rokas pārstumt Wordpress tabulas no latin1 uz utf8.

А технологии, а технологии, а технологии, как люди!

Ja lauks ir TEXT, TINYTEXT, vai tml, tad pārtaisam to par BLOB:

ALTER TABLE `table` MODIFY `column` BLOB

Ja tas ir VARCHAR, CHAR, vai kas tml, tad taisām to par BINARY:
ALTER TABLE `table` MODIFY `column` BINARY(column-length).

Un galu galā, konvertējam uz utf8:
ALTER TABLE `table` MODIFY `column` VARCHAR(254) CHARACTER SET utf8.

Iepriekšminētā caurdibenība ir nepieciešama, lai mysql nepazaudētu oriģinālo saturu, kas ir cellēs, to konvertējot starp dažādiem enkodingiem. Jo MySQLprāt tur nebūt nav UTF-8, bet gan Latin-1, kā rezultātā, taisot pa tiešo kolonnas par UTF-8, mēs rezultātā iegūtu to, ko viņš redz tai cellē kā Latin-1 kodējumā. Sava veida dubulto UTF-8 :)

Ja nu kādu variable izmēru lauku (VARCHAR, piem) tomēr netīšām nokonvertējām uz BLOB, tad tam galā tiek pielipināti nullveidīgi baitiņi (0x00) līdz maksimālajam iespējamajam lauka izmēram. Tam mēs uzrakstām vienkāršu vaicājumu: UPDATE `table` SET `column` = REPLACE(`column`, x'00', ''), kas aizvāks visus liekumus.

Ja pasākums neaprobežojās ar vienu vai divām tabulām un desmit laukiem, tad, iespējams, ir vērts uzrakstīt mazu skriptiņu (pitonā, pēhāpē, perlā, javā, - kur un sirds kāro), kas visu iepriekšaprakstīto veic pats. Pirmām kārtām gana laba izklaide, otrām kārtām - nav tik apnicīgi, kā veikt visu iepriekšminēto manuāli.

Vēl varētu parekomendēt rezerves kopijas. Nopietni. Ja jūs šādi kaut ko sačakarēsiet, atpakaļceļš būs ellīgi sāpīgs (ja vispār iespējams). Pietiek jau uztaisīt identisku tabulu apstrādājamajai (SHOW CREATE TABLE `table`), uztaisīt tabulu bak_table, un to aizpildīt: INSERT INTO `bak_table` (SELECT * FROM `table`).

Paldies par uzmanību.

Tu atbildi augstāk redzamajam komentāram. Atcelt

Gravatar Arnolds

2006. gada 28. decembrī, plkst. 08:50

IMHO tā utf8 meklēšana joprojām nedaudz gļuko aptuveni 10% gadījumu (ne šajā lapā, bet citur). Vienkārši rāda, ka nav atrastu ierakstu, kaut gan DB tādi ir.

Gravatar laacz Autors

2006. gada 28. decembrī, plkst. 09:06

Arnolds, ko nozīmē "ģluko"?

Gravatar Arnolds

2006. gada 28. decembrī, plkst. 09:28

SELECT * FROM paakji_table WHERE name LIKE '%glazsk%';

neatrod neko.

SELECT * FROM paakji_table WHERE name LIKE '%glāžšķ%';

atrod Glāžšķūni.

Gravatar laacz Autors

2006. gada 28. decembrī, plkst. 09:30

Arnolds, kāda ir tabulu un lauku kollācija? Kādi konekcijas, servera un visi pārējie čārseti? Visticamākais, ka ir neatblistība to starpā, kas arī liedz izmantot šo fīču :)

Gravatar Arnolds

2006. gada 28. decembrī, plkst. 09:32

Un gan tabula, gan kolonna ir utf8_latvian_ci kodējumā.

Gravatar laacz Autors

2006. gada 28. decembrī, plkst. 09:38

Arnold, ar to vēl nepietiek. Ir visādi servera, datubāzes, konekcijas čārseti.

Gravatar Kārlis

2006. gada 28. decembrī, plkst. 10:23

Rakstiņš taisni laikā, lai gan nedaudz nokavējies. Ar UTF-8 mūžīgās bēdas ar kollācijām, kad lapa visu saprot, bet myadmins ar savu kollāciju (un liec kādu gribi) visu sačakarē, eksportēt ar mysqldump arī nevar un pielabot myadminu nesanāca, lai tas neliktu savu kollāciju. Nu vismaz ar MySQL 5 šādi gļuki.

Gravatar ckz

2006. gada 28. decembrī, plkst. 10:26

Hmmz, ar utf8_general_ci tipo meklē ok (iekš HTML utf-8). Vienīgi paliek "ķāķišķi" == "kakiski', bet tas manos gadījumos parasti ir feature nevis bug :)

Gravatar ckz

2006. gada 28. decembrī, plkst. 10:28

Kārli, tas tā notiek pat tad, ja kverijus noseivo teksta failā utf-8 kodējumā un tad peisto iekšā myadminā?

Gravatar tux

2006. gada 28. decembrī, plkst. 10:53

set names utf8 Izveido divas konekcijas (iekš php, perl) vienu ar latin1 un otru ar utf8. Viens loops kas izskrien cauri ar latin1 un updeito caur utf8. Rezultāts gan jaut tas pats būs :) Bet nu bija baigais prieks, ka sāka strādāt ORDER By un LIKE, he-he Tā, kā ģeniālās idejas rodas kad uz kastes griežas pārītis strādājošu projectu, tad apzvērējos brūvējot jaunu servaku iekš my.conf ierakstīt default konekcija - uttf8. Nuuu.. ja neaizmirsīšu.

Gravatar sn

2006. gada 28. decembrī, plkst. 10:58

driikst tev pajautaat, kaapeec izmanto MySQL? mees te ar PostgreSQL njemamies un nav nekaadu probleemu ar encodingu (UTF8 webam un UTF8 datubaazei), ar aatrdarbiibu (tabulaa ar gandriiz 100k ierakstiem search, pagging un viss paareejais aiznjem ljoti maz laika) un ar paareejaam fiichaam. pietam proceduuras, triggeri un visas paareejaas postgre fiichas ir kaa medusmaize saliidzinot ar to, ja viss buutu jaadara ieksh php un datubaazee ietu tikai select insert update un delete funkcijas..

Gravatar Kārlis

2006. gada 28. decembrī, plkst. 14:06

Pēc visādiem mēģinājumiem situācija nav radikāli mainījusies: ir datubāze, kuru myadmins rāda normāli, un ir tāda, kuru nerāda normāli (attiecīgi tāds pats arī datu eksports). Tabulām visu rāda ok. Tātad atšķirība būs pie konekcijas ar kuru dati ievadīti? Kā viņas "vienādot"?

Gravatar bubu

2006. gada 28. decembrī, plkst. 14:35

imho phpmyadmin'am nav korekti pastāstīts, lai lieto utf-8. Pats gan savu mūžu neesmu lietojis phpmyadmin, pilnīgi pieticis ar komandrindas tūļiem.

Gravatar BigUgga

2006. gada 28. decembrī, plkst. 17:02

ņā, mēs te, gēki, sēžam uz pgsql. jā laacz, ko tu kaukādu tur mysql. pats par sevi ar` brīnos.

100k ieraksti, o-bā....

nah to mysql. direktōr! man pietiek!

Gravatar karlis

2006. gada 28. decembrī, plkst. 19:05

  1. kas vainas myskl? Tagad taču mysklis arī supportē procedūras viewus un ko tik visu vēl ne. Pats gan neesmu mēģinājis neko no tā dzīvē izmantot.

  2. man ar bija problēma ar meklēšanu ierakstiem, kas utf-8 kodējumā. Ja izkārtojums ir "utf8_latvian_ci", pie meklēšanas mēdza neatgriezt visus ierakstus... Teiksim, "aaa" un "āāā" gadījumā atrada tikai pirmo no abiem ierakstiem. Nomainot uz "utf8_bin" no problemos.

  3. Tabula ar 100k ierakstiem -- aaaahahahaa, kas tad tur īpašs? Esmu drošs, ka te dažs var nosaukt krietni lielākus ciparus. :) Man, piemēram, db uz kādiem 15mio ierakstiem.

Gravatar Roze

2006. gada 28. decembrī, plkst. 19:11

sn : 100k ieraksti nav nekas (nav rādītājs) .. manuprāt uz sqlite ar funciklierētu zvērā ..

Kas attiecas uz procedūrām un trigeriem tas ir koks ar trīs galiem - proti simple SQL kverijus tomēr vieglāk "monitorēt" un saprast kas kur kādā brīdi lockojas vai bremzē.. Palaižas tur kaut kāda procedūra / events uz DB loopā vai hvz ar kādu izpildes mehānismu un ej nu zīlē kapēc DB ir saliecies līdz nemaņai ar kaut kādiem deadlockiem.. proti no debug viedokļa jākne lielāka (par priekšrocībām šoreiz nerunāsim).

Attiecībā uz characteriem mēs pie MySQL startēšanas pieliekam --skip-character-set-client-handshake un iztiekam bez visiem SET NAMES u.c. kverijiem pēc konekcijas izveides (t.i. serveris ignorē php clienta standarta latin charsetu un izmanto savu utf8))

Gravatar Livingston

2006. gada 28. decembrī, plkst. 22:05

Es zināju, ka MySQL der tikai mazām bāzītēm un nenopietniem uzdevumiem, bet nu ka tik slikts ... Vai, varbūt, tās datu bāzes un aplikācijas ir tik slikti uztaisītas, ka spētu pazemot jebkuru DBVS ?

Gravatar Roze

2006. gada 29. decembrī, plkst. 11:11

Kāpēc mazām?! .. diezgan lieli apjomi tiek dzenāti pie samērā augstām noslodzēm/jaudām. Viegli implementēt, samērā viegli uzturēt .. var iztikt bez liekām izmaksām. Ir savi "caveati" (nianses) bet nu ..

Jo ja runa iet par технологиām tad DB tā tiešajā nozīmē nav nekāds "meklētājs" .. tam ir citi pļurzuļi jāveido un dati jaindeksē savādāk.

Gravatar aaxc

2006. gada 29. decembrī, plkst. 12:15

Nezinu kaa ir ar MySQL, bet ar PostgreSQL var vienkaarshi pie izsaukshanas uzlikt UTF-8 to LATIN 7 un tev rezultaati jau ir bez ā,č,ž utt ..

Pirms tam veel tikai search jaanonjem nost visi ā,č,ž .. un buus tev tas pats rezultaats.

Meklējot "glāžšķūņi" atradiisim gan "glāžšķūņi", gan "glazskuni", gan "gļĀzSķunī", gan ...

Gravatar Livingston

2007. gada 4. janvārī, plkst. 16:21

Nu mazām tādēļ, ka no normālas DBVS es problēmas negaidu agrāk kā pie 100 miljoniem ierakstu, nevis 100k ...

Gravatar Taai

2007. gada 24. janvārī, plkst. 12:30

Laacz, vai tu man varētu palīdzēt? Problēma tāda, ka nevar atrast ierakstu, ja meklē 'janis', pat 'jānis'. Atrod tikai tad, kad meklē 'Jānis' (tiešā sakritība). No MySQL daudz nezinu, tāpēc jautāju: vai ir jābūt kaut kam pieprasījumā iekšā, lai atrastu 'Jānis', neskatoties uz to, vai ir vai nav latviešu rakstzīmes, lielie un mazie burti?

Gravatar Taai

2007. gada 25. janvārī, plkst. 16:56

Un kādēļ jālieto BLOB, nevis TEXT?

Gravatar Taai

2007. gada 29. janvārī, plkst. 01:09

Oki do! Ja vēlamies izmantot utf8, tad turpinam izmantot TEXT, jo tad nav jāuztraucās par lielajiem un mazajiem burtiem. Uzstādām datubāzes izkārtojumu uz 'utf8'. Un uzreiz pēc 'mysql_connect()' liekam 'mysql_query("SET NAMES utf8");' Un viss strādā! :) Next time, lūdzu, daudz izsmeļošāk, dārgais Laacz! Tu mums ļoti palīdzi, taču mums ir grūti, ja nepalīdzi līdz galam... :*

Gravatar jur4iks

2009. gada 4. septembrī, plkst. 14:33

Ar mysql nav nekādu problēmu mums online bāze 6GB, visi čarseti strādā perfekti.

Esmu pamaniijis LV taadu shaizi ka daudzi tautieshi nodefinee lauku kā utf8 bet mochii iekshaa latin1 vai kautko citu - tikai ne utf8... un protams tad saakas probleemas ar mekleeshanu kaartoshanu uttt.

PostgrSQL ir daudz leenaaks, esam testējushi. Tā arii neatradu kā online tabulas iepūst atmiņā. Mūsu gadījumā vdazhas tabulas, lielākā no kurām ir 4GB stāv pilnībā atmiņā un strādā tā itkā tajā būtu tikai 1000 ieraksti.

Es nesaku ka mySQL ir labāks, vienkārši katrai bāzei sava niša.

Gravatar Infants

2014. gada 2. februārī, plkst. 19:59

Laacz, pielabo lūdzu to kveriju, kurš ir paragrāfā par 'nullveidīgajiem baitiņiem'. Kaut kādā brīdī tur ' vietā parādījušies '''.

Gravatar Infants

2014. gada 2. februārī, plkst. 23:04

Tencinu. Šodien bija kārtējā reize, kad izmantoju šo lielisko rakstu. Zaudēju 2 stundas, kamēr pieleca, kur ir problēma.