Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: nastavení kódování mysql databáze  (Přečteno 7488 krát)

Aldik

  • Návštěvník
  • Příspěvků: 33
nastavení kódování mysql databáze
« kdy: 05 Června 2007, 08:22:30 »
Ahoj, migruji projekt v javě z windows do linuxu a mám problém s nastavením kódování mysql databáze
na Cp1250. Když zadám

ales@ubik:~$ sudo mysqld --character-set-server=Cp1250
070605  8:08:29  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
070605  8:08:29  InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 37635596.
InnoDB: Doing recovery: scanned up to log sequence number 0 37635596
InnoDB: Last MySQL binlog file position 0 28017931, file name /var/log/mysql/mysql-bin.000014
070605  8:08:29  InnoDB: Started; log sequence number 0 37635596
070605  8:08:29 [Note] mysqld: ready for connections.
Version: '5.0.38-Ubuntu_0ubuntu1-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  Ubuntu 7.04 distribution
         


Db jsem pusel kill nout, na posledním řádku se to zastaví a žádný výstup.  
V tabulce je špatná diakritika i přes to, že je zakládána s

ENGINE=InnoDB DEFAULT CHARSET=cp1250;

Nevíte jak na to? Díky

klasyc

  • Aktivní člen
  • *
  • Příspěvků: 470
nastavení kódování mysql databáze
« Odpověď #1 kdy: 06 Června 2007, 23:55:53 »
Ahoj, já používám sice v mysql tabulky MyISAM, ale při spouštění serveru kódování nastavovat nemusím. Nechal jsem tam to, co tam bylo. V manuálu psali, že tímle parametrem nastavíš jenom defaultní kódování. Pokud je tabulka ale v jiném kódování, tak to data nepřekonvertuje. Co mi pomohlo je, že jsem nastavil kódování až u konkrétní databáze a tabulek. Teď nevím, jestli si přesně vzpomenu na ten SQL příkaz, ale bylo to něco jako:

CREATE DATABASE pokus
    DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_cs;

Stejně tak se nastavují i tabulky (výňatek z manuálu):

CREATE TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
    [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]

CREATE TABLE Table1
(
    column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);

Pak se ještě musí nastavit kódování pro komunikaci mezi serverem a klientem. Tam mi nechodilo nastavení žádné znakové sady korektně, tak jsem to nastavil v zoufalství na hodnotu binary (?) a to chodí dobře. Takže hned po otevření databáze v programu volám

SET NAMES binary;

Snad ti to pomůže. Jinak se mrkni do manuálu (www.mysql.org) Je to otrava to číst, ale je to tam pěkně popsaný a budeš tomu aspoň  pořádně rozumět...

Pavelp

  • Host
nastavení kódování mysql databáze
« Odpověď #2 kdy: 07 Června 2007, 07:20:47 »
Podle mne by bylo rozumne nove zakladane databaze kodovat v utf-8. Je ale nutne dusledne pred dotazem pouzivat prikaz set names. A to podle kodovani klienta, ktery pristupuje, resp. podle dat, ktera jsou insertovana nebo pozadovana. Funguje mi to bezproblemove v prostredi ISO-latin2, Win1250, utf-8.
Edit: taky mozna zalezi na typu databaze, nevim, tak do hloubky jsem to nezkoumal.

Aldik

  • Návštěvník
  • Příspěvků: 33
nastavení kódování mysql databáze
« Odpověď #3 kdy: 07 Června 2007, 14:56:52 »
Díky, ale i když použiji před každým insertem
set names cp1250;

tak je to špatně. Tabulky jsou tvořeny jako

#
# Table structure for table log_majetek
#
set names cp1250;
CREATE TABLE `log_majetek` (
  `id` int(11) NOT NULL auto_increment,
  `datum` timestamp NOT NULL default '0000-00-00 00:00:00',
  `dotaz` text NOT NULL,
  `user` varchar(11) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250;

dotaz SHOW VARIABLES LIKE 'character_set_client';  vrací utf-8

Snažím se importovat data z sql souboru, který obsahuje data dumpnutá z mysql ve Windows pomocí mysql front, takže je to takto

set names cp1250;
# MySQL-Front 3.2  (Build 10.27)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;

/*!40101 SET NAMES cp1250 */;
/*!40103 SET TIME_ZONE='SYSTEM' */;


# ------------------------------------------------------
# Server version 4.1.21-community-nt

#
# Table structure for table log_majetek
#
set names cp1250;
CREATE TABLE `log_majetek` (
  `id` int(11) NOT NULL auto_increment,
  `datum` timestamp NOT NULL default '0000-00-00 00:00:00',
  `dotaz` text NOT NULL,
  `user` varchar(11) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250;

a potom běží inserty. Je možné, že bych měl před každým insertem volat
set names cp1250;  ?

Díky za rady, 2 dny dělám pokusy ale na nic jsem nepřišel

klasyc

  • Aktivní člen
  • *
  • Příspěvků: 470
nastavení kódování mysql databáze
« Odpověď #4 kdy: 07 Června 2007, 16:07:03 »
Set names ti nastaví kódování pro celou session - tj. stačí ho použít jenom jednou, hnedka po připojení a bude fungovat po celou dobu připojení. Když importuješ data, zkus tam dát set names binary (do toho sql souboru) - mně to funguje.

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5058
    • Lomítkáři
nastavení kódování mysql databáze
« Odpověď #5 kdy: 07 Června 2007, 18:33:30 »
Nevim, jak cp1250, ale na iso-8859-2 i utf-8 mi jen set names nestacilo, musel jsem pro inserty pouzit i character set, jinak receno:

SET NAMES 'cp1250';
SET CHARACTER SET 'cp1250'

Taky pozor na posledni verze phpmyadminu, z nejakeho duvodu tam import sql souboru a jeho prekodovani nefunguje spravne. Musel jsem si na to napsat svuj script.
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

Pavelp

  • Host
nastavení kódování mysql databáze
« Odpověď #6 kdy: 07 Června 2007, 19:53:38 »
Citace: Aldik
Díky, ale i když použiji před každým insertem
set names cp1250;

tak je to špatně. Tabulky jsou tvořeny jako

#
# Table structure for table log_majetek
#
set names cp1250;
CREATE TABLE `log_majetek` (
  `id` int(11) NOT NULL auto_increment,
  `datum` timestamp NOT NULL default '0000-00-00 00:00:00',
  `dotaz` text NOT NULL,
  `user` varchar(11) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250;

dotaz SHOW VARIABLES LIKE 'character_set_client';  vrací utf-8

Snažím se importovat data z sql souboru, který obsahuje data dumpnutá z mysql ve Windows pomocí mysql front, takže je to takto

set names cp1250;
# MySQL-Front 3.2  (Build 10.27)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;

/*!40101 SET NAMES cp1250 */;
/*!40103 SET TIME_ZONE='SYSTEM' */;


# ------------------------------------------------------
# Server version 4.1.21-community-nt

#
# Table structure for table log_majetek
#
set names cp1250;
CREATE TABLE `log_majetek` (
  `id` int(11) NOT NULL auto_increment,
  `datum` timestamp NOT NULL default '0000-00-00 00:00:00',
  `dotaz` text NOT NULL,
  `user` varchar(11) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250;

a potom běží inserty. Je možné, že bych měl před každým insertem volat
set names cp1250;  ?
To asi zalezi na klientovi, urcite na zacatku sezeni.
Ted nevim jestli nekecam, ale kodovani se snad nastavuje jen jednou pri tvorbe databaze a je jednotne pro vsechny tabulky.

Aldik

  • Návštěvník
  • Příspěvků: 33
nastavení kódování mysql databáze
« Odpověď #7 kdy: 07 Června 2007, 20:29:43 »
Kódování databáze při založení byla cp1250, tabulky také, viz nahoře, zkusil jsem dát na začátek
SET NAMES 'cp1250';
SET CHARACTER SET 'cp1250'

potom dokonce i před každý insert, ale pokud si nechám vytáhnout data pomocí
mysql-query-browser
je diakritika špatně, taktéž i v prohlížeči db, který je integrován do IDE. Už nevím, co dalšího, jedině mě napadlo, pustit instanci win ve virtualboxu a v ní db, ale je to kanón na
vrabce, nebo tento projekt udržovat na win, protože bez databáze to nejede.
Díky za pomoc

Pavelp

  • Host
nastavení kódování mysql databáze
« Odpověď #8 kdy: 07 Června 2007, 21:31:36 »
Moment a v jakem prostredi ty data dolujete? to set names musi byt vzdycky podle klienta, NE podle databaze! A zkusil jste typ databaze Myisam? neni ten problem zpusobeny prave Innodb?

Aldik

  • Návštěvník
  • Příspěvků: 33
nastavení kódování mysql databáze
« Odpověď #9 kdy: 08 Června 2007, 08:01:48 »
Zdravím, data jsou dumpnutá ve Win pomocí Mysql front aplikace, tento sql script načtený
v mysql-query-browser a spuštěný (v něm sem přidal i SET NAMES 'cp1250';
SET CHARACTER SET 'cp1250'). Jinak k těm tabulkám, je velký rozdíl mezi typem Myisam a Innodb? Díky

Pavelp

  • Host
nastavení kódování mysql databáze
« Odpověď #10 kdy: 08 Června 2007, 11:00:38 »
Nemam tuseni, dokumentace Mysql. Co vim, je, ze ISAM struktura je specialni struktura pro databazove soubory, vymysleli ji tusim u IBM. Ona to neni ani databaze. Jsou to vzdy dva soubory, data a index. Mysql k tomu umi pristupovat a ruzne s tim a nad tim pracovat. Pouziva se ted v Mysql implicitne.

 

Provoz zaštiťuje spolek OpenAlt.