Fórum Ubuntu CZ/SK
Ostatní => Archiv => Téma založeno: Aldik 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
-
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...
-
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.
-
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
-
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.
-
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.
-
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.
-
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
-
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?
-
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
-
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.