Jump to content
php.lv forumi

Dāņu burti mysql datubāzē netiek rādīti pareizi


maarc93

Recommended Posts

Nu jā, bet kur tu viņu redzi pareizi un kur- nepareizi? Web lapā? Konsolē? phpMyAdmin?

 

Ja web lapā, tad visticamāk, nav pareizs connection charset. Ja pieslēdzies ar mysql funkcijām, tad jāmeklē, kur pieslēdzies pie DB un tur konfigurācijas parametros jānorāda, ka connection charset ir utf8 (nevis utf-8). sk. mysqli_set_charset().

Edited by Mr.Key
Link to comment
Share on other sites

Nu principā izskatās pēc varianta, kad ne-utf8 encodētas lapas dati ir sagrabāti utf8 encodētā datubāzē.

Variantu kā salabot caur MySQL funkcijām es nezinu, ja kāds gudrāks zin priecātos redzēt strādājošu piemēru.

Var caur scriptu. No pieredzes varu teikt, ka gan iconv(), mb_convert_encoding() un utf8_encode/utf8_decode īsti nenostrādās.

 

Es izmantoju ko līdzīgu šim skriptam, eju cauri visām tabulas vērtībām un attiecīgi, ja ir izmaiņas, veicu update tabulā.

//sagatavojam masīvus
$umlaute = array( 'ü'=>'ü', 'ä'=>'ä', 'ö'=>'ö', 'Ö'=>'Ö', 'ß'=>'ß', 'à '=>'à', 'á'=>'á', 'â'=>'â', 'ã'=>'ã', 'ù'=>'ù', 'ú'=>'ú', 'û'=>'û', 'Ù'=>'Ù', 'Ú'=>'Ú', 'Û'=>'Û', 'Ãœ'=>'Ü', 'ò'=>'ò', 'ó'=>'ó', 'ô'=>'ô', 'è'=>'è', 'é'=>'é', 'ê'=>'ê', 'ë'=>'ë', 'À'=>'À', 'Ã'=>'Á', 'Â'=>'Â', 'Ã'=>'Ã', 'Ä'=>'Ä', 'Ã…'=>'Å', 'Ç'=>'Ç', 'È'=>'È', 'É'=>'É', 'Ê'=>'Ê', 'Ë'=>'Ë', 'ÃŒ'=>'Ì', 'Ã'=>'Í', 'ÃŽ'=>'Î', 'Ã'=>'Ï', 'Ñ'=>'Ñ', 'Ã’'=>'Ò', 'Ó'=>'Ó', 'Ô'=>'Ô', 'Õ'=>'Õ', 'Ø'=>'Ø', 'Ã¥'=>'å', 'æ'=>'æ', 'ç'=>'ç', 'ì'=>'ì', 'í'=>'í', 'î'=>'î', 'ï'=>'ï', 'ð'=>'ð', 'ñ'=>'ñ', 'õ'=>'õ', 'ø'=>'ø', 'ý'=>'ý', 'ÿ'=>'ÿ', '€'=>'€' );
$find = array_keys($umlaute);
$replace = array_values($umlaute);

$sql = "SELECT id, value FROM some_table";
$field_set = mysqli_fetch_array($sql); // dzīvē izmantoju ADODB klasi, tāpēc nepārzinu tik labi mysqli

foreach($field_set AS $row_set)
{
   $id = $row_set['id'];
   $value = $row_set['value'];
   $value_fixed = str_replace($find, $replace, $value);
   if(strcmp($value, $value_fixed) != 0)
   {
      $sql_update = "UPDATE some_table SET value = ".mysqli_escape_string($value_fixed)." WHERE id = ".mysqli_escape_string($id);
      mysqli_execute($sql_update);  //pārrakstām vērtību datubāzē
   }
}
Edited by kasisppr
Link to comment
Share on other sites

Ja nepareizi saglabāti pašā datubāzē, tad var konvertēt, mainot kolonnas collation. Precīzi neatceros, bet šajā gadījumā bija jāmaina 2x. Vienreiz no utf8_general_ci uz to swedish, kas defaultais (latin1_swedish_ci vai kaut kā tā), tad atpakaļ uz utf8. 

 

Šis vairāk kā pavediens. Dažas DB esmu tādā veidā salabojis. Ja ir vēlme, tad jāpēta sīkāk. Piemēra failu man nav, bet izdarīt to var.

Edited by Mr.Key
Link to comment
Share on other sites

Ja DB glabāts no php, tad viens no variantiem ir, ka pēc konekcijas ir aizmirsts uzlikt SET NAMES 'utf8' ..
php noklusēti (vismaz līdz šim) slēdzās ar 'latin' kodējumu.. 

 

 

Es tāpēc parasti visiem DB serveriem lieku šādu kombināciju:

 

[mysqld]

skip-character-set-client-handshake

character-set-server=utf8 // vai utf8mb4 ja vajag pilnu

kas principā ignorē klienta sūtītās opcijas (nav arī jālieto SET NAMES vairs) un vienmēr izmanto UTF8.

 

 

Jāfiksē ir droši vien noselectējot kā 'latin,' tad konvertējot uz utf8 (ar php vai piem. no komandrindas ar iconv) un liekot atpakaļ jau ar pareizu konekcijas enkodingu.

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...