MySQL na lokále a na serveru aneb jak na malá písmena v názvech tabulek
5. 2. 2010 -
Každý, kdo vyvíjí na Windows, se setká s jiným chováním MySQL na Linuxu a na Windows.
Bolavým místem je právě citlivost na malá a velká písmena v názvech objektů - tabulek, procedur, indexů...
V čem je problém?
V tom, že aplikace s jiným case nastavením na produkčním serveru neběží. Forrest navíc používá jmennou konvenci tabulek s velkými písmeny v názvu tabulek. Nějaký parazit je však na lokále zakládá s malými písmeny, i když je definujete s velkými písmeny. V tu chvíli je problém na světě. Vaše SQL dumpy jsou pak se serverem nekompatibilní.
Kdo za to může?
Co když to dělá Navicat ? Zkoušel jsem jinou admin konsoli, chyba zůstala. Chyba – čili, že vlastnost se ukázala přímo v instalaci MySQL. Jeho výchozí nastavení po instalaci je na Linuxu jiné než na Windows!
Jak z toho ven?
Řešení naštěstí existuje. Testoval jsem různé rady s různým výsledkem. Níže je popsáno již ověřené řešení. Linux má jako výchozí natavení lower_case_table_names = 0, to znamená, že vše se porovnává vždy case sensitive. Kdežto Windows mají lower_case_table_names = 1, což způsobí konverzi všeho na malá písmena. Striktní nastavení lower_case_table_names = 0 na Windows však může působit problémy při dotazech. Zlatá střední cesta je nastavit tuto proměnnou na magickou hodnotu 2. Ta zajistí zachování původních tvarů jmen, je pak možné použít v názvech i camel konvenci. Jmenné porovnávání uvnitř databáze zůstává case insensitive.
| Value | Meaning |
|---|---|
| 0 | Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive. Note that if you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result. |
| 1 | Table names are stored in lowercase on disk and name comparisons are not case sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases. |
| 2 | Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive. This works only on file systems that are not case sensitive! InnoDB table names are stored in lowercase, as for lower_case_table_names=1. |
Kde to nastavím?
Zde záleží, jak MySQL spouštíte. Zda jako prosté exe nebo jako Windows service. Vždy jde o to, zatáhnout do hry soubor my.ini (pro úplnost, lze toto nastavení definovat i na jiném místě). My.ini je pak použit jako argument při spouštění, viz kroky níže. Pozn. pokud používáte balík XAMPP, kde je i MySQL, nemusíte 8 kroků níže vůbec absolvovat. Stačí vám jen úprava my.ini a restart servisu.
Postup nastavení při použití MySQL jako Windows servis
- Zastav MySQL servis
- Otevři aplikaci editor registrů (Start -> Run -> regedit)
- Hledej HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
- Najdi MySQL klíč. Název může nést i číslo verze databáze.
- Vpravo byste měli vidět klíč s názvem ImagePath. Double-click na tento klíč.
- Bude tam něco jako:
Code:
"C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt" MySQL
Potřebuje jej změnit na:
Code:
"C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\bin\my.ini" MySQL
Musíte samozřejmě doplnit své přesné cesty dle vaší instalace. Vaši cestu k my.ini souboru. Obvykle je v bin adresáři.
- Potvrďte kliknutím OK a zavřete regedit.
- Pro Ty, kdo používají XAMPP začíná návod zde. Změňte my.ini dle návodu níže. Já jej mám třeba v C:\XAMPP\mysql\bin. Jde tedy o bin adresář. Proměnná musí být nastavena v sekci [mysqld].
Nastavení my.ini
# The MySQL server [mysqld] basedir = "C:/XAMPP/mysql/" datadir = "C:/XAMPP/mysql/data/" # Add by Kha set-variable=lower_case_table_names=2 port = 3306 socket = "MySQL" skip-locking key_buffer = 16M max_allowed_packet = 1M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M
- Nastartujte MySQL servis
Někdy je nutné tabulky vytvořit znovu, aby se chovaly tak, jak potřebujete dle nastavení. Na nové tabulky toto opatření zabere OK. A to je vše. Enjoy!
odkazy
http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html
http://www.phpbuilder.com/board/showthread.php?t=10341
Pošli článek na: