Jump to content
php.lv forumi

Datubāzē nomainīt "Collation" charset


imop

Recommended Posts

Sveiki!

 

Man jautājums par to kā var noaminīt jau esošai DB "Collation" no latin1_swedish_ci uz utf8_bin,

 

Bet VISĀM tabulām, mēģināju palaist šādu (ALTER DATABASE `manabaze` CHARACTER SET utf8 COLLATE utf8_bin;) skriptu iekš phpmyadmin, bet nesanāca :(

 

varbūt kāds zin kā to var izdarīt savādāk man ar rokām mainīt visam būtu pārāk ilgi!

Edited by imop
Link to comment
Share on other sites

man gan sanāca (uz localhost). nezinu vai uz hostiem tā var darīt. tur laikam jāizmanto hostinga paneļa funkcionalitāte, lai mainītu datu bāzes defaulto charset/collation

 

btw, tev gadījumā drīzāk nevajadzēja datu kodējumu mainīt?

Link to comment
Share on other sites

man gan sanāca (uz localhost). nezinu vai uz hostiem tā var darīt. tur laikam jāizmanto hostinga paneļa funkcionalitāte, lai mainītu datu bāzes defaulto charset/collation

 

btw, tev gadījumā drīzāk nevajadzēja datu kodējumu mainīt?

 

 

Pašā DB jāsaimana charset/collation visām tabulām, kā default man tagad stāv utf8_bin pie ierakstu veidošanas, bet gan pašām tabulām ir latin1_swedish_ci

 

Viens risinājums ir paņemt eksportēt DB iekopēt kādā editorā un samainīt vienkārši latin1 ierakstus uz utf8 un latin1_bin uz utf8_bin, bet nezinu vai tas īsti ir pareizi, jo tad viņš man DB rāda visām tabulām utf8_general_ci, ja tas neimaina lietas būtību, tad var arī palikt utf8_general_ci

 

ir ok - utf8_general_ci

vai tomēr utf8_bin

Edited by imop
Link to comment
Share on other sites

Ehh...tieši pirms dažām dienām cīnījos ar to. Tā kā DB bija jau veca un liela, tad laika gaitā tur bija saradušās visādas vērtības - gan latin1 kodējumā, gan utf8 kodējumā. Pareizākais (un drošākais) variants, IMO, ir konvertēt visus datus uz bināro formātu un tad uz utf8. Tas piespiedīs uzspiest visiem datiem pareizo kodējumu un tos tiešām pārkonvertēt un neradīsies tāda situācija, ka daži simboli (ā, š, utt) būs izkropļoti.

 

Tas gan paņems krietnu laiciņu sarakstīt kvērijus un izpildīt tos (ja DB ir liela), bet vismaz būs droši, ka viss būs OK ;)

 

btw tas attiecas uz gadījumu, ja tu vēlies arī datus konvertēt ne tikai datubāzes collation nomainīt. DB collation var nomainīt iekš phpmyadmin pat nevienu kvēriju nerakstot. Pie operations sadaļas...

Link to comment
Share on other sites

tādos gadījumos vieglāk exportēt visu ārā, un tad nomainīt gan datu kodējumu, gan aiz katra CREATE TABLE ierakstīt jauno kodējumu: CHARSET=utf8

 

un pēc tam import atpakaļ

 

sanāk, ka uz brīdi ir jāaptur lapa (vēlams 3:00 naktī vai kad ir vismazāk useri :D), kamēr nomaina db:

1) export

2) convert datus un atbilstoši izmaina arī tabulu meta info

3) drop visas vecās tabulas

4) import

 

protams, to visu sākumā dara uz testa datiem ;)

un tā kā kkādi gļuki var tikt pamanīti tikai vēlāk, tad ir ieteicams kādu brīdi pieglabāt arī oriģinālo sql export

 

ohh, vēl viena piebilde: ja tajās latin1 tabulās jau ir utf8 dati (tā bieži gadās), tad datus nemaz nevajag konvertēt. tikai exportētajā sqlā ir jānomaina tabulu charsets (pie CREATE TABLE) un var importēt atpakaļ. turpmāk gan jālieto mysql_query('SET NAMES utf8');

 

bet ja tomēr ir tā, kā rATRIJS teica, kad dažādu kodējumu dati ir samixēti kopā, tad gan tomēr nākas exportēt un labot visu ar custom replace. izdarāms tas ir, tikai jāpēta, kādi baiti tur ir un kas ar tiem ir domāts ;)

Edited by 2easy
Link to comment
Share on other sites

luuk tiko pameiignaju viss sance

 

edgars@kein:~$ mysqldump -u lietotajvards -p datubaze > mysqlbackup.sql

edgars@kein:~$ mysql -u lietotajvards -p

password: *

 

-- Life Rocks | Mysql version 5.1.36

-- Time: 11:50 | 29. January 2010

 

mysql> drop database datubaze;

Query OK, 1 row affected (0.02 sec)

mysql> create database employees character set utf8 COLLATE utf8_general_ci;

Query OK, 1 row affected (0.00 sec)

quit

edgars@kein:~$ mysql -u lietotajvards -p datubaze < mysqlbackup.sql

exit

Link to comment
Share on other sites

anyway, es domāju pēc visa šitā imopam būs viela pārdomām ^^

 

EDIT: heh, vēl nebija neviens citāts no klasikas. tāpēc check this out too ;)

http://laacz.lv/2006/12/28/mysql-un-utf8/

 

thx visiem, tiešām būs ko apsmadzeņot, tā kā viss tiek apgūts tad tiešām paldies!

 

par rezutātie painformēšu kas un kā man izdevās!

 

 

p.s. īsti vīri backup tomēr taisa un paglabā kādu laiku! :D

Link to comment
Share on other sites

Sākumā nevarēju saprast kapēc man aiz visiem uzrakstiem parādās \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

bet beigās palasīju laacz rakstu mazliet uzmanīgāk un galu galā man izdevās!

 

Tad darīju tā:

 

Sākumā

 

ALTER TABLE `kategorijas` MODIFY `kategorijas_nosaukumi` BINARY(255);

 

un tad tikai uz utf8 ar šo:

 

ALTER TABLE `kategorijas` MODIFY `kategorijas_nosaukumi` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

 

un tad noņemam nulles un visu slashus "\" nost

 

UPDATE `kategorijas` SET `kategorijas_nosaukumi` = REPLACE(`kategorijas_nosaukumi`, x'00', '');

 

Jāatdzīst penteris snāk liels pa visu DB, bet galarezultāts ir tas ko es vēlējos viss ir smuki un pareizi!

 

Paldies!

Edited by imop
Link to comment
Share on other sites

Man šeit doma panesās a kapēc nē ja nu var šādi kaut ko ar php kopā:

 

Lai nav jāraksta lielais penteris pēc augšējā parauga, kas pie lielākām DB varētu būt smagnējs process...

 

bet gan ar šāda veidojuma palīdzību paveikto to visu automātiski:

 

<?php
// Piesledzos
mysql_connect("localhost","lietotajs","parole");
mysql_select_db("datubazes_nosaukums");

// Nu tad aiziet
$res = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_array($res)
while ($col = mysql_fetch_array($res)
)
{
   foreach ($row as $key => $table)
foreach ($col as $key => $column)
   {

       mysql_query("ALTER TABLE " . $table . " MODIFY " . $column . " BINARY('255');");
echo $key . " => " . $table . " un " . $column . " <b>IZDEVAS</b> parveidot<br />";

mysql_query("ALTER TABLE " . $table . " MODIFY " . $column . " VARCHAR('255') CHARACTER SET utf8 COLLATE utf8_bin;");
echo $key . " => " . $table . " un " . $column . " <b>IZDEVAS</b> parveidot<br />";

mysql_query("UPDATE " . $table . " SET " . $column . " = REPLACE(" . $column . ", x'00', '');");
echo $key . " => " . $table . " un " . $column . " <b>IZDEVAS</b> parveidot<br /> <br />";

   }
}
?>

 

Tikai problēma, kā lai pasaka php ka viņam jāčēko sākumā TABULA kurās ir tikai "VARCHAR('???')" kur ??? vietā var būt dažādi skaitļi piem.: 1, 32, 255 utt. un veic darbibu:

 


mysql_query("ALTER TABLE " . $table . " MODIFY " . $column . " BINARY('???');");
echo $key . " => " . $table . " un " . $column . " <b>IZDEVAS</b> parveidot<br />";

 

Tad kad tas ir pārveidots, lai sāk čēkot tās TABULAS kurās ir tikai "BINARY('???')", kur ??? vitā var būt dažādi skaitļi piem.: 1, 32, 255 utt. un veic darbību:

 

mysql_query("ALTER TABLE " . $table . " MODIFY " . $column . " VARCHAR('255') CHARACTER SET utf8 COLLATE utf8_bin;");
echo $key . " => " . $table . " un " . $column . " <b>IZDEVAS</b> parveidot<br />";

 

nu un trešā darbība ir easy,

 

bet jautājums vai tas ir iespējams izvilkt no DB to ko es vēlos un veikt konkrētās darbības, ja ir tad varbūt varat palīdzēt?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...