Category: "MySQL"
How to check what MySQL version I am using?
In order to determine which MySQL version you're running you can type the following command: mysql -V
Sample results:
# mysql -V
mysql Ver 14.7 Distrib 4.1.11, for pc-linux-gnu (i386)
# mysql -V
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (i486) using readline 5.2
Now, if you want to query for the version number while beign logged in (PHP script for example), just go with: SELECT VERSION();
.
I believe this is only working since MySQL 4 though.
Charsets in MySQL 4.1
Once you start messing around with charsets in MySQL you eventually get to a situation where the default charset for your database is UTF-8 but you want to import old backups in their own charset, for instance ISO-LATIN-1.
But when you import it, MySQL thinks it's UTF-8 and all your specials chars get messed up.
Simple solution, add this at the end of your CREATE TABLE statements:
DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci
More in the MySQL Manual.
Note: this does not convert your data, this does tell MySQL that those particular tables are in another charset. I think, if you want to convert, you need to change the charset of your connection at the time you do the import (using the --default-character-set
switch for example). Gotta re-check that though... but I think it can be overridden like this:
SET NAMES latin1
MySQL Data Integrity Enforcement Caveats
Okay, I desperately lack time to write full articles posts lately, so I'm going to make this quick! :P
Background: Suppose you have a table named Songs
and a table named Genres
. Genres
only contains Genre IDs and Genre Names. Songs
contains all sorts of data, but at some point there is one field (let's call it Song_Genre_ID
) that points to the Genre ID. Get the picture? I'm sorry, I don't have the time for an actual picture of this. That "pointer" is called a Foreign Key. The Genre_ID
, being the Primary key.
Data Integrity Enforcement means that MySQL is going to prevent you from putting any crappy value into the Foreign Key (FK) that would not exist in the refered Primary Key (PK). It will also prevent you from deleting a Genre if there are songs pointing to it. The bottom line is: if you're serious about your DB, you can't do without!
Now how would you enforce the integrity? Basically with something like this (but you may want to check the MySQL manual for details, right? :P):
ALTER TABLE Songs
ADD CONSTRAINT FK_any_name
FOREIGN KEY (Song_Genre_ID)
REFERENCES Genres (Genre_ID)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
Now, here's my point: from my experience I have found that a hell lot of things can go wrong when you try to add that constraint, and it can be a nightmare to find out what's going wrong! As a matter of fact, you'll find out MySQL's error messages aren't very helpful >:XX...
So here's a checklist to follow in order to find out what's been going wrong:
Okay I hope I didn't forget anything. Of course, if you find another reason for the constraint creation to fail, I'd love to hear about it! ;)
Good luck! :>>
MySQL features by version breakdown
I could not find anything like this on the net, so I thought I'd make my own chart and share it... ;)
MySQL version | 3.23.58 +InnoDB |
4.0.22 | 4.1.7 | 5.0 |
---|---|---|---|---|
Release date | 11-sept-03 | 27-oct-04 | 23-oct-04 | not stable yet |
Row level locking | yes | yes | yes | yes |
Transactions | yes | yes | yes | yes |
Foreign keys | yes | yes | yes | yes |
UNION | no | yes | yes | yes |
Subqueries (derived tables) | no | no | yes | yes |
Multiple table DELETEs | no | yes | yes | yes |
Unicode UTF-8 support | yes | yes | yes | yes |
Column level charset support | no | no | yes | yes |
Timezone handling | no | no | yes | yes |
Full text indexing (MyISAM only) | no UTF-8 | no UTF-8 | yes | yes |
Stored procedures | no | no | no | yes |
Rudimentary triggers | no | no | no | yes |
Updatatable views | no | no | no | yes |
Server side cursors | no | no | no | yes |
Master/slave one way replication | yes | yes | yes | yes |
Replication over SSL | no | no | yes | yes |
Clustering (not available on Windows) | no | no | yes | yes |
Note: I have not included MySQL 3.23 without InnoDB because that version can do vitually nothing interesting. It's a pure joke. Unfortunately, it is the kind of joke hosting providers like to try on you when they claim they offer you a "DBMS"... yeah right... call it an electronic rollodex, no more :>>
I'm a little bit too lazy for styling this right now, sorry.
If you notice an error, please be so nice and report it. Thanks ;)
Exporting MySQL databases
PhpMyAdmin does a pretty decent job at exporting MySql database with their structure and/or their data to a plain SQL file. One thing bugged me though: it encloses every table/column/whatever name in backquotes like in `addr_city` varchar(50)
. Who needs this? Are there really people who put spaces, commas, quotes and special chars in their database object names?? |-|
Today, I finally fixed this. You need to open config.inc.php and change this line:
$cfg['Export']['sql_backquotes'] = FALSE;
Life is good! :D