Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 


 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




Previous | Contents

21 How MySQL compares to other databases

21.1 How MySQL compares to mSQL

This section has been written by the MySQL developers, so it should be read with that in mind. But there are NO factual errors that we know of.

For a list of all supported limits, functions and types, see the crash-me web page.

Performance
For a true comparison of speed, consult the growing MySQL benchmark suite. See section 10.8 Using your own benchmarks. Because there is no thread creation overhead, a small parser, few features and simple security, mSQL should be quicker at:
  • Tests that perform repeated connects and disconnects, running a very simple query during each connection.
  • INSERT operations into very simple tables with few columns and keys.
  • CREATE TABLE and DROP TABLE.
  • SELECT on something that isn't an index. (A table scan is very easy.)
Since these operations are so simple, it is hard to be better at them when you have a higher startup overhead. After the connection is established, MySQL should perform much better. On the other hand, MySQL is much faster than mSQL (and most other SQL implementions) on the following:
  • Complex SELECT operations.
  • Retrieving large results (MySQL has a better, faster and safer protocol).
  • Tables with variable-length strings, since MySQL has more efficent handling and can have indexes on VARCHAR columns.
  • Handling tables with many columns.
  • Handling tables with large record lengths.
  • SELECT with many expressions.
  • SELECT on large tables.
  • Handling many connections at the same time. MySQL is fully multi-threaded. Each connection has its own thread, which means that no thread has to wait for another (unless a thread is modifying a table another thread wants to access.) In mSQL, once one connection is established, all others must wait until the first has finished, regardless of whether the connection is running a query that is short or long. When the first connection terminates, the next can be served, while all the others wait again, etc.
  • Joins. mSQL can become pathologically slow if you change the order of tables in a SELECT. In the benchmark suite, a time more than 15000 times slower than MySQL was seen. This is due to mSQL's lack of a join optimizer to order tables in the optimal order. However, if you put the tables in exactly the right order in mSQL2 and the WHERE is simple and uses index columns, the join will be relatively fast! See section 10.8 Using your own benchmarks.
  • ORDER BY and GROUP BY.
  • DISTINCT.
  • Using TEXT or BLOB columns.
SQL Features
  • GROUP BY and HAVING. mSQL does not support GROUP BY at all. MySQL supports a full GROUP BY with both HAVING and the following functions: COUNT(), AVG(), MIN(), MAX(), SUM() and STD(). COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved and there is no WHERE clause. MIN() and MAX() may take string arguments.
  • INSERT and UPDATE with calculations. MySQL can do calculations in an INSERT or UPDATE. For example:
    mysql> UPDATE SET x=x*10+y WHERE x<20;
    
  • Aliasing. MySQL has column aliasing.
  • Qualifying column names. In MySQL, if a column name is unique among the tables used in a query, you do not have to use the full qualifier.
  • SELECT with functions. MySQL has many functions (too many to list here; see section 7.4 Functions for use in SELECT and WHERE clauses).
Disk space efficiency
That is, how small can you make your tables? MySQL has very precise types, so you can create tables that take very little space. An example of a useful MySQL datatype is the MEDIUMINT that is 3 bytes long. If you have 100,000,000 records, saving even one byte per record is very important. mSQL2 has a more limited set of column types, so it is more difficult to get small tables.
Stability
This is harder to judge objectively. For a discussion of MySQL stability, see section 1.6 How stable is MySQL?. We have no experience with mSQL stability, so we cannot say anything about that.
Price
Another important issue is the license. MySQL has a more flexible license than mSQL, and is also less expensive than mSQL. Whichever product you choose to use, remember to at least consider paying for a license or email support. (You are required to get a license if you include MySQL with a product that you sell, of course.)
Perl interfaces
MySQL has basically the same interfaces to Perl as mSQL with some added features.
JDBC (Java)
MySQL currently has 4 JDBC drivers:
  • The gwe driver: A Java interface by GWE technologies (not supported anymore).
  • The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU
  • The twz driver: A type 4 JDBC driver by Terrence W. Zellers and educational use.
  • The mm driver: A type 4 JDBC driver by Mark Matthews
The recommended drivers are the twz or mm driver. Both are reported to work excellently. We know that mSQL has a JDBC driver, but we have too little experience with it to compare.
Rate of development
MySQL has a very small team of developers, but we are quite used to coding C and C++ very rapidly. Since threads, functions, GROUP BY and so on are still not implemented in mSQL, it has a lot of catching up to do. To get some perspective on this, you can view the mSQL 'HISTORY' file for the last year and compare it with the News section of the MySQL Reference Manual (see section D MySQL change history). It should be pretty obvious which one has developed most rapidly.
Utility programs
Both mSQL and MySQL have many interesting third-party tools. Since it is very easy to port upward (from mSQL to MySQL), almost all the interesting applications that are available for mSQL are also available for MySQL. MySQL comes with a simple msql2mysql program that fixes differences in spelling between mSQL and MySQL for the most-used C API functions. For example, it changes instances of msqlConnect() to mysql_connect(). Converting a client program from mSQL to MySQL usually takes a couple of minutes.

21.1.1 How to convert mSQL tools for MySQL

According to our experience, it would just take a few hours to convert tools such as msql-tcl and msqljava that use the mSQL C API so that they work with the MySQL C API.

The conversion procedure is:

  1. Run the shell script msql2mysql on the source. This requires the replace program, which is distributed with MySQL.
  2. Compile.
  3. Fix all compiler errors.

Differences between the mSQL C API and the MySQL C API are:

  • MySQL uses a MYSQL structure as a connection type (mSQL uses an int).
  • mysql_connect() takes a pointer to a MYSQL structure as a parameter. It is easy to define one globally or to use malloc() to get one. mysql_connect() also takes 2 parameters for specifying the user and password. You may set these to NULL, NULL for default use.
  • mysql_error() takes the MYSQL structure as a parameter. Just add the parameter to your old msql_error() code if you are porting old code.
  • MySQL returns an error number and a text error message for all errors. mSQL returns only a text error message.
  • Some incompatibilities exist as a result of MySQL supporting multiple connections to the server from the same process.

21.1.2 How mSQL and MySQL client/server communications protocols differ

There are enough differences that it is impossible (or at least not easy) to support both.

The most significant ways in which the MySQL protocol differs from the mSQL protocol are listed below:

  • A message buffer may contain many result rows.
  • The message buffers are dynamically enlarged if the query or the result is bigger than the current buffer, up to a configurable server and client limit.
  • All packets are numbered to catch duplicated or missing packets.
  • All column values are sent in ASCII. The lengths of columns and rows are sent in packed binary coding (1, 2 or 3 bytes).
  • MySQL can read in the result unbuffered (without having to store the full set in the client).
  • If a single write/read takes more than 30 seconds, the server closes the connection.
  • If a connection is idle for 8 hours, the server closes the connection.

21.1.3 How mSQL 2.0 SQL syntax differs from MySQL

Column types

MySQL
Has the following additional types (among others; see see section 7.7 CREATE TABLE syntax):
  • ENUM type for one of a set of strings.
  • SET type for many of a set of strings.
  • BIGINT type for 64-bit integers.
MySQL also supports the following additional type attributes:
  • UNSIGNED option for integer columns.
  • ZEROFILL option for integer columns.
  • AUTO_INCREMENT option for integer columns that are a PRIMARY KEY. See section 20.4.29 mysql_insert_id().
  • DEFAULT value for all columns.
mSQL2
mSQL column types correspond to the MySQL types shown below:
mSQL type Corresponding MySQL type
CHAR(len) CHAR(len)
TEXT(len) TEXT(len). len is the maximal length. And LIKE works.
INT INT. With many more options!
REAL REAL. Or FLOAT. Both 4- and 8-byte versions are available.
UINT INT UNSIGNED
DATE DATE. Uses ANSI SQL format rather than mSQL's own.
TIME TIME
MONEY DECIMAL(12,2). A fixed-point value with two decimals.

Index creation

MySQL
Indexes may be specified at table creation time with the CREATE TABLE statement.
mSQL
Indexes must be created after the table has been created, with separate CREATE INDEX statements.

To insert a unique identifier into a table

MySQL
Use AUTO_INCREMENT as a column type specifier. See section 20.4.29 mysql_insert_id().
mSQL
Create a SEQUENCE on a table and select the _seq column.

To obtain a unique identifier for a row

MySQL
Add a PRIMARY KEY or UNIQUE key to the table.
mSQL
Use the _rowid column. Observe that _rowid may change over time depending on many factors.

To get the time a column was last modified

MySQL
Add a TIMESTAMP column to the table. This column is automatically set to the current date and time for INSERT or UPDATE statements if you don't give the column a value or if you give it a NULL value.
mSQL
Use the _timestamp column.

NULL value comparisons

MySQL
MySQL follows ANSI SQL and a comparison with NULL is always NULL.
mSQL
In mSQL, NULL = NULL is TRUE. You must change =NULL to IS NULL and <>NULL to IS NOT NULL when porting old code from mSQL to MySQL.

String comparisons

MySQL
Normally, string comparisons are performed in case-independent fashion with the sort order determined by the current character set (ISO-8859-1 Latin1 by default). If you don't like this, declare your columns with the BINARY attribute, which causes comparisons to be done according to the ASCII order used on the MySQL server host.
mSQL
All string comparisons are performed in case-sensitive fashion with sorting in ASCII order.

Case-insensitive searching

MySQL
LIKE is a case-insensitive or case-sensitive operator, depending on the columns involved. If possible, MySQL uses indexes if the LIKE argument doesn't start with a wildcard character.
mSQL
Use CLIKE.

Handling of trailing spaces

MySQL
Strips all spaces at the end of CHAR and VARCHAR columns. Use a TEXT column if this behavior is not desired.
mSQL
Retains trailing space.

WHERE clauses

MySQL
MySQL correctly prioritizes everything (AND is evaluated before OR). To get mSQL behavior in MySQL, use parentheses (as shown below).
mSQL
Evaluates everything from left to right. This means that some logical calculations with more than three arguments cannot be expressed in any way. It also means you must change some queries when you upgrade to MySQL. You do this easily by adding parentheses. Suppose you have the following mSQL query:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
To make MySQL evaluate this the way that mSQL would, you must add parentheses:
mysql> SELECT * FROM table WHERE (a=1
 AND (b=2 OR (a=3 AND (b=4))));

Access control

MySQL
Has tables to store grant (permission) options per user, host and database. See section 6.8 How the privilege system works.
mSQL
Has a file 'mSQL.acl' in which you can grant read/write privileges for users.

21.2 How MySQL compares to PostgreSQL

PostgreSQL has some more advanced features like user-defined types, triggers, rules and some transaction support. However, PostgreSQL lacks many of the standard types and functions from ANSI SQL and ODBC. See the crash-me web page for a complete list of limits and which types and functions are supported or unsupported.

Normally, PostgreSQL is a magnitude slower than MySQL. See section 10.8 Using your own benchmarks. This is due largely to their transactions system. If you really need transactions or the rich type system PostgreSQL offers and you can afford the speed penalty, you should take a look at PostgreSQL.

A Some MySQL users

A.1 General news sites

  • A pro-Linux/tech news and comment/discussion site
  • All about Linux
  • 32Bits Online: because there's more than one way to compute
  • New about new versions of computer related stuff
  • @end itemize

    A.2 Some Web search engines

    A.3 Some Information search engines concentrated on some area

    A.4 Web sites the use MySQL as a backed

    A.5 Some Domain/Internet/Web and related services

    A.6 Web sites that use PHP and MySQL

    A.7 Some MySQL consultants

    A.8 Programming

    A.9 Uncategorized pages

    Send any additions to this list to webmaster@mysql.com.

    B Contributed programs

    Many users of MySQL have contributed very useful support tools and addons.

    A list of what is available at http://www.mysql.com/Contrib (or any mirror) is shown below. If you want to build MySQL support for the Perl DBI/DBD interface, you should fetch the Data-Dumper, DBI, and Msql-Mysql-modules files and install them. See section 4.10 Perl installation comments.

    00-README This listing.

    B.1 API's

    B.2 Clients

    B.3 Web tools

    B.4 Authentication tools

    B.5 Converters

    • dbf2mysql-1.13.tgz Convert between '.dbf' files and MySQL tables. By Maarten Boekhold, boekhold@cindy.et.tudelft.nl, and Michael Widenius. This converter can't handle MEMO fields.
    • dbf2mysql.zip Convert between FoxPro '.dbf' files and MySQL tables on Win32. By Alexander Eltsyn, ae@nica.ru or ae@usa.net.
    • dump2h-1.20.gz Convert from mysqldump output to a C header file. By Harry Brueckner,
    • exportsql.txt A script that is similar to access_to_mysql.txt, except that this one is fully configurable, has better type conversion (including detection of TIMESTAMP fields), provides warnings and suggestions while converting, quotes all special characters in text and binary data, and so on. It will also convert to mSQL v1 and v2, and is free of charge for anyone. See http://www.cynergi.net/prod/exportsql/ for latest version. By Pedro Freire, support@cynergi.net. Note: Doesn't work with Access2!
    • access_to_mysql.txt Paste this function into an Access module of a database which has the tables you want to export. See also exportsql. By Brian Andrews. Note: Doesn't work with Access2!
    • importsql.txt A script that does the exact reverse of exportsql.txt. That is, it imports data from MySQL into an Access database via ODBC. This is very handy when combined with exportSQL, since it lets you use Access for all DB design and administration, and synchronize with your actual MySQL server either way. Free of charge. See http://www.netdive.com/freebies/importsql/ for any updates. Created by Laurent Bossavit of NetDIVE. Note: Doesn't work with Access2!
    • /msql2mysqlWrapper 1.0 A C wrapper from mSQL to MySQL. By alfred@sb.net
    • sqlconv.pl A simple script that can be used to copy fields from one MySQL table to another in bulk. Basically, you can run mysqldump and pipe it to the sqlconv.pl script and the script will parse through the mysqldump output and will rearrange the fields so they can be inserted into a new table. An example is when you want to create a new table for a different site you are working on, but the table is just a bit different (ie - fields in different order, etc.). By Steve Shreeve.

    B.6 Using MySQL with other products

    B.7 Useful tools

    B.8 Uncategorized

    C Contributors to MySQL

    Contributors to the MySQL distribution are listed below, in somewhat random order:

    Michael (Monty) Widenius
    Has written the following parts of MySQL:
    • All the main code in mysqld.
    • New functions for the string library.
    • Most of the mysys library.
    • The ISAM and MyISAM libraries (B-tree index file handlers with index compression and different record formats).
    • The heap library. A memory table system with our superior full dynamic hashing. In use since 1981 and published around 1984.
    • The replace program (look into it, it's COOL!).
    • MyODBC, the ODBC driver for Windows95.
    • Fixing bugs in MIT-pthreads to get it to work for MySQL. And also Unireg, a curses-based application tool with many utilities.
    • Porting of mSQL tools like msqlperl, DBD/DBI and DB2mysql.
    • Most parts of crash-me and the MySQL benchmarks.
    David Axmark
    • Coordinator and main writer for the Reference Manual, including enhancements to texi2html. Also automatic website updating from this manual.
    • Autoconf, Automake and libtool support.
    • The licensing stuff.
    • Parts of all the text files. (Nowadays only the 'README' is left. The rest ended up in the manual.)
    • Our Mail master.
    • Lots of testing of new features.
    • Our in-house "free" software lawyer.
    • Mailing list maintainer (who never has the time to do it right...)
    • Our original portability code (more than 10 years old now). Nowadays only some parts of mysys are left.
    • Someone for Monty to call in the middle of the night when he just got that new feature to work. :-)
    Paul DuBois
    Help with making the Reference Manual correct and understandable.
    Gianmassimo Vigazzola qwerg@mbox.vol.it or qwerg@tin.it
    The initial port to Win32/NT.
    Kim Aldale
    Rewriting Monty's and David's attempts at English into English.
    Allan Larsson (The BOSS at TcX)
    For all the time he has allowed Monty to spend on this "maybe useful" tool (MySQL). Dedicated user (and bug finder) of Unireg & MySQL.
    Per Eric Olsson
    For more or less constructive criticism and real testing of the dynamic record format.
    Irena Pancirov irena@mail.yacc.it
    Win32 port with Borland compiler. mysqlshutdown.exe and mysqlwatch.exe
    David J. Hughes
    For the effort to make a shareware SQL database. We at TcX started with mSQL, but found that it couldn't satisfy our purposes so instead we wrote a SQL interface to our application builder Unireg. mysqladmin and mysql are programs that were largely influenced by their mSQL counterparts. We have put a lot of effort into making the MySQL syntax a superset of mSQL. Many of the APIs ideas are borrowed from mSQL to make it easy to port free mSQL programs to MySQL. MySQL doesn't contain any code from mSQL. Two files in the distribution ('client/insert_test.c' and 'client/select_test.c') are based on the corresponding (non-copyrighted) files in the mSQL distribution, but are modified as examples showing the changes necessary to convert code from mSQL to MySQL. (mSQL is copyrighted David J. Hughes.)
    Fred Fish
    For his excellent C debugging and trace library. Monty has made a number of smaller improvements to the library (speed and additional options).
    Richard A. O'Keefe
    For his public domain string library.
    Henry Spencer
    For his regex library, used in WHERE column REGEXP regexp.
    Free Software Foundation
    From whom we got an excellent compiler (gcc), the libc library (from which we have borrowed 'strto.c' to get some code working in Linux) and the readline library (for the mysql client).
    Free Software Foundation & The XEmacs development team
    For a really great editor/environment used by almost everybody at TcX/detron.
    Igor Romanenko igor@frog.kiev.ua
    mysqldump (previously msqldump, but ported and enhanced by Monty).
    Tim Bunce, Alligator Descartes
    For the DBD (Perl) interface.
    Andreas Koenig a.koenig@mind.de
    For the Perl interface to MySQL.
    Eugene Chan eugene@acenet.com.sg
    For porting PHP to MySQL.
    Michael J. Miller Jr. mke@terrapin.turbolift.com
    For the first MySQL manual. And a lot of spelling/language fixes for the FAQ (that turned into the MySQL manual a long time ago).
    Giovanni Maruzzelli maruzz@matrice.it
    For porting iODBC (Unix ODBC).
    Chris Provenzano
    Portable user level pthreads. From the copyright: This product includes software developed by Chris Provenzano, the University of California, Berkeley, and contributors. We are currently using version 1_60_beta6 patched by Monty (see 'mit-pthreads/Changes-mysql').
    Xavier Leroy Xavier.Leroy@inria.fr
    The author of LinuxThreads (used by MySQL on Linux).
    Zarko Mocnik zarko.mocnik@dem.si
    Sorting for Slovenian language and the 'cset.tar.gz' module that makes it easier to add other character sets.
    "TAMITO" tommy@valley.ne.jp
    The _MB character set macros and the ujis and sjis character sets.
    Yves Carlier Yves.Carlier@rug.ac.be
    mysqlaccess, a program to show the access rights for a user.
    Rhys Jones rhys@wales.com (And GWE Technologies Limited)
    For the JDBC, a module to extract data from MySQL with a Java client.
    Dr Xiaokun Kelvin ZHU X.Zhu@brad.ac.uk
    Further development of the JDBC driver and other MySQL-related Java tools.
    James Cooper pixel@organic.com
    For setting up a searchable mailing list archive at his site.
    Rick Mehalick Rick_Mehalick@i-o.com
    For xmysql, a graphical X client for MySQL.
    Doug Sisk sisk@wix.com
    For providing RPM packages of MySQL for RedHat Linux.
    Diemand Alexander V. axeld@vial.ethz.ch
    For providing RPM packages of MySQL for RedHat Linux/Alpha.
    Antoni Pamies Olive toni@readysoft.es
    For providing RPM versions of a lot of MySQL clients for Intel and SPARC.
    Jay Bloodworth jay@pathways.sde.state.sc.us
    For providing RPM versions for MySQL 3.21 versions.
    Jochen Wiedmann wiedmann@neckar-alb.de
    For maintaining the Perl DBD::mysql module.
    Therrien Gilbert gilbert@ican.net, Jean-Marc Pouyot jmp@scalaire.fr
    French error messages.
    Petr snajdr, snajdr@pvt.net
    Czech error messages.
    Jaroslaw Lewandowski jotel@itnet.com.pl
    Polish error messages.
    Miguel Angel Fernandez Roiz
    Spanish error messages.
    Roy-Magne Mo rmo@www.hivolda.no
    Norwegian error messages and testing of 3.21.#.
    Timur I. Bakeyev root@timur.tatarstan.ru
    Russian error messages.
    brenno@dewinter.com && Filippo Grassilli phil@hyppo.com
    Italian error messages.
    Dirk Munzinger dirk@trinity.saar.de
    German error messages.
    Billik Stefan billik@sun.uniag.sk
    Slovak error messages.
    David Sacerdote davids@secnet.com
    Ideas for secure checking of DNS hostnames.
    Wei-Jou Chen jou@nematic.ieo.nctu.edu.tw
    Some support for Chinese(BIG5) characters.
    Wei He hewei@mail.ied.ac.cn
    A lot of functionality for the Chinese(GBK) character set.
    Zeev Suraski bourbon@netvision.net.il
    FROM_UNIXTIME() time formatting, ENCRYPT() functions, and bison adviser. Active mailing list member.
    Luuk de Boer luuk@wxs.nl
    Ported (and extended) the benchmark suite to DBI/DBD. Have been of great help with crash-me and running benchmarks. Some new date functions. The mysql_setpermissions script.
    Jay Flaherty fty@utk.edu
    Big parts of the Perl DBI/DBD section in the manual.
    Paul Southworth pauls@etext.org, Ray Loyzaga yar@cs.su.oz.au
    Proof-reading of the Reference Manual.
    Alexis Mikhailov root@medinf.chuvashia.su
    User definable functions (UDFs); CREATE FUNCTION and DROP FUNCTION.
    Andreas F. Bobak bobak@relog.ch
    The AGGREGATE extension to UDF functions.
    Ross Wakelin R.Wakelin@march.co.uk
    Help to set up InstallShield for MySQL-Win32.
    Jethro Wright III jetman@li.net
    The 'libmysql.dll' library.
    James Pereria jpereira@iafrica.com
    Mysqlmanager, a Win32 GUI tool for administrating MySQL.
    Curt Sampson cjs@portal.ca
    Porting of MIT-pthreads to NetBSD/Alpha and NetBSD 1.3/i386.
    Sinisa Milivojevic sinisa@coresinc.com
    Compression (with zlib) to the client/server protocol. Perfect hashing for the lexical analyzer phase.
    Antony T. Curtis antony.curtis@olcs.net
    Porting of MySQL to OS/2.
    Martin Ramsch m.ramsch@computer.org
    Examples in the MySQL Tutorial.

    Other contributors, bugfinders and testers: James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke, jehamby@lightside, psmith@BayNetworks.COM, Mike Simons, Jaakko Hyv@"atti.

    And lots of bug report/patches from the folks on the mailing list.

    And a big tribute to those that help us answer questions on the mysql@lists.mysql.com mailing list:

    Daniel Koch dkoch@amcity.com
    Irix setup.
    Luuk de Boer luuk@wxs.nl
    Benchmark questions.
    Tim Sailer tps@users.buoy.com
    DBD-mysql questions.
    Boyd Lynn Gerber gerberb@zenez.com
    SCO related questions.
    Richard Mehalick RM186061@shellus.com
    xmysql-releated questions and basic installation questions.
    Zeev Suraski bourbon@netvision.net.il
    Apache module configuration questions (log & auth), PHP-related questions, SQL syntax related questions and other general questions.
    Francesc Guasch frankie@citel.upc.es
    General questions.
    Jonathan J Smith jsmith@wtp.net
    Questions pertaining to OS-specifics with Linux, SQL syntax, and other things that might be needing some work.
    David Sklar sklar@student.net
    Using MySQL from PHP and Perl.
    Alistair MacDonald A.MacDonald@uel.ac.uk
    Not yet specified, but is flexible and can handle Linux and maybe HP-UX. Will try to get user to use mysqlbug.
    John Lyon jlyon@imag.net
    Questions about installing MySQL on Linux systems, using either '.rpm' files, or compiling from source.
    Lorvid Ltd. lorvid@WOLFENET.com
    Simple billing/license/support/copyright issues.
    Patrick Sherrill patrick@coconet.com
    ODBC and VisualC++ interface questions.
    Randy Harmon rjharmon@uptimecomputers.com
    DBD, Linux, some SQL syntax questions.

    D MySQL change history

    Note that we tend to update the manual at the same time we implement new things to MySQL. If you find a version listed below that you can't find on the MySQL download page, this means that the version has not yet been released!

    D.1 Changes in release 3.23.x (Released as alpha)

    The major difference between release 3.23 and releases 3.22 and 3.21 is that 3.23 contains a new ISAM library (MyISAM), which is more tuned for SQL than the old ISAM was.

    The 3.23 release is under development, and things will be added at a fast pace to it. For the moment we recommend this version only for users that desperately need a new feature that is found only in this release (like big file support and machine-independent tables). (Note that all new functionality in MySQL 3.23 is extensively tested, but as this release involves much new code, it's difficult to test everything). This version should start to stabilize as soon as we get subselects included in it.

    D.1.1 Changes in release 3.23.8

    • Fixed problem with timezones that are < GMT -11.
    • Fixed a bug when deleting packed keys in NISAM.
    • Fixed problem with ISAM when doing some ORDER BY .. DESC queries.
    • Fixed bug when doing a join on a text key which didn't cover the whole key.
    • Option --delay-key-write didn't enable delayed key writing.
    • Fixed update of TEXT column which only involved case changes.
    • Fixed that INSERT DELAYED doesn't update timestamps that are given.
    • Added function YEARWEEK() and options x, X, v and V to DATE_FORMAT().
    • Fixed problem with MAX(indexed_column) and HEAP tables.
    • Fixed problem with BLOB NULL keys and LIKE "prefix%".
    • Fixed problem with MyISAM and fixed length rows < 5 bytes.
    • Fixed problem that could cause MySQL to touch freed memory when doing very complicated GROUP BY queries.
    • Fixed core dump if you got a crashed table where an ENUM field value was too big.

    D.1.2 Changes in release 3.23.7

    • Fixed workaround under Linux to avoid problems with pthread_mutex_timedwait, which is used with INSERT DELAYED. See section 4.11.5 Linux notes (all Linux versions).
    • Fixed that one will get a 'disk full' error message if one gets disk full when doing sorting (instead of waiting until we got more disk space).
    • Fixed a bug in MyISAM with keys > 250 characters.
    • In MyISAM one can now do an INSERT at the same time as other threads are reading from the table.
    • Added variable max_write_lock_count to mysqld to force a READ lock after a certain number of WRITE locks.
    • Inverted flag delayed_key_write on show variables.
    • Renamed variable concurrency to thread_concurrency.
    • The following functions are now multi-byte-safe: LOCATE(substr,str), POSITION(substr IN str), LOCATE(substr,str,pos), INSTR(str,substr), LEFT(str,len), RIGHT(str,len), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len), MID(str,pos,len), SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING_INDEX(str,delim,count), RTRIM(str), TRIM([[BOTH | TRAILING] [remstr] FROM] str), REPLACE(str,from_str,to_str), REVERSE(str), INSERT(str,pos,len,newstr), LCASE(str), LOWER(str), UCASE(str) and UPPER(str); Patch by Wei He.
    • Fix core dump when releasing a lock from a non existing table.
    • Remove locks on tables before starting to remove duplicates.
    • Added option FULL to SHOW PROCESSLIST.
    • Added option --verbose to mysqladmin.
    • Fixed problem when automaticly converting HEAP to MyISAM.
    • Fixed bug in HEAP tables when doing insert + delete + insert + scan the table.
    • Fixed bugs on Alpha with REPLACE() and LOAD DATA INFILE.
    • Added mysqld variable interactive_timeout.
    • Changed the argument to mysql_data_seek() from ulong to ulonglong.

    D.1.3 Changes in release 3.23.6

    • Added mysqld option -O lower_case_table_names={0|1} to allow users to force table names to lower case.
    • Added SELECT ... INTO DUMPFILE.
    • Added mysqld option --ansi to make some functions ANSI SQL compatible.
    • Temporary tables now starts with #sql.
    • Added quoting of identifiers with ' (" in --ansi mode).
    • Changed to use snprintf() when printing floats to avoid some buffer overflows on FREEBSD.
    • Made [floor() overflow safe on FREEBSD.
    • Added option --quote-names to mysqldump
    • Fixed bug that one could make a part of a PRIMARY KEY NOT NULL.
    • Fixed encrypt() to be thread safe and not reuse buffer.
    • Added mysql_odbc_escape_string() function to support big5 characters in MyOBC.
    • Rewrote the table handler to use classes. This introduces a lot of new code, but will make table handling faster and better...
    • Added patch by Sasha for user defined variables.
    • Changed that FLOAT and DOUBLE (without any length modifiers) are not anymore fixed decimal point numbers.
    • Changed the meaning of FLOAT(X): Now this is the same as FLOAT if X <= 24 and a DOUBLE if 24 < X <= 53.
    • DECIMAL(X) is now an alias for DECIMAL(X,0) and DECIMAL is now an alias for DECIMAL(10,0). The same goes for NUMERIC.
    • Added option ROW_FORMAT={default | dynamic | static | compressed} to CREATE_TABLE.
    • DELETE FROM table_name didn't work on temporary tables.
    • Changed function CHAR_LENGTH() to be multi-byte character safe.
    • Added function ORD(string).

    D.1.4 Changes in release 3.23.5

    • Fixed some Y2K problems in the new date handling in 3.23.
    • Fixed problem with SELECT DISTINCT ... ORDER BY RAND().
    • Added patches by Sergei A. Golubchik for text searching on the MyISAM level.
    • Fixed cache overflow problem when using full joins without keys.
    • Fixed some configure issues.
    • Some small changes to make parsing faster.
    • ALTER TABLE + adding a column after the last field didn't work.
    • Fixed problem when using an auto_increment column in two keys
    • One can now with MyISAM have the auto_increment part as a sub part: CREATE TABLE foo (a int not null auto_increment, b char(5), primary key (b,a))
    • Fixed bug in MyISAM with packed char keys that could be NULL.
    • AS on fieldname with CREATE TABLE table_name SELECT ... didn't work.
    • Allow use of NATIONAL and NCHAR when defining character columns. This is the same as not using BINARY.
    • Don't allow NULL columns in a PRIMARY KEY (only in UNIQUE keys).
    • Clear LAST_INSERT_ID if in uses this in ODBC: WHERE auto_increment_column IS NULL. This seams to fix some problems with Access.
    • SET SQL_AUTO_IS_NULL=0|1 now turns off/on the handling of searching after the last inserted row with WHERE auto_increment_column IS NULL.
    • Added new mysqld variable concurrency for Solaris.
    • Added option --relative to mysqladmin to make extended-status more useful to monitor changes.
    • Fixed bug when using COUNT(DISTINCT..) on an empty table.
    • Added support for the Chinese character set GBK.
    • Fixed problem with LOAD DATA INFILE and BLOB columns.
    • Added bit operator ~ (negation).
    • Fixed problem with UDF functions.

    D.1.5 Changes in release 3.23.4

    • Inserting a DATETIME into a TIME column will not anymore try to store 'days' in it.
    • Fixed problem with storage of float/double on low endian machines. (This affected SUM().)
    • Added connect timeout on TCP/IP connections.
    • Fixed problem with LIKE "%" on a index that may have NULL values.
    • REVOKE ALL PRIVILEGES didn't revoke all privileges.
    • Allow creation of temporary tables with same name as the original table.
    • When granting a user a grant option for a database, he couldn't grant privileges to other users.
    • New command: SHOW GRANTS FOR user (by Sinisa).
    • New date_add syntax: date/datetime + INTERVAL # interval_type. By Joshua Chamas.
    • Fixed privilege check for LOAD DATA REPLACE.
    • Automatic fixing of broken include files on Solaris 2.7
    • Some configure issues to fix problems with big file system detection.
    • REGEXP is now case insensitive if you use not binary strings.

    D.1.6 Changes in release 3.23.3

      Added patches for MIT-pthreads on NetBSD.
    • Fixed range bug in MyISAM.
    • ASC is now the default again for ORDER BY.
    • Added LIMIT to UPDATE.
    • New client function: mysql_change_user().
    • Added character set to SHOW VARIABLES.
    • Added support of --[whitespace] comments.
    • Allow INSERT into tbl_name VALUES (), that is, you may now specify an empty value list to insert a row in which each column is set to its default value.
    • Changed SUBSTRING(text FROM pos) to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
    • SUM(..) with GROUP BY returned 0 on some systems.
    • Changed output for SHOW TABLE STATUS.
    • Added DELAY_KEY_WRITE option to CREATE TABLE.
    • Allow AUTO_INCREMENT on any key part.
    • Fixed problem with YEAR(NOW()) and YEAR(CURDATE()).
    • Added CASE construct.
    • New function COALESCE().

    D.1.7 Changes in release 3.23.2

    • Fixed range optimizer bug: SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const). The bug was that some rows could be duplicated in the result.
    • Running myisamchk without -a updated the index distribution wrong.
    • SET SQL_LOW_PRIORITY_UPDATES=1 gave parse error before.
    • You can now update indexes columns that are used in the WHERE clause. UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100
    • Date handling should now be a bit faster.
    • Added handling of fuzzy dates (dates where day or month is 0): (Like: 1999-01-00)
    • Fixed optimization of SELECT ... WHERE key_part1=const1 AND key_part_2=const2 AND key_part1=const4 AND key_part2=const4 ; Indextype should be range instead of ref.
    • Fixed egcs 1.1.2 optimizer bug (when using BLOBs) on Linux Alpha.
    • Fixed problem with LOCK TABLES combined with DELETE FROM table.
    • MyISAM tables now allow keys on NULL and BLOB/TEXT columns.
    • The following join is now much faster: SELECT ... FROM t1 LEFT JOIN t2 ON ... WHERE t2.not_null_column IS NULL.
    • ORDER BY and GROUP BY can be done on functions.
    • Changed handling of 'const_item' to allow handling of ORDER BY RAND().
    • Indexes are now used for WHERE key_column = function.
    • Indexes are now used for WHERE key_column = column_name even if the columns are not identically packed.
    • Indexes are now used for WHERE column_name IS NULL.
    • Changed heap tables to be stored in low_byte_first order (to make it easy to convert to MyISAM tables)
    • Automatic change of HEAP temporary tables to MyISAM tables in case of 'table is full' errors.
    • Added option --init-file=file_name to mysqld.
    • COUNT(DISTINCT value,[value,...])
    • CREATE TEMPORARY TABLE now creates a temporary table, in its own namespace, that is automatically deleted if connection is dropped.
    • New keywords (required for CASE): CASE, THEN, WHEN, ELSE and END.
    • New functions EXPORT_SET() and MD5().
    • Support for the GB2312 Chinese character set.

    D.1.8 Changes in release 3.23.1

    • Fixed some compilation problems.

    D.1.9 Changes in release 3.23.0

      A new table handler library (MyISAM) with a lot of new features. See section 9.4 MySQL table types.
    • You can create in-memory HEAP tables which are extremely fast for lookups.
    • Support for big files (63 bit) on OSes that support big files.
    • New function LOAD_FILE(filename) to get the contents of a file as a string value.
    • New operator <=> which will act as = but will return TRUE if both arguments are NULL. This is useful for comparing changes between tables.
    • Added the ODBC 3.0 EXTRACT(interval FROM datetime) function.
    • Columns defined as FLOAT(X) is not rounded on storage and may be in scientific notation (1.0 E+10) when retrieved.
    • REPLACE is now faster than before.
    • Changed LIKE character comparison to behave as =; This means that 'e' LIKE "e' is now true.
    • SHOW TABLE STATUS returns a lot of information about the tables.
    • Added LIKE to the SHOW STATUS command.
    • Added privilege column to SHOW COLUMNS.
    • Added columns packed and comment to SHOW INDEX.
    • Added comments to tables (with CREATE TABLE ... COMMENT "xxx").
    • Added UNIQUE, as in CREATE TABLE table_name (col int not null UNIQUE)
    • New create syntax: CREATE TABLE table_name SELECT ....
    • New create syntax: CREATE TABLE IF NOT EXISTS ...
    • Allow creation of CHAR(0) columns.
    • DATE_FORMAT() now requires '%' before any format character.
    • DELAYED is now a reserved word (sorry about that :( ).
    • An example procedure is added: analyse, file: 'sql_analyse.c'. This will describe the data in your query. Try the following:
      SELECT ... FROM ... WHERE
       ... PROCEDURE ANALYSE([max elements,[max memory]])
      
      This procedure is extremely useful when you want to check the data in your table!
    • BINARY cast to force a string to be compared case sensitively.
    • Added option --skip-show-database to mysqld.
    • Check if a row has changed in an UPDATE now also works with BLOB/TEXT columns.
    • Added the INNER join syntax. NOTE: This made INNER an reserved word!
    • Added support for netmasks to the hostname in the MySQL tables. You can specify a netmask using the IP/NETMASK syntax.
    • If you compare a NOT NULL DATE/DATETIME column with IS NULL, this is changed to a compare against 0 to satisfy some ODBC applications. (By shreeve@uci.edu).
    • NULL IN (...) now returns NULL instead of 0. This will ensure that null_column NOT IN (...) doesn't match NULL values.
    • Fix storage of floating point values in TIME columns.
    • Changed parsing of TIME strings to be more strict. Now the fractional second part is detected (and currently skipped). The following formats are supported:
      [[DAYS] [H]H:]MM:]SS[.fraction]
      [[[[[H]H]H]H]MM]SS[.fraction]
    • Detect (and ignore) second fraction part from DATETIME.
    • Added the LOW_PRIORITY attribute to LOAD DATA INFILE.
    • The default index name now uses the same case as the used column name.
    • Changed default number of connections to 100.
    • Use bigger buffers when using LOAD DATA INFILE.
    • DECIMAL(x,y) now works according to ANSI SQL.
    • Added aggregate UDF functions. Thanks to Andreas F. Bobak
    • LAST_INSERT_ID() is now updated for INSERT INTO ... SELECT.
    • Some small changes to the join table optimizer to make some joins faster.
    • SELECT DISTINCT is much faster; It uses the new UNIQUE functionality in MyISAM. One difference compared to MySQL 3.22 is that the output of DISTINCT is not sorted anymore.
    • All C client API macros are now functions to make shared libraries more reliable. Because of this, you can no longer call mysql_num_fields() on a MYSQL object, you must use mysql_field_count() instead.
    • Added use of LIBEWRAP; Patch by Henning P . Schmiedehausen.
    • Don't allow AUTO_INCREMENT for other than numerical columns.
    • Using AUTO_INCREMENT will now automatically make the column NOT NULL.
    • Show NULL as the default value for AUTO_INCREMENT columns.
    • Added SQL_BIG_RESULT; SQL_SMALL_RESULT is now default.
    • Added a shared library RPM. This enchancement was contributed by David Fox (dsfox@cogsci.ucsd.edu).
    • Added a --enable-large-files/--disable-large-files switch to configure. See 'configure.in' for some systems where this is automatically turned off because of broken implementations.
    • Upgraded readline to 4.0.
    • New CREATE TABLE options: PACK_KEYS and CHECKSUM.
    • Added mysqld option --default-table-type.

    D.2 Changes in release 3.22.x

    The 3.22 version has faster and safer connect code and a lot of new nice enhancements. The reason for not including these changes in the 3.21 version is mainly that we are trying to avoid big changes to 3.21 to keep it as stable as possible. As there aren't really any MAJOR changes, upgrading to 3.22 should be very easy and painless. See section 4.16.2 Upgrading from a 3.21 version to 3.22.

    3.22 should also be used with the new DBD-mysql (1.20xx) driver that can use the new connect protocol!

    D.2.1 Changes in release 3.22.29

    • Fixed problem with timezones that are < GMT -11.
    • Fixed a bug when deleting packed keys in NISAM.
    • Fixed problem that could cause MySQL to touch freed memory when doing very complicated GROUP BY queries.
    • Fixed core dump if you got a crashed table where an ENUM field value was too big.
    • Added mysqlshutdown.exe and mysqlwatch.exe to the Windows distribution.
    • Fixed problem when doing ORDER BY on a reference key.
    • Fixed that INSERT DELAYED doesn't update timestamps that are given.

    D.2.2 Changes in release 3.22.28

    • Fixed problem with LEFT JOIN and COUNT() on a column which was declared NULL + and it had a DEFAULT value.
    • Fixed core dump problem when using CONCAT() in a WHERE clause.
    • Fixed problem with AVG() and STD() with NULL values.

    D.2.3 Changes in release 3.22.27

    • Fixed prototype in 'my_ctype.h' when using other character sets.
    • Some configure issues to fix problems with big file system detection.
    • Fixed problem when sorting on big blob columns.
    • ROUND() will now work on Win32.

    D.2.4 Changes in release 3.22.26

    • Fixed core dump with empty BLOB/TEXT column to REVERSE().
    • Extended /*! */ with version numbers.
    • Changed SUBSTRING(text FROM pos) to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
    • Fixed problem with LOCK TABLES combined with DELETE FROM table
    • Fixed problem that INSERT ... SELECT didn't use SQL_BIG_TABLES.
    • SET SQL_LOW_PRIORITY_UPDATES=# didn't work.
    • Password wasn't updated correctly if privileges didn't change on: GRANT ... IDENTIFIED BY
    • Fixed range optimizer bug in SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const)
    • Fixed bug in compression key handling in ISAM.

    D.2.5 Changes in release 3.22.25

    • Fixed some small problems with the installation.

    D.2.6 Changes in release 3.22.24

    • DATA is not a reserved word anymore.
    • Fixed optimizer bug with tables with only one row.
    • Fixed bug when using LOCK TABLES table_name READ; FLUSH TABLES;
    • Applied some patches for HP-UX.
    • isamchk should now work on Win32.
    • Changed 'configure' to not use big file handling on Linux as this crashes some RedHat 6.0 systems

    D.2.7 Changes in release 3.22.23

    • Upgraded to use Autoconf 2.13, Automake 1.4 and libtool 1.3.2.
    • Better support for SCO in configure.
    • Added option --defaults-file=### to option file handling to force use of only one specific option file.
    • Extended CREATE syntax to ignore MySQL 3.23 keywords.
    • Fixed deadlock problem when using INSERT DELAYED on a table locked with LOCK TABLES.
    • Fixed deadlock problem when using DROP TABLE on a table that was locked by another thread.
    • Add logging of GRANT/REVOKE commands in the update log.
    • Fixed isamchk to detect a new error condition.
    • Fixed bug in NATURAL LEFT JOIN.

    D.2.8 Changes in release 3.22.22

    • Fixed problem in the C API when you called mysql_close() directly after mysql_init().
    • Better client error message when you can't open socket.
    • Fixed delayed_insert_thread counting when you couldn't create a new delayed_insert thread.
    • Fixed bug in CONCAT() with many arguments.
    • Added patches for DEC 3.2 and SCO.
    • Fixed path-bug when installing MySQL as a service on NT.
    • The MySQL-Win32 version is now compiled with VC++ 6.0 instead of with VC++ 5.0.
    • New installation setup for MySQL-Win32.

    D.2.9 Changes in release 3.22.21

    • Fixed problem with DELETE FROM TABLE when table was locked by another thread.
    • Fixed bug in LEFT JOIN involving empty tables.
    • Changed the mysql.db column from char(32) to char(60).
    • MODIFY and DELAYED are not reserved words anymore.
    • Fixed a bug when storing days in a TIME column.
    • Fixed a problem with Host '..' is not allowed to connect to this MySQL server after one had inserted a new MySQL user with a GRANT command.
    • Changed to use TCP_NODELAY also on Linux (Should give faster TCP/IP connections).

    D.2.10 Changes in release 3.22.20

    • Fixed STD() for big tables when result should be 0.
    • The update log didn't have newlines on some operating systems.
    • INSERT DELAYED had some garbage at end in the update log.

    D.2.11 Changes in release 3.22.19

    • Fixed bug in mysql_install_db (from 3.22.17).
    • Changed default key cache size to 8M.
    • Fixed problem with queries that needed temporary tables with BLOB columns.

    D.2.12 Changes in release 3.22.18

    • Fixes a fatal problem in 3.22.17 on Linux; After shutdown all threads didn't die properly.
    • Added option -O flush-time=# to mysqld. This is mostly useful on Win32 and tells how often MySQL should close all unused tables and flush all updated tables to disk.
    • Fixed problem that a VARCHAR column compared with CHAR column didn't use keys efficiently.

    D.2.13 Changes in release 3.22.17

    • Fixed a core dump problem when using --log-update and connecting without a default database.
    • Fixed some configure and portability problems.
    • Using LEFT JOIN on tables that had circular dependencies caused mysqld to hang forever.

    D.2.14 Changes in release 3.22.16

    • mysqladmin processlist could kill the server if a new user logged in.
    • DELETE FROM tbl_name WHERE key_column=col_name didn't find any matching rows. Fixed.
    • DATE_ADD(column,...) didn't work.
    • INSERT DELAYED could deadlock with status 'upgrading lock'
    • Extended ENCRYPT() to take longer salt strings than 2 characters.
    • longlong2str is now much faster than before. For Intel x86 platforms, this function is written in optimized assembler.
    • Added the MODIFY keyword to ALTER TABLE.

    D.2.15 Changes in release 3.22.15

    • GRANT used with IDENTIFIED BY didn't take effect until privileges were flushed.
    • Name change of some variables in SHOW STATUS.
    • Fixed problem with ORDER BY with 'only index' optimzation when there were multiple key definitions for a used column.
    • DATE and DATETIME columns are now up to 5 times faster than before.
    • INSERT DELAYED can be used to let the client do other things while the server inserts rows into a table.
    • LEFT JOIN USING (col1,col2) didn't work if one used it with tables from 2 different databases.
    • LOAD DATA LOCAL INFILE didn't work in the Unix version because of a missing file.
    • Fixed problems with VARCHAR/BLOB on very short rows (< 4 bytes); error 127 could occur when deleting rows.
    • Updating BLOB/TEXT through formulas didn't work for short (< 256 char) strings.
    • When you did a GRANT on a new host, mysqld could die on the first connect from this host.
    • Fixed bug when one used ORDER BY on column name that was the same name as an alias.
    • Added BENCHMARK(loop_count,expression) function to time expressions.

    D.2.16 Changes in release 3.22.14

    • Allow empty arguments to mysqld to make it easier to start from shell scripts.
    • Setting a TIMESTAMP column to NULL didn't record the timestamp value in the update log.
    • Fixed lock handler bug when one did INSERT INTO TABLE ... SELECT ... GROUP BY.
    • Added a patch for localtime_r() on Win32 so that it will not crash anymore if your date is > 2039, but instead will return a time of all zero.
    • Names for user-defined functions are no longer case sensitive.
    • Added escape of ^Z (ASCII 26) to \Z as ^Z doesn't work with pipes on Win32.
    • mysql_fix_privileges adds a new column to the mysql.func to support aggregate UDF functions in future MySQL releases.

    D.2.17 Changes in release 3.22.13

    • Saving NOW(), CURDATE() or CURTIME() directly in a column didn't work.
    • SELECT COUNT(*) ... LEFT JOIN ... didn't work with no WHERE part.
    • Updated 'config.guess' to allow MySQL to configure on UnixWare 7.0.x.
    • Changed the implementation of pthread_cond() on the Win32 version. get_lock() now correctly times out on Win32!

    D.2.18 Changes in release 3.22.12

    • Fixed problem when using DATE_ADD() and DATE_SUB() in a WHERE clause.
    • You can now set the password for a user with the GRANT ... TO user IDENTIFIED BY 'password' syntax.
    • Fixed bug in GRANT checking with SELECT on many tables.
    • Added missing file mysql_fix_privilege_tables to the RPM distribution. This is not run by default since it relies on the client package.
    • Added option SQL_SMALL_RESULT to SELECT to force use of fast temporary tables when you know that the result set will be small.
    • Allow use of negative real numbers without a decimal point.
    • Day number is now adjusted to maximum days in month if the resulting month after DATE_ADD/DATE_SUB() doesn't have enough days.
    • Fix that GRANT compares columns in case-insensitive fashion.
    • Fixed a bug in 'sql_list.h' that made ALTER TABLE dump core in some contexts.
    • The hostname in user@hostname can now include '.' and '-' without quotes in the context of the GRANT, REVOKE and SET PASSWORD FOR ... statements.
    • Fix for isamchk for tables which need big temporary files.

    D.2.19 Changes in release 3.22.11

    • IMPORTANT: You must run the mysql_fix_privilege_tables script when you upgrade to this version! This is needed because of the new GRANT system. If you don't do this, you will get Access denied when you try to use ALTER TABLE, CREATE INDEX or DROP INDEX.
    • GRANT to allow/deny users table and column access.
    • Changed USER() to return user@host
    • Changed the syntax for how to set PASSWORD for another user.
    • New command FLUSH STATUS that sets most status variables to zero.
    • New status variables: aborted_threads, aborted_connects.
    • New option variable: connection_timeout.
    • Added support for Thai sorting (by Pruet Boonma
    • Slovak and japanese error messages.
    • Configuration and portability fixes.
    • Added option SET SQL_WARNINGS=1 to get a warning count also for simple inserts.
    • MySQL now uses SIGTERM instead of SIGQUIT with shutdown to work better on FreeBSD.
    • Added option \G (print vertically) to mysql.
    • SELECT HIGH_PRIORITY ... killed mysqld.
    • IS NULL on a AUTO_INCREMENT column in a LEFT JOIN didn't work as expected.
    • New function MAKE_SET().

    D.2.20 Changes in release 3.22.10

    • mysql_install_db no longer starts the MySQL server! You should start mysqld with safe_mysqld after installing it! The MySQL RPM will however start the server as before.
    • Added --bootstrap option to mysqld and recoded mysql_install_db to use it. This will make it easier to install MySQL with RPMs.
    • Changed +, - (sign and minus), *, /, %, ABS() and MOD() to be BIGINT aware (64-bit safe).
    • Fixed a bug in ALTER TABLE that caused mysqld to crash.
    • MySQL now always reports the conflicting key values when a duplicate key entry occurs. (Before this was only reported for INSERT).
    • New syntax: INSERT INTO tbl_name SET col_name=value,col_name=value,...
    • Most errors in the '.err' log are now prefixed with a time stamp.
    • Added option MYSQL_INIT_COMMAND to mysql_options() to make a query on connect or reconnect.
    • Added option MYSQL_READ_DEFAULT_FILE and MYSQL_READ_DEFAULT_GROUP to mysql_options() to read the following parameters from the MySQL option files: port, socket, compress, password, pipe, timeout, user, init-command, host and database.
    • Added maybe_null to the UDF structure.
    • Added option IGNORE to INSERT statemants with many rows.
    • Fixed some problems with sorting of the koi8 character sets; Users of koi8 MUST run isamchk -rq on each table that has an index on a CHAR or VARCHAR column.
    • New script mysql_setpermission, by Luuk de Boer, allows one to easily create new users with permissions for specific databases.
    • Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column separators with LOAD DATA INFILE).
    • Ported to OS/2 (thanks to Antony T. Curtis antony.curtis@olcs.net).
    • Added more variables to SHOW STATUS and changed format of output to be like SHOW VARIABLES.
    • Added extended-status command to mysqladmin which will show the new status variables.

    D.2.21 Changes in release 3.22.9

    • SET SQL_LOG_UPDATE=0 caused a lockup of the server.
    • New SQL command: FLUSH [ TABLES | HOSTS | LOGS | PRIVILEGES ] [, ...]
    • New SQL command: KILL thread_id.
    • Added casts and changed include files to make MySQL easier to compile on AIX and DEC OSF1 4.x
    • Fixed conversion problem when using ALTER TABLE from a INT to a short CHAR() column.
    • Added SELECT HIGH_PRIORITY; This will get a lock for the SELECT even if there is a thread waiting for another SELECT to get a WRITE LOCK.
    • Moved wild_compare to string class to be able to use LIKE on BLOB/TEXT columns with \0.
    • Added ESCAPE option to LIKE.
    • Added a lot more output to mysqladmin debug.
    • You can now start mysqld on Win32 with the --flush option. This will flush all tables to disk after each update. This makes things much safer on NT/Win98 but also MUCH slower.

    D.2.22 Changes in release 3.22.8

    • Czech character sets should now work much better. You must also install ftp://www.mysql.com/pub/mysql/Downloads/Patches/czech-3.22.8-patch. This patch should also be installed if you are using a character set with uses my_strcoll()! The patch should always be safe to install (for any system), but as this patch changes ISAM internals it's not yet in the default distribution.
    • DATE_ADD() and DATE_SUB() didn't work with group functions.
    • mysql will now also try to reconnect on USE DATABASE commands.
    • Fix problem with ORDER BY and LEFT JOIN and const tables.
    • Fixed problem with ORDER BY if the first ORDER BY column was a key and the rest of the ORDER BY columns wasn't part of the key.
    • Fixed a big problem with OPTIMIZE TABLE.
    • MySQL clients on NT will now by default first try to connect with named pipes and after this with TCP/IP.
    • Fixed a problem with DROP TABLE and mysqladmin shutdown on Win32 (a fatal bug from 3.22.6).
    • Fixed problems with TIME columns and negative strings.
    • Added an extra thread signal loop on shutdown to avoid some error messages from the client.
    • MySQL now uses the next available number as extension for the update log file.
    • Added patches for UNIXWARE 7.

    D.2.23 Changes in release 3.22.7

    • Added LIMIT clause for the DELETE statement.
    • You can now use the /*! ... */ syntax to hide MySQL-specific keywords when you write portable code. MySQL will parse the code inside the comments as if the surrounding /*! and */ comment characters didn't exist.
    • OPTIMIZE TABLE tbl_name can now be used to reclaim disk space after many deletes. Currently, this uses ALTER TABLE to re-generate the table, but in the future it will use an integrated isamchk for more speed.
    • Upgraded libtool to get the configure more portable.
    • Fixed slow UPDATE and DELETE operations when using DATETIME or DATE keys.
    • Changed optimizer to make it better at deciding when to do a full join and when using keys.
    • You can now use mysqladmin proc to display information about your own threads. Only users with the Process_priv privilege can get information about all threads.
    • Added handling of formats YYMMDD, YYYYMMDD, YYMMDDHHMMSS for numbers when using DATETIME and TIMESTAMP types. (Formerly these formats only worked with strings.)
    • Added connect option CLIENT_IGNORE_SPACE to allow use of spaces after function names and before '(' (Powerbuilder requires this). This will make all function names reserved words.
    • Added the --log-long-format option to mysqld to enable timestamps and INSERT_ID's in the update log.
    • Added --where option to mysqldump (patch by Jim Faucette).
    • The lexical analyzer now uses "perfect hashing" for faster parsing of SQL statements.

    D.2.24 Changes in release 3.22.6

    • Faster mysqldump.
    • For the LOAD DATA INFILE statement, you can now use the new LOCAL keyword to read the file from the client. mysqlimport will automatically use LOCAL when importing with the TCP/IP protocol.
    • Fixed small optimize problem when updating keys.
    • Changed makefiles to support shared libraries.
    • MySQL-NT can now use named pipes, which means that you can now use MySQL-NT without having to install TCP/IP.

    D.2.25 Changes in release 3.22.5

    • All table lock handing is changed to avoid some very subtle deadlocks when using DROP TABLE, ALTER TABLE, DELETE FROM TABLE and mysqladmin flush-tables under heavy usage. Changed locking code to get better handling of locks of different types.
    • Updated DBI to 1.00 and DBD to 1.2.0.
    • Added a check that the error message file contains error messages suitable for the current version of mysqld. (To avoid errors if you accidentally try to use an old error message file.)
    • All count structures in the client (affected_rows(), insert_id(),...) are now of type BIGINT to allow 64-bit values to be used. This required a minor change in the MySQL protocol which should affect only old clients when using tables with AUTO_INCREMENT values > 24M.
    • The return type of mysql_fetch_lengths() has changed from uint * to ulong *. This may give a warning for old clients but should work on most machines.
    • Change mysys and dbug libraries to allocate all thread variables in one struct. This makes it easier to make a threaded 'libmysql.dll' library.
    • Use the result from gethostname() (instead of uname()) when constructing '.pid' file names.
    • New better compressed server/client protocol.
    • COUNT(), STD() and AVG() are extended to handle more than 4G rows.
    • You can now store values in the range -838:59:59 <= x <= 838:59:59 in a TIME column.
    • WARNING: INCOMPATIBLE CHANGE!! If you set a TIME column to too short a value, MySQL now assumes the value is given as: [[[D ]HH:]MM:]SS instead of HH[:MM[:SS]].
    • TIME_TO_SEC() and SEC_TO_TIME() can now handle negative times and hours up to 32767.
    • Added new option SET OPTION SQL_LOG_UPDATE={0|1} to allow users with the process privilege to bypass the update log. (Modified patch from Sergey A Mukhin violet@rosnet.net.)
    • Fixed fatal bug in LPAD().
    • Initialize line buffer in 'mysql.cc' to make BLOB reading from pipes safer.
    • Added -O max_connect_errors=# option to mysqld. Connect errors are now reset for each correct connection.
    • Increased the default value of max_allowed_packet to 1M in mysqld.
    • Added --low-priority-updates option to mysqld, to give table-modifying operations (INSERT, REPLACE, UPDATE, DELETE) lower priority than retrievals. You can now use {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... You can also use SET OPTION SQL_LOW_PRIORITY_UPDATES={0|1} to change the priority for one thread. One side effect is that LOW_PRIORITY is now a reserved word. :(
    • Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement.
    • INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously only INSERT ... SELECT and LOAD DATA INFILE were cached.)
    • Allow GROUP BY functions with HAVING:
      mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0;
      
    • mysqld will now ignore trailing ';' characters in queries. This is to make it easier to migrate from some other SQL servers that require the trailing ';'.
    • Fix for corrupted fixed-format output generated by SELECT INTO OUTFILE.
    • WARNING: INCOMPATIBLE CHANGE!! Added Oracle GREATEST() and LEAST() functions. You must now use these instead of the MAX() and MIN() functions to get the largest/smallest value from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) values.
    • WARNING: INCOMPATIBLE CHANGE!! DAYOFWEEK() had offset 0 for Sunday. Changed the offset to 1.
    • Give an error for queries that mix GROUP BY columns and fields when there is no GROUP BY specification.
    • Added --vertical option to mysql, for printing results in vertical mode.
    • Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0, this works only for numeric columns. See section 10.4 MySQL index use.
    • Lots of new benchmarks.
    • A new C API chapter and lots of other improvements in the manual.

    D.2.26 Changes in release 3.22.4

    • Added --tmpdir option to mysqld, for specifying the location of the temporary file directory.
    • MySQL now automatically changes a query from an ODBC client:
      SELECT ... FROM table WHERE auto_increment_column IS NULL
      
      to:
      SELECT ... FROM table WHERE
       auto_increment_column == LAST_INSERT_ID()
      
      This allows some ODBC programs (Delphi, Access) to retrieve the newly inserted row to fetch the AUTO_INCREMENT id.
    • DROP TABLE now waits for all users to free a table before deleting it.
    • Fixed small memory leak in the new connect protocol.
    • New functions BIN(), OCT(), HEX() and CONV() for converting between different number bases.
    • Added function SUBSTRING() with 2 arguments.
    • If you created a table with a record length smaller than 5, you couldn't delete rows from the table.
    • Added optimization to remove const reference tables from ORDER BY and GROUP BY.
    • mysqld now automatically disables system locking on Linux and Win32, and for systems that use MIT-pthreads. You can force the use of locking with the --enable-locking option.
    • Added --console option to mysqld, to force a console window (for error messages) when using Win32.
    • Fixed table locks for Win32.
    • Allow '$' in identifiers.
    • Changed name of user-specific configuration file from 'my.cnf' to '.my.cnf' (Unix only).
    • Added DATE_ADD() and DATE_SUB() functions.

    D.2.27 Changes in release 3.22.3

    • Fixed a lock problem (bug in MySQL 3.22.1) when closing temporary tables.
    • Added missing mysql_ping() to the client library.
    • Added --compress option to all MySQL clients.
    • Changed byte to char in 'mysql.h' and 'mysql_com.h'.

    D.2.28 Changes in release 3.22.2

    • Searching on multiple constant keys that matched more than 30% of the rows didn't always use the best possible key.
    • New functions <<, >>, RPAD() and LPAD().
    • You can now save default options (like passwords) in a configuration file ('my.cnf').
    • Lots of small changes to get ORDER BY to work when no records are found when using fields that are not in GROUP BY (MySQL extension).
    • Added --chroot option to mysqld, to start mysqld in a chroot environment (by Nikki Chumakov nikkic@cityline.ru).
    • Trailing spaces are now ignored when comparing case-sensitive strings; this should fix some problems with ODBC and flag 512!
    • Fixed a core-dump bug in the range optimizer.
    • Added --one-thread option to mysqld, for debugging with LinuxThreads (or glibc). (This replaces the -T32 flag)
    • Added DROP TABLE IF EXISTS to prevent an error from occurring if the table doesn't exist.
    • IF and EXISTS are now reserved words (they would have to be sooner or later).
    • Added lots of new options to mysqldump.
    • Server error messages are now in 'mysqld_error.h'.
    • The server/client protocol now supports compression.
    • All bug fixes from MySQL 3.21.32.

    D.2.29 Changes in release 3.22.1

    • Added new C API function mysql_ping().
    • Added new API functions mysql_init() and mysql_options(). You now MUST call mysql_init() before you call mysql_real_connect(). You don't have to call mysql_init() if you only use mysql_connect().
    • Added mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...) so you can set a timeout for connecting to a server.
    • Added --timeout option to mysqladmin, as a test of mysql_options().
    • Added AFTER column and FIRST options to ALTER TABLE ... ADD columns. This makes it possible to add a new column at some specific location within a row in an existing table.
    • WEEK() now takes an optional argument to allow handling of weeks when the week starts on Monday (some European countries). By default, WEEK() assumes the week starts on Sunday.
    • TIME columns weren't stored properly (bug in MySQL 3.22.0).
    • UPDATE now returns information about how many rows were matched and updated, and how many "warnings" occurred when doing the update.
    • Fixed incorrect result from FORMAT(-100,2).
    • ENUM and SET columns were compared in binary (case-sensitive) fashion; changed to be case insensitive.

    D.2.30 Changes in release 3.22.0

    • New (backward compatible) connect protocol that allows you to specify the database to use when connecting, to get much faster connections to a specific database. The mysql_real_connect() call is changed to:
      mysql_real_connect(MYSQL *mysql, const char *host,
                         const char *user,
                         const char *passwd,
                         const char *db, uint port,
                         const char *unix_socket,
                         uint client_flag)
      
    • Each connection is handled by its own thread, rather than by the master accept() thread. This fixes permanently the telnet bug that was a topic on the mail list some time ago.
    • All TCP/IP connections are now checked with backward resolution of the hostname to get better security. mysqld now has a local hostname resolver cache so connections should actually be faster than before, even with this feature.
    • A site automatically will be blocked from future connections if someone repeatedly connects with an "improper header" (like when one uses telnet).
    • You can now refer to tables in different databases with references of the form tbl_name@db_name or db_name.tbl_name. This makes it possible to give a user read access to some tables and write access to others simply by keeping them in different databases!
    • Added --user option to mysqld, to allow it to run as another Unix user (if it is started as the Unix root user).
    • Added caching of users and access rights (for faster access rights checking)
    • Normal users (not anonymous ones) can change their password with mysqladmin password 'new_password'. This uses encrypted passwords that are not logged in the normal MySQL log!
    • All important string functions are now coded in assembler for x86 Linux machines. This gives a speedup of 10% in many cases.
    • For tables that have many columns, the column names are now hashed for much faster column name lookup (this will speed up some benchmark tests a lot!)
    • Some benchmarks are changed to get better individual timing. (Some loops were so short that a specific test took < 2 seconds. The loops have been changed to take about 20 seconds to make it easier to compare different databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better)
    • Re-arranged SELECT code to handle some very specific queries involving group functions (like COUNT(*)) without a GROUP BY but with HAVING. The following now works:
      mysql> SELECT count(*) as C FROM table HAVING C > 1;
      
    • Changed the protocol for field functions to be faster and avoid some calls to malloc().
    • Added -T32 option to mysqld, for running all queries under the main thread. This makes it possible to debug mysqld under Linux with gdb!
    • Added optimization of not_null_column IS NULL (needed for some Access queries).
    • Allow STRAIGHT_JOIN to be used between two tables to force the optimizer to join them in a specific order.
    • String functions now return VARCHAR rather than CHAR and the column type is now VARCHAR for fields saved as VARCHAR. This should make the MyODBC driver better, but may break some old MySQL clients that don't handle FIELD_TYPE_VARCHAR the same way as FIELD_TYPE_CHAR.
    • CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE TABLE is still the recommended (fast) way to create indexes.
    • Added --set-variable option wait_timeout to mysqld.
    • Added time column to mysqladmin processlist to show how long a query has taken or how long a thread has slept.
    • Added lots of new variables to show variables and some new to show status.
    • Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155.
    • Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created with the new date type if you don't use the --old-protocol option to mysqld.
    • Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.
    • Added --enable-assembler option to configure, for x86 machines (tested on Linux + gcc). This will enable assembler functions for the most important string functions for more speed!

    D.3 Changes in release 3.21.x

    D.3.1 Changes in release 3.21.33

    • Fixed problem when sending SIGHUP to mysqld; mysqld core dumped when starting from boot on some systems.
    • Fixed problem with losing a little memory for some connections.
    • DELETE FROM tbl_name without a WHERE condition is now done the long way when you use LOCK TABLES or if the table is in use, to avoid race conditions.
    • INSERT INTO TABLE (timestamp_column) VALUES (NULL); didn't set timestamp.

    D.3.2 Changes in release 3.21.32

    • Fixed some possible race conditions when doing many reopen/close on the same tables under heavy load! This can happen if you execute mysqladmin refresh often. This could in some very rare cases corrupt the header of the index file and cause error 126 or 138.
    • Fixed fatal bug in refresh() when running with the --skip-locking option. There was a "very small" time gap after a mysqladmin refresh when a table could be corrupted if one thread updated a table while another thread did mysqladmin refresh and another thread started a new update ont the same table before the first thread had finished. A refresh (or --flush-tables) will now not return until all used tables are closed!
    • SELECT DISTINCT with a WHERE clause that didn't match any rows returned a row in some contexts (bug only in 3.21.31).
    • GROUP BY + ORDER BY returned one empty row when no rows where found.
    • Fixed a bug in the range optimizer that wrote Use_count: Wrong count for ... in the error log file.

    D.3.3 Changes in release 3.21.31

    • Fixed a sign extension problem for the TINYINT type on Irix.
    • Fixed problem with LEFT("constant_string",function).
    • Fixed problem with FIND_IN_SET().
    • LEFT JOIN core dumped if the second table is used with a constant WHERE/ON expression that uniquely identifies one record.
    • Fixed problems with DATE_FORMAT() and incorrect dates. DATE_FORMAT() now ignores '%' to make it possible to extend it more easily in the future.

    D.3.4 Changes in release 3.21.30

    • mysql now returns an exit code > 0 if the query returned an error.
    • Saving of command line history to file in mysql client. By Tommy Larsen tommy@mix.hive.no.
    • Fixed problem with empty lines that were ignored in 'mysql.cc'.
    • Save the pid of the signal handler thread in the pid file instead of the pid of the main thread.
    • Added patch by tommy@valley.ne.jp to support Japanese characters SJIS and UJIS.
    • Changed safe_mysqld to redirect startup messages to 'hostname'.err instead of 'hostname'.log to reclaim file space on mysqladmin refresh.
    • ENUM always had the first entry as default value.
    • ALTER TABLE wrote two entries to the update log.
    • sql_acc() now closes the mysql grant tables after a reload to save table space and memory.
    • Changed LOAD DATA to use less memory with tables and BLOB columns.
    • Sorting on a function which made a division / 0 produced a wrong set in some cases.
    • Fixed SELECT problem with LEFT() when using the czech character set.
    • Fixed problem in isamchk; it couldn't repair a packed table in a very unusual case.
    • SELECT statements with & or | (bit functions) failed on columns with NULL values.
    • When comparing a field = field, where one of the fields was a part key, only the length of the part key was compared.

    D.3.5 Changes in release 3.21.29

    • LOCK TABLES + DELETE from tbl_name never removed locks properly.
    • Fixed problem when grouping on an OR function.
    • Fixed permission problem with umask() and creating new databases.
    • Fixed permission problem on result file with SELECT ... INTO OUTFILE ...
    • Fixed problem in range optimizer (core dump) for a very complex query.
    • Fixed problem when using MIN(integer) or MAX(integer) in GROUP BY.
    • Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha).
    • Fixed bug in WEEK("XXXX-xx-01").

    D.3.6 Changes in release 3.21.28

    • Fixed socket permission (clients couldn't connect to Unix socket on Linux).
    • Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.

    D.3.7 Changes in release 3.21.27

    • Added user level lock functions GET_LOCK(string,timeout), RELEASE_LOCK(string).
    • Added opened_tables to show status.
    • Changed connect timeout to 3 seconds to make it somewhat harder for crackers to kill mysqld through telnet + TCP/IP.
    • Fixed bug in range optimizer when using WHERE key_part_1 >= something AND key_part_2 <= something_else.
    • Changed configure for detection of FreeBSD 3.0 9803xx and above
    • WHERE with string_column_key = constant_string didn't always find all rows if the column had many values differing only with characters of the same sort value (like e and 'e).
    • Strings keys looked up with 'ref' were not compared in case-sensitive fashion.
    • Added umask() to make log files non-readable for normal users.
    • Ignore users with old (8-byte) password on startup if not using --old-protocol option to mysqld.
    • SELECT which matched all key fields returned the values in the case of the matched values, not of the found values. (Minor problem.)

    D.3.8 Changes in release 3.21.26

    • FROM_DAYS(0) now returns "0000-00-00".
    • In DATE_FORMAT(), PM and AM were swapped for hours 00 and 12.
    • Extended the default maximum key size to 256.
    • Fixed bug when using BLOB/TEXT in GROUP BY with many tables.
    • An ENUM field that is not declared NOT NULL has NULL as the default value. (Previously, the default value was the first enumeration value.)
    • Fixed bug in the join optimizer code when using many part keys on the same key: INDEX (Organization,Surname(35),Initials(35)).
    • Added some tests to the table order optimizer to get some cases with SELECT ... FROM many_tables much faster.
    • Added a retry loop around accept() to possibly fix some problems on some Linux machines.

    D.3.9 Changes in release 3.21.25

    • Changed typedef 'string' to typedef 'my_string' for better portability.
    • You can now kill threads that are waiting on a disk full condition.
    • Fixed some problems with UDF functions.
    • Added long options to isamchk. Try isamchk --help.
    • Fixed a bug when using 8 bytes long (alpha); filesort() didn't work. Affects DISTINCT, ORDER BY and GROUP BY on 64-bit processors.

    D.3.10 Changes in release 3.21.24

    • Dynamic loadable functions. Based on source from Alexis Mikhailov.
    • You couldn't delete from a table if no one had done a SELECT on the table.
    • Fixed problem with range optimizer with many OR operators on key parts inside each other.
    • Recoded MIN() and MAX() to work properly with strings and HAVING.
    • Changed default umask value for new files from 0664 to 0660.
    • Fixed problem with LEFT JOIN and constant expressions in the ON part.
    • Added Italian error messages from brenno@dewinter.com.
    • configure now works better on OSF1 (tested on 4.0D).
    • Added hooks to allow LIKE optimization with international character support.
    • Upgraded DBI to 0.93.

    D.3.11 Changes in release 3.21.23

    • The following symbols are now reserved words: TIME, DATE, TIMESTAMP, TEXT, BIT, ENUM, NO, ACTION, CHECK, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, STATUS, VARIABLES.
    • Setting a TIMESTAMP to NULL in LOAD DATA INFILE ... didn't set the current time for the TIMESTAMP.
    • Fix BETWEEN to recognize binary strings. Now BETWEEN is case sensitive.
    • Added --skip-thread-priority option to mysqld, for systems where mysqld's thread scheduling doesn't work properly (BSDI 3.1).
    • Added ODBC functions DAYNAME() and MONTHNAME().
    • Added function TIME_FORMAT(). This works like DATE_FORMAT(), but takes a time string ('HH:MM:DD') as argument.
    • Fixed unlikely(?) key optimizer bug when using ORs of key parts inside ANDs.
    • Added command variables to mysqladmin.
    • A lot of small changes to the binary releases.
    • Fixed a bug in the new protocol from MySQL 3.21.20.
    • Changed ALTER TABLE to work with Win32 (Win32 can't rename open files). Also fixed a couple of small bugs in the Win32 version.
    • All standard MySQL clients are now ported to MySQL-Win32.
    • MySQL can now be started as a service on NT.

    D.3.12 Changes in release 3.21.22

    • Starting with this version, all MySQL distributions will be configured, compiled and tested with crash-me and the benchmarks on the following platforms: SunOS 5.6 sun4u, SunOS 5.5.1 sun4u, SunOS 4.14 sun4c, SunOS 5.6 i86pc, Irix 6.3 mips5k, HP-UX 10.20 hppa, AIX 4.2.1 ppc, OSF1 V4.0 alpha, FreeBSD 2.2.2 i86pc and BSDI 3.1 i386.
    • Fix COUNT(*) problems when the WHERE clause didn't match any records. (Bug from 3.21.17.)
    • Removed that NULL = NULL is true. Now you must use IS NULL or IS NOT NULL to test whether or not a value is NULL. (This is according to ANSI SQL but may break old applications that are ported from mSQL.) You can get the old behavior by compiling with -DmSQL_COMPLIANT.
    • Fixed bug that core dumped when using many LEFT OUTER JOIN clauses.
    • Fixed bug in ORDER BY on string formula with possible NULL values.
    • Fixed problem in range optimizer when using <= on sub index.
    • Added functions DAYOFYEAR(), DAYOFMONTH(), MONTH(), YEAR(), WEEK(), QUARTER(), HOUR(), MINUTE(), SECOND() and FIND_IN_SET().
    • Added command SHOW VARIABLES.
    • Added support of "long constant strings" from ANSI SQL:
      mysql> SELECT 'first ' 'second';       -> 'first second'
      
    • Upgraded mSQL-Mysql-modules to 1.1825.
    • Upgraded mysqlaccess to 2.02.
    • Fixed problem with Russian character set and LIKE.
    • Ported to OpenBSD 2.1.
    • New Dutch error messages.

    D.3.13 Changes in release 3.21.21a

    • Configure changes for some operating systems.

    D.3.14 Changes in release 3.21.21

    • Fixed optimizer bug when using WHERE data_field = date_field2 AND date_field2 = constant.
    • Added command SHOW STATUS.
    • Removed 'manual.ps' from the source distribution to make it smaller.

    D.3.15 Changes in release 3.21.20

    • Changed the maximum table name and column name lengths from 32 to 64.
    • Aliases can now be of "any" length.
    • Fixed mysqladmin stat to return the right number of queries.
    • Changed protocol (downward compatible) to mark if a column has the AUTO_INCREMENT attribute or is a TIMESTAMP. This is needed for the new Java driver.
    • Added Hebrew sorting order by Zeev Suraski.
    • Solaris 2.6: Fixed configure bugs and increased maximum table size from 2G to 4G.

    D.3.16 Changes in release 3.21.19

    • Upgraded DBD to 1823. This version implements mysql_use_result in DBD-Mysql.
    • Benchmarks updated for empress (by Luuk).
    • Fixed a case of slow range searching.
    • Configure fixes ('Docs' directory).
    • Added function REVERSE() (by Zeev Suraski).

    D.3.17 Changes in release 3.21.18

    • Issue error message if client C functions are called in wrong order.
    • Added automatic reconnect to the 'libmysql.c' library. If a write command fails, an automatic reconnect is done.
    • Small sort sets no longer use temporary files.
    • Upgraded DBI to 0.91.
    • Fixed a couple of problems with LEFT OUTER JOIN.
    • Added CROSS JOIN syntax. CROSS is now a reserved word.
    • Recoded yacc/bison stack allocation to be even safer and to allow MySQL to handle even bigger expressions.
    • Fixed a couple of problems with the update log.
    • ORDER BY was slow when used with key ranges.

    D.3.18 Changes in release 3.21.17

    • Changed documentation string of --with-unix-socket-path to avoid confusion.
    • Added ODBC and ANSI SQL style LEFT OUTER JOIN.
    • The following are new reserved words: LEFT, NATURAL, USING.
    • The client library now uses the value of the environment variable MYSQL_HOST as the default host if it's defined.
    • SELECT col_name, SUM(expr) now returns NULL for col_name when there are matching rows.
    • Fixed problem with comparing binary strings and BLOBs with ASCII characters over 127.
    • Fixed lock problem: when freeing a read lock on a table with multiple read locks, a thread waiting for a write lock would have been given the lock. This shouldn't affect data integrity, but could possibly make mysqld restart if one thread was reading data that another thread modified.
    • LIMIT offset,count didn't work in INSERT ... SELECT.
    • Optimized key block caching. This will be quicker than the old algorithm when using bigger key caches.

    D.3.19 Changes in release 3.21.16

    • Added ODBC 2.0 & 3.0 functions POWER(), SPACE(), COT(), DEGREES(), RADIANS(), ROUND(2 arg) and TRUNCATE().
    • WARNING: INCOMPATIBLE CHANGE!! LOCATE() parameters were swapped according to ODBC standard. Fixed.
    • Added function TIME_TO_SEC().
    • In some cases, default values were not used for NOT NULL fields.
    • Timestamp wasn't always updated properly in UPDATE SET ... statements.
    • Allow empty strings as default values for BLOB and TEXT, to be compatible with mysqldump.

    D.3.20 Changes in release 3.21.15

    • WARNING: INCOMPATIBLE CHANGE!! mysqlperl is now from Msql-Mysql-modules. This means that connect() now takes host, database, user, password arguments! The old version took host, database, password, user.
    • Allow DATE '1997-01-01', TIME '12:10:10' and TIMESTAMP '1997-01-01 12:10:10' formats required by ANSI SQL. WARNING: INCOMPATIBLE CHANGE!! This has the unfortunate side-effect that you no longer can have columns named DATE, TIME or TIMESTAMP. :( Old columns can still be accessed through tablename.columnname!)
    • Changed Makefiles to hopefully work better with BSD systems. Also, 'manual.dvi' is now included in the distribution to avoid having stupid make programs trying to rebuild it.
    • readline library upgraded to version 2.1.
    • A new sortorder german-1. That is a normal ISO-Latin1 with a german sort order.
    • Perl DBI/DBD is now included in the distribution. DBI is now the recommended way to connect to MySQL from Perl.
    • New portable benchmark suite with DBD, with test results from mSQL 2.0.3, MySQL, PostgreSQL 6.2.1 and Solid server 2.2.
    • crash-me is now included with the benchmarks; This is a Perl program designed to find as many limits as possible in a SQL server. Tested with mSQL, PostgreSQL, Solid and MySQL.
    • Fixed bug in range-optimizer that crashed MySQL on some queries.
    • Table and column name completion for mysql command line tool, by Zeev Suraski and Andi Gutmans.
    • Added new command REPLACE that works like INSERT but replaces conflicting records with the new record. REPLACE INTO TABLE ... SELECT ... works also.
    • Added new commands CREATE DATABASE db_name and DROP DATABASE db_name.
    • Added RENAME option to ALTER TABLE: ALTER TABLE name RENAME AS new_name.
    • make_binary_distribution now includes 'libgcc.a' in 'libmysqlclient.a'. This should make linking work for people who don't have gcc.
    • Changed net_write() to my_net_write() because of a name conflict with Sybase.
    • New function DAYOFWEEK() compatible with ODBC.
    • Stack checking and bison memory overrun checking to make MySQL safer with weird queries.

    D.3.21 Changes in release 3.21.14b

    • Fixed a couple of small configure problems on some platforms.

    D.3.22 Changes in release 3.21.14a

    • Ported to SCO Openserver 5.0.4 with FSU Pthreads.
    • HP-UX 10.20 should work.
    • Added new function DATE_FORMAT().
    • Added NOT IN.
    • Added automatic removal of 'ODBC function conversions': {fn now() }
    • Handle ODBC 2.50.3 option flags.
    • Fixed comparison of DATE and TIME values with NULL.
    • Changed language name from germany to german to be consistent with the other language names.
    • Fixed sorting problem on functions returning a FLOAT. Previously, the values were converted to INTs before sorting.
    • Fixed slow sorting when sorting on key field when using key_column=constant.
    • Sorting on calculated DOUBLE values sorted on integer results instead.
    • mysql no longer needs a database argument.
    • Changed the place where HAVING should be. According to ANSI, it should be after GROUP BY but before ORDER BY. MySQL 3.20 incorrectly had it last.
    • Added Sybase command USE DATABASE to start using another database.
    • Added automatic adjusting of number of connections and table cache size if the maximum number of files that can be opened is less than needed. This should fix that mysqld doesn't crash even if you haven't done a ulimit -n 256 before starting mysqld.
    • Added lots of limit checks to make it safer when running with too little memory or when doing weird queries.

    D.3.23 Changes in release 3.21.13

    • Added retry of interrupted reads and clearing of errno. This makes Linux systems much safer!
    • Fixed locking bug when using many aliases on the same table in the same SELECT.
    • Fixed bug with LIKE on number key.
    • New error message so you can check whether the connection was lost while the command was running or whether the connection was down from the start.
    • Added --table option to mysql to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections.
    • Added != as a synonym for <>.
    • Added function VERSION() to make easier logs.
    • New multi-user test 'tests/fork_test.pl' to put some strain on the thread library.

    D.3.24 Changes in release 3.21.12

    • Fixed ftruncate() call in MIT-pthreads. This made isamchk destroy the '.ISM' files on (Free)BSD 2.x systems.
    • Fixed broken __P_ patch in MIT-pthreads.
    • Many memory overrun checks. All string functions now return NULL if the returned string should be longer than max_allowed_packet bytes.
    • Changed the name of the INTERVAL type to ENUM, because INTERVAL is used in ANSI SQL.
    • In some cases, doing a JOIN + GROUP + INTO OUTFILE, the result wasn't grouped.
    • LIKE with '_' as last character didn't work. Fixed.
    • Added extended ANSI SQL TRIM() function.
    • Added CURTIME().
    • Added ENCRYPT() function by Zeev Suraski.
    • Fixed better FOREIGN KEY syntax skipping. New reserved words: MATCH, FULL, PARTIAL.
    • mysqld now allows IP number and hostname to the --bind-address option.
    • Added SET OPTION CHARACTER SET cp1251_koi8 to enable conversions of data to/from cp1251_koi8.
    • Lots of changes for Win95 port. In theory, this version should now be easily portable to Win95.
    • Changed the CREATE COLUMN syntax of NOT NULL columns to be after the DEFAULT value, as specified in the ANSI SQL standard. This will make mysqldump with NOT NULL and default values incompatible with MySQL 3.20.
    • Added many function name aliases so the functions can be used with ODBC or ANSI SQL92 syntax.
    • Fixed syntax of ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT NULL.
    • Added CHAR and BIT as synonyms for CHAR(1).
    • Fixed core dump when updating as a user who has only select privilege.
    • INSERT ... SELECT ... GROUP BY didn't work in some cases. An Invalid use of group function error occurred.
    • When using LIMIT, SELECT now always uses keys instead of record scan. This will give better performance on SELECT and a WHERE that matches many rows.
    • Added Russian error messages.

    D.3.25 Changes in release 3.21.11

    • Configure changes.
    • MySQL now works with the new thread library on BSD/OS 3.0.
    • Added new group functions BIT_OR() and BIT_AND().
    • Added compatibility functions CHECK and REFERENCES. CHECK is now a reserved word.
    • Added ALL option to GRANT for better compatibility. (GRANT is still a dummy function.)
    • Added partly-translated dutch messages.
    • Fixed bug in ORDER BY and GROUP BY with NULL columns.
    • Added function last_insert_id() to retrieve last AUTO_INCREMENT value. This is intended for clients to ODBC that can't use the mysql_insert_id() API function, but can be used by any client.
    • Added --flush-logs option to mysqladmin.
    • Added command STATUS to mysql.
    • Fixed problem with ORDER BY/GROUP BY because of bug in gcc.
    • Fixed problem with INSERT ... SELECT ... GROUP BY.

    D.3.26 Changes in release 3.21.10

    • New mysqlaccess.
    • CREATE now supports all ODBC types and the mSQL TEXT type. All ODBC 2.5 functions are also supported (added REPEAT). This provides better portability.
    • Added text types TINYTEXT, TEXT, MEDIUMTEXT and LONGTEXT. These are actually BLOBtypes, but all searching is done in case-insensitive fashion.
    • All old BLOB fields are now TEXT fields. This only changes that all searching on strings is done in case-sensitive fashion. You must do an ALTER TABLE and change the field type to BLOB if you want to have tests done in case-sensitive fashion.
    • Fixed some configure issues.
    • Made the locking code a bit safer. Fixed very unlikely deadlock situation.
    • Fixed a couple of bugs in the range optimizer. Now the new range benchmark test-select works.

    D.3.27 Changes in release 3.21.9

    • Added --enable-unix-socket=pathname option to configure.
    • Fixed a couple of portability problems with include files.
    • Fixed bug in range calculation that could return empty set when searching on multiple key with only one entry (very rare).
    • Most things ported to FSU Pthreads, which should allow MySQL to run on SCO. See section 4.11.13 SCO notes.

    D.3.28 Changes in release 3.21.8

    • Works now in Solaris 2.6.
    • Added handling of calculation of SUM() functions. For example, you can now use SUM(column)/COUNT(column).
    • Added handling of trigometric functions: PI(), ACOS(), ASIN(), ATAN(), COS(), SIN() and TAN().
    • New languages: norwegian, norwegian-ny and portuguese.
    • Fixed parameter bug in net_print() in 'procedure.cc'.
    • Fixed a couple of memory leaks.
    • Now allow also the old SELECT ... INTO OUTFILE syntax.
    • Fixed bug with GROUP BY and SELECT on key with many values.
    • mysql_fetch_lengths() sometimes returned incorrect lengths when you used mysql_use_result(). This affected at least some cases of mysqldump --quick.
    • Fixed bug in optimization of WHERE const op field.
    • Fixed problem when sorting on NULL fields.
    • Fixed a couple of 64-bit (Alpha) problems.
    • Added --pid-file=# option to mysqld.
    • Added date formatting to FROM_UNIXTIME(), originally by Zeev Suraski.
    • Fixed bug in BETWEEN in range optimizer (Did only test = of the first argument).
    • Added machine-dependent files for MIT-pthreads i386-SCO. There is probably more to do to get this to work on SCO 3.5.

    D.3.29 Changes in release 3.21.7

    • Changed 'Makefile.am' to take advantage of Automake 1.2.
    • Added the beginnings of a benchmark suite.
    • Added more secure password handling.
    • Added new client function mysql_errno(), to get the error number of the error message. This makes error checking in the client much easier. This makes the new server incompatible with the 3.20.x server when running without --old-protocol. The client code is backward compatible. More information can be found in the 'README' file!
    • Fixed some problems when using very long, illegal names.

    D.3.30 Changes in release 3.21.6

    • Fixed more portability issues (incorrect sigwait and sigset defines).
    • configure should now be able to detect the last argument to accept().

    D.3.31 Changes in release 3.21.5

    • Should now work with FreeBSD 3.0 if used with 'FreeBSD-3.0-libc_r-1.0.diff', which can be found at http://www.mysql.com/Download/Patches.
    • Added new option -O tmp_table_size=# to mysqld.
    • New function FROM_UNIXTIME(timestamp) which returns a date string in 'YYYY-MM-DD HH:MM:DD' format.
    • New function SEC_TO_TIME(seconds) which returns a string in 'HH:MM:SS' format.
    • New function SUBSTRING_INDEX(), originally by Zeev Suraski.

    D.3.32 Changes in release 3.21.4

    • Should now configure and compile on OSF1 4.0 with the DEC compiler.
    • Configuration and compilation on BSD/OS 3.0 works, but due to some bugs in BSD/OS 3.0, mysqld doesn't work on it yet.
    • Configuration and compilation on FreeBSD 3.0 works, but I couldn't get pthread_create to work.

    D.3.33 Changes in release 3.21.3

    • Added reverse check lookup of hostnames to get better security.
    • Fixed some possible buffer overflows if filenames that are too long are used.
    • mysqld doesn't accept hostnames that start with digits followed by a '.', because the hostname may look like an IP number.
    • Added --skip-networking option to mysqld, to only allow socket connections. (This will not work with MIT-pthreads!)
    • Added check of too long table names for alias.
    • Added check if database name is okay.
    • Added check if too long table names.
    • Removed incorrect free() that killed the server on CREATE DATABASE or DROP DATABASE.
    • Changed some mysqld -O options to better names.
    • Added -O join_cache_size=# option to mysqld.
    • Added -O max_join_size=# option to mysqld, to be able to set a limit how big queries (in this case big = slow) one should be able to handle without specifying SET OPTION SQL_BIG_SELECTS=1. A # = is about 10 examined records. The default is "unlimited".
    • When comparing a TIME, DATE, DATETIME or TIMESTAMP column to a constant, the constant is converted to a time value before performing the comparison. This will make it easier to get ODBC (particularly Access97) to work with the above types. It should also make dates easier to use and the comparisons should be quicker than before.
    • Applied patch from Jochen Wiedmann that allows query() in mysqlperl to take a query with \0 in it.
    • Storing a timestamp with a 2-digit year (YYMMDD) didn't work.
    • Fix that timestamp wasn't automatically updated if set in an UPDATE clause.
    • Now the automatic timestamp field is the FIRST timestamp field.
    • SELECT * INTO OUTFILE, which didn't correctly if the outfile already existed.
    • mysql now shows the thread ID when starting or doing a reconnect.
    • Changed the default sort buffer size from 2M to 1M.

    D.3.34 Changes in release 3.21.2

    • The range optimizer is coded, but only 85% tested. It can be enabled with --new, but it crashes core a lot yet...
    • More portable. Should compile on AIX and alpha-digital. At least the isam library should be relatively 64-bit clean.
    • New isamchk which can detect and fix more problems.
    • New options for isamlog.
    • Using new version of Automake.
    • Many small portability changes (from the AIX and alpha-digital port) Better checking of pthread(s) library.
    • czech error messages by snajdr@pvt.net.
    • Decreased size of some buffers to get fewer problems on systems with little memory. Also added more checks to handle "out of memory" problems.
    • mysqladmin: you can now do mysqladmin kill 5,6,7,8 to kill multiple threads.
    • When the maximum connection limit is reached, one extra connection by a user with the PROCESS_ACL privilege is granted.
    • Added -O backlog=# option to mysqld.
    • Increased maximum packet size from 512K to 1024K for client.
    • Almost all of the function code is now tested in the internal test suite.
    • ALTER TABLE now returns warnings from field conversions.
    • Port changed to 3306 (got it reserved from ISI).
    • Added a fix for Visual FoxBase so that any schema name from a table specification is automatically removed.
    • New function ASCII().
    • Removed function BETWEEN(a,b,c). Use the standard ANSI synax instead: expr BETWEEN expr AND expr.
    • MySQL no longer has to use an extra temporary table when sorting on functions or SUM() functions.
    • Fixed bug that you couldn't use tbl_name.field_name in UPDATE.
    • Fixed SELECT DISTINCT when using 'hidden group'. For example:
      mysql> SELECT DISTINCT MOD(some_field,10) FROM test
                 GROUP BY some_field;
      
      Note: some_field is normally in the SELECT part. ANSI SQL should require it.

    D.3.35 Changes in release 3.21.0

    • New keywords used: INTERVAL, EXPLAIN, READ, WRITE, BINARY.
    • Added ODBC function CHAR(num,...).
    • New operator IN. This uses a binary search to find a match.
    • New command LOCK TABLES tbl_name [AS alias] {READ|WRITE} ...
    • Added --log-update option to mysqld, to get a log suitable for incremental updates.
    • New command EXPLAIN SELECT ... to get information about how the optimizer will do the join.
    • For easier client code, the client should no longer use FIELD_TYPE_TINY_BLOB, FIELD_TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB or FIELD_TYPE_VAR_STRING (as previously returned by mysql_list_fields). You should instead only use FIELD_TYPE_BLOB or FIELD_TYPE_STRING. If you want exact types, you should use the command SHOW FIELDS.
    • Added varbinary syntax: 0x###### which can be used as a string (default) or a number.
    • FIELD_TYPE_CHAR is renamed to FIELD_TYPE_TINY.
    • Changed all fields to C++ classes.
    • Removed FORM struct.
    • Fields with DEFAULT values no longer need to be NOT NULL.
    • New field types:
      ENUM
      A string which can take only a couple of defined values. The value is stored as a 1-3 byte number that is mapped automatically to a string. This is sorted according to string positions!
      SET
      A string which may have one or many string values separated with ','. The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specific set member. This is sorted according to the unsigned value of the stored packed number.
    • Now all function calculation is done with double or long long. This will provide the full 64-bit range with bit functions and fix some conversions that previously could result in precision losses. One should avoid using unsigned long long columns with full 64-bit range (numbers bigger than 9223372036854775807) because calculations are done with signed long long.
    • ORDER BY will now put NULL field values first. GROUP BY will also work with NULL values.
    • Full WHERE with expressions.
    • New range optimizer that can resolve ranges when some keypart prefix is constant. Example:
      mysql> SELECT * FROM tbl_name
                 WHERE key_part_1="customer"
                 AND key_part_2>=10 AND key_part_2<=10;
      

    21.3 Changes in release 3.20.x

    Changes from 3.20.18 to 3.20.32b are not documented here since the 3.21 release branched here. And the relevant changes are also documented as changes to the 3.21 version.

    D.3.36 Changes in release 3.20.18

    • Added -p# (remove # directories from path) to isamlog. All files are written with a relative path from the database directory Now mysqld shouldn't crash on shutdown when using the --log-isam option.
    • New mysqlperl version. It is now compatible with msqlperl-0.63.
    • New DBD module available at http://www.mysql.com/Contrib site.
    • Added group function STD() (standard deviation).
    • The mysqld server is now compiled by default without debugging information. This will make the daemon smaller and faster.
    • Now one usually only has to specify the --basedir option to mysqld. All other paths are relative in a normal installation.
    • BLOB columns sometimes contained garbage when used with a SELECT on more than one table and ORDER BY.
    • Fixed that calculations that are not in GROUP BY work as expected (ANSI SQL extension). Example:
      mysql> SELECT id,id+1 FROM table GROUP BY id;
      
    • The test of using MYSQL_PWD was reversed. Now MYSQL_PWD is enabled as default in the default release.
    • Fixed conversion bug which caused mysqld to core dump with Arithmetic error on Sparc-386.
    • Added --unbuffered option to mysql, for new mysqlaccess.
    • When using overlapping (unnecessary) keys and join over many tables, the optimizer could get confused and return 0 records.

    D.3.37 Changes in release 3.20.17

    • You can now use BLOB columns and the functions IS NULL and IS NOT NULL in the WHERE clause.
    • All communication packets and row buffers are now allocated dynamically on demand. The default value of max_allowed_packet is now 64K for the server and 512K for the client. This is mainly used to catch incorrect packets that could trash all memory. The server limit may be changed when it is started.
    • Changed stack usage to use less memory.
    • Changed safe_mysqld to check for running daemon.
    • The ELT() function is renamed to FIELD(). The new ELT() function returns a value based on an index: FIELD() is the inverse of ELT() Example: ELT(2,"A","B","C") returns "B". FIELD("B","A","B","C") returns 2.
    • COUNT(field), where field could have a NULL value, now works.
    • A couple of bugs fixed in SELECT ... GROUP BY.
    • Fixed memory overrun bug in WHERE with many unoptimizable brace levels.
    • Fixed some small bugs in the grant code.
    • If hostname isn't found by get_hostname, only the IP is checked. Previously, you got Access denied.
    • Inserts of timestamps with values didn't always work.
    • INSERT INTO ... SELECT ... WHERE could give the error Duplicated field.
    • Added some tests to safe_mysqld to make it "safer".
    • LIKE was case sensitive in some places and case insensitive in others. Now LIKE is always case insensitive.
    • 'mysql.cc': Allow '#' anywhere on the line.
    • New command SET OPTION SQL_SELECT_LIMIT=#. See the FAQ for more details.
    • New version of the mysqlaccess script.
    • Change FROM_DAYS() and WEEKDAY() to also take a full TIMESTAMP or DATETIME as argument. Before they only took a number of type YYYYMMDD or YYMMDD.
    • Added new function UNIX_TIMESTAMP(timestamp_column).

    D.3.38 Changes in release 3.20.16

    • More changes in MIT-pthreads to get them safer. Fixed also some link bugs at least in SunOS.
    • Changed mysqld to work around a bug in MIT-pthreads. This makes multiple small SELECT operations 20 times faster. Now lock_test.pl should work.
    • Added mysql_FetchHash(handle) to mysqlperl.
    • The mysqlbug script is now distributed built to allow for reporting bugs that appear during the build with it.
    • Changed 'libmysql.c' to prefer getpwuid() instead of cuserid().
    • Fixed bug in SELECT optimizer when using many tables with the same column used as key to different tables.
    • Added new latin2 and Russian KOI8 character tables.
    • Added support for a dummy GRANT command to satisfy Powerbuilder.

    D.3.39 Changes in release 3.20.15

    • Fixed fatal bug packets out of order when using MIT-pthreads.
    • Removed possible loop when a thread waits for command from client and fcntl() fails. Thanks to Mike Bretz for finding this bug.
    • Changed alarm loop in 'mysqld.cc' because shutdown didn't always succeed in Linux.
    • Removed use of termbits from 'mysql.cc'. This conflicted with glibc 2.0.
    • Fixed some syntax errors for at least BSD and Linux.
    • Fixed bug when doing a SELECT as superuser without a database.
    • Fixed bug when doing SELECT with group calculation to outfile.

    D.3.40 Changes in release 3.20.14

    • If one gives -p or --password option to mysql without an argument, the user is solicited for the password from the tty.
    • Added default password from MYSQL_PWD (by Elmar Haneke).
    • Added command kill to mysqladmin to kill a specific MySQL thread.
    • Sometimes when doing a reconnect on a down connection this succeeded first on second try.
    • Fixed adding an AUTO_INCREMENT key with ALTER_TABLE.
    • AVG() gave too small value on some SELECTs with GROUP BY and ORDER BY.
    • Added new DATETIME type (by Giovanni Maruzzelli
    • Fixed that define DONT_USE_DEFAULT_FIELDS works.
    • Changed to use a thread to handle alarms instead of signals on Solaris to avoid race conditions.
    • Fixed default length of signed numbers. (George Harvey
    • Allow anything for CREATE INDEX.
    • Add prezeros when packing numbers to DATE, TIME and TIMESTAMP.
    • Fixed a bug in OR of multiple tables (gave empty set).
    • Added many patches to MIT-pthreads. This fixes at least one lookup bug.

    D.3.41 Changes in release 3.20.13

    • Added ANSI SQL94 DATE and TIME types.
    • Fixed bug in SELECT with AND-OR levels.
    • Added support for Slovenian characters. The 'Contrib' directory contains source and instructions for adding other character sets.
    • Fixed bug with LIMIT and ORDER BY.
    • Allow ORDER BY and GROUP BY on items that aren't in the SELECT list. (Thanks to Wim Bonis bonis@kiss.de, for pointing this out.)
    • Allow setting of timestamp values in INSERT.
    • Fixed bug with SELECT ... WHERE ... = NULL.
    • Added changes for glibc 2.0. To get glibc to work, you should add the 'gibc-2.0-sigwait-patch' before compiling glibc.
    • Fixed bug in ALTER TABLE when changing a NOT NULL field to allow NULL values.
    • Added some ANSI92 synonyms as field types to CREATE TABLE. CREATE TABLE now allows FLOAT(4) and FLOAT(8) to mean FLOAT and DOUBLE.
    • New utility program mysqlaccess by Yves.Carlier@rug.ac.be. This program shows the access rights for a specific user and the grant rows that determine this grant.
    • Added WHERE const op field (by bonis@kiss.de).

    D.3.42 Changes in release 3.20.11

    • When using SELECT ... INTO OUTFILE, all temporary tables are ISAM instead of HEAP to allow big dumps.
    • Changed date functions to be string functions. This fixed some "funny" side effects when sorting on dates.
    • Extended ALTER TABLE according to SQL92.
    • Some minor compability changes.
    • Added --port and --socket options to all utility programs and mysqld.
    • Fixed MIT-pthreads readdir_r(). Now mysqladmin create database and mysqladmin drop database should work.
    • Changed MIT-pthreads to use our tempnam(). This should fix the "sort aborted" bug.
    • Added sync of records count in sql_update. This fixed slow updates on first connection. (Thanks to Vaclav Bittner for the test.)

    D.3.43 Changes in release 3.20.10

    • New insert type: INSERT INTO ... SELECT ...
    • MEDIUMBLOB fixed.
    • Fixed bug in ALTER TABLE and BLOBs.
    • SELECT ... INTO OUTFILE now creates the file in the current database directory.
    • DROP TABLE now can take a list of tables.
    • Oracle synonym DESCRIBE (DESC).
    • Changes to make_binary_distribution.
    • Added some comments to installation instructions about configure's C++ link test.
    • Added --without-perl option to configure.
    • Lots of small portability changes.

    D.3.44 Changes in release 3.20.9

    • ALTER TABLE didn't copy null bit. As a result, fields that were allowed to have NULL values were always NULL.
    • CREATE didn't take numbers as DEFAULT.
    • Some compatibility changes for SunOS.
    • Removed 'config.cache' from old distribution.

    D.3.45 Changes in release 3.20.8

    • Fixed bug with ALTER TABLE and multi-part keys.

    D.3.46 Changes in release 3.20.7

    • New commands: ALTER TABLE, SELECT ... INTO OUTFILE and LOAD DATA INFILE.
    • New function: NOW().
    • Added new field file_priv to mysql/user table.
    • New script add_file_priv which adds the new field file_priv to the user table. This script must be executed if you want to use the new SELECT ... INTO and LOAD DATA INFILE ... commands with a version of MySQL earlier than 3.20.7.
    • Fixed bug in locking code, which made lock_test.pl test fail.
    • New files 'NEW' and 'BUGS'.
    • Changed 'select_test.c' and 'insert_test.c' to include 'config.h'.
    • Added command status to mysqladmin for short logging.
    • Increased maximum number of keys to 16 and maximum number of key parts to 15.
    • Use of sub keys. A key may now be a prefix of a string field.
    • Added -k option to mysqlshow, to get key information for a table.
    • Added long options to mysqldump.

    D.3.47 Changes in release 3.20.6

    • Portable to more systems because of MIT-pthreads, which will be used automatically if configure cannot find a -lpthreads library.
    • Added GNU-style long options to almost all programs. Test with program --help.
    • Some shared library support for Linux.
    • The FAQ is now in '.texi' format and is available in '.html', '.txt' and '.ps' formats.
    • Added new SQL function RAND([init]).
    • Changed sql_lex to handle \0 unquoted, but the client can't send the query through the C API, because it takes a str pointer. You must use mysql_real_query() to send the query.
    • Added API function mysql_get_client_info().
    • mysqld now uses the N_MAX_KEY_LENGTH from 'nisam.h' as the maximum allowed key length.
    • The following now works:
      mysql> SELECT filter_nr,filter_nr
       FROM filter ORDER BY filter_nr;
      
      Previously, this resulted in the error: Column: 'filter_nr' in order clause is ambiguous.
    • mysql now outputs '\0', '\t', '\n' and '\\' when encountering ASCII 0, tab, newline or '\' while writing tab-separated output. This is to allow printing of binary data in a portable format. To get the old behavior, use -r (or --raw).
    • Added german error messages (60 of 80 error messages translated).
    • Added new API function mysql_fetch_lengths(MYSQL_RES *), which returns an array of of column lengths (of type uint).
    • Fixed bug with IS NULL in WHERE clause.
    • Changed the optimizer a little to get better results when searching on a key part.
    • Added SELECT option STRAIGHT_JOIN to tell the optimizer that it should join tables in the given order.
    • Added support for comments starting with '--' in 'mysql.cc' (Postgres syntax).
    • You can have SELECT expressions and table columns in a SELECT which are not used in the group part. This makes it efficient to implement lookups. The column that is used should be a constant for each group because the value is calculated only once for the first row that is found for a group.
      mysql> SELECT id,lookup.text,sum(*) FROM test,lookup
               WHERE test.id=lookup.id GROUP BY id;
      
    • Fixed bug in SUM(function) (could cause a core dump).
    • Changed AUTO_INCREMENT placement in the SQL query:
      INSERT into table (auto_field) values (0);
      
      inserted 0, but it should insert an AUTO_INCREMENT value.
    • 'mysqlshow.c': Added number of records in table. Had to change the client code a little to fix this.
    • mysql now allows doubled " or "" within strings for embedded ' or ".
    • New math functions: EXP(), LOG(), SQRT(), ROUND(), CEILING().

    D.3.48 Changes in release 3.20.3

    • The configure source now compiles a thread-free client library -lmysqlclient. This is the only library that needs to be linked with client applications. When using the binary releases, you must link with -lmysql -lmysys -ldbug -lstrings as before.
    • New readline library from bash-2.0.
    • LOTS of small changes to configure and makefiles (and related source).
    • It should now be possible to compile in another directory using VPATH. Tested with GNU Make 3.75.
    • safe_mysqld and mysql.server changed to be more compatible between the source and the binary releases.
    • LIMIT now takes one or two numeric arguments. If one argument is given, it indicates the maximum number of rows in a result. If two arguments are given, the first argument indicates the offset of the first row to return, the second is the maximum number of rows. With this it's easy to do a poor man's next page/previous page WWW application.
    • Changed name of SQL function FIELDS() to ELT(). Changed SQL function INTERVALL() to INTERVAL().
    • Made SHOW COLUMNS a synonym for SHOW FIELDS. Added compatibility syntax FRIEND KEY to CREATE TABLE. In MySQL, this creates a non-unique key on the given columns.
    • Added CREATE INDEX and DROP INDEX as compatibility functions. In MySQL, CREATE INDEX only checks if the index exists and issues an error if it doesn't exist. DROP INDEX always succeeds.
    • 'mysqladmin.c': added client version to version information.
    • Fixed core dump bug in sql_acl (core on new connection).
    • Removed host, user and db tables from database test in the distribution.
    • FIELD_TYPE_CHAR can now be signed (-128 - 127) or unsigned (0 - 255) Previously, it was always unsigned.
    • Bug fixes in CONCAT() and WEEKDAY().
    • Changed a lot of source to get mysqld to be compiled with SunPro compiler.
    • SQL functions must now have a '(' immediately after the function name (no intervening space). For example, 'user(' is regarded as beginning a function call, and 'user (' is regarded as an identifier user followed by a '(', not as a function call.

    D.3.49 Changes in release 3.20.0

    • The source distribution is done with configure and Automake. It will make porting much easier. The readline library is included in the distribution.
    • Separate client compilation: the client code should be very easy to compile on systems which don't have threads.
    • The old Perl interface code is automatically compiled and installed. Automatic compiling of DBD will follow when the new DBD code is ported.
    • Dynamic language support: mysqld can now be started with Swedish or English (default) error messages.
    • New functions: INSERT(), RTRIM(), LTRIM() and FORMAT().
    • mysqldump now works correctly for all field types (even AUTO_INCREMENT). The format for SHOW FIELDS FROM tbl_name is changed so the Type column contains information suitable for CREATE TABLE. In previous releases, some CREATE TABLE information had to be patched when recreating tables.
    • Some parser bugs from 3.19.5 (BLOB and TIMESTAMP) are corrected. TIMESTAMP now returns different date information depending on its create length.
    • Changed parser to allow a database, table or field name to start with a number or '_'.
    • All old C code from Unireg changed to C++ and cleaned up. This makes the daemon a little smaller and easier to understand.
    • A lot of small bug fixes done.
    • New 'INSTALL' files (not final version) and some info regarding porting.

    D.4 Changes in release 3.19.x

    D.4.1 Changes in release 3.19.5

    • Some new functions, some more optimization on joins.
    • Should now compile clean on Linux (2.0.x).
    • Added functions DATABASE(), USER(), POW(), LOG10() (needed for ODBC).
    • In a WHERE with an ORDER BY on fields from only one table, the table is now preferred as first table in a multi-join.
    • HAVING and IS NULL or IS NOT NULL now works.
    • A group on one column and a sort on a group function (SUM(), AVG()...) didn't work together. Fixed.
    • mysqldump: Didn't send password to server.

    D.4.2 Changes in release 3.19.4

    • Fixed horrible locking bug when inserting in one thread and reading in another thread.
    • Fixed one-off decimal bug. 1.00 was output as 1.0.
    • Added attribute 'Locked' to process list as info if a query is locked by another query.
    • Fixed full magic timestamp. Timestamp length may now be 14, 12, 10, 8, 6, 4 or 2 bytes.
    • Sort on some numeric functions could sort incorrectly on last number.
    • IF(arg,syntax_error,syntax_error) crashed.
    • Added functions CEILING(), ROUND(), EXP(), LOG() and SQRT().
    • Enhanced BETWEEN to handle strings.

    D.4.3 Changes in release 3.19.3

    • Fixed SELECT with grouping on BLOB columns not to return incorrect BLOB info. Grouping, sorting and distinct on BLOB columns will not yet work as expected (probably it will group/sort by the first 7 characters in the BLOB). Grouping on formulas with a fixed string size (use MID() on a BLOB) should work.
    • When doing a full join (no direct keys) on multiple tables with BLOB fields, the BLOB was garbage on output.
    • Fixed DISTINCT with calculated columns.

    E Known errors and design deficiencies in MySQL

    • You cannot build in another directory when using MIT-pthreads. Since this requires changes to MIT-pthreads, we are not likely to fix this.
    • BLOB values can't "reliably" be used in GROUP BY or ORDER BY or DISTINCT. Only the first max_sort_length bytes (default 1024) are used when comparing BLOBbs in these cases. This can be changed with the -O max_sort_length option to mysqld. A workaround for most cases is to use a substring: SELECT DISTINCT LEFT(blob,2048) FROM tbl_name.
    • Calculation is done with BIGINT or DOUBLE (both are normally 64 bits long). It depends on the function which precision one gets. The general rule is that bit functions are done with BIGINT precision, IF, and ELT() with BIGINT or DOUBLE precision and the rest with DOUBLE precision. One should try to avoid using bigger unsigned long long values than 63 bits (9223372036854775807) for anything else than bit fields!
    • All string columns, except BLOB and TEXT columns, automatically have all trailing spaces removed when retrieved. For CHAR types this is okay, and may be regarded as a feature according to ANSI SQL92. The bug is that in MySQL, VARCHAR columns are treated the same way.
    • You can only have up to 255 ENUM and SET columns in one table.
    • safe_mysqld re-directs all messages from mysqld to the mysqld log. One problem with this is that if you execute mysqladmin refresh to close and reopen the log, stdout and stderr are still redirected to the old log. If you use --log extensively, you should edit safe_mysqld to log to ''hostname'.err' instead of ''hostname'.log' so you can easily reclaim the space for the old log by deleting the old one and executing mysqladmin refresh.
    • In the UPDATE statement, columns are updated from left to right. If you refer to a updated column, you will get the updated value instead of the original value. For example:
      mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1
      
      will update KEY with 2 instead of with 1.
    • You can't use temporary tables more than once in the same query.
      select * from temporary_table, temporary_table as t2;
      

    The following is known bugs in earlier versions of MySQL:

    • Before MySQL 3.23.2 an UPDATE that updated a key with a WHERE on the same key may have failed because the key was used to search for records and the same row may have been found multiple times:
      UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
      
      A workaround is to use:
      mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
      
      This will work because MySQL will not use index on expressions in the WHERE clause.
    • Before MySQL 3.23, all numeric types where treated as fixed-point fields. That means you had to specify how many decimals a floating-point field shall have. All results were returned with the correct number of decimals.

    For platform-specific bugs, see the sections about compiling and porting.

    F List of things we want to add to MySQL in the future (The TODO)

    Everything in this list is in the order it will be done. If you want to affect the priority order, please register a license or support us and tell us what you want to have done more quickly. See section 3 MySQL licensing and support.

    F.1 Things that must done in the real near future

    • One way replication
    • Transactions
    • Subqueries. select id from t where grp in (select grp from g where u > 100)
    • Allow mysqld to support many character sets at the same time.
    • If you perform an ALTER TABLE on a table that is symlinked to another disk, create temporary tables on this disk.
    • RENAME table as table, table as table [,...]
    • FreeBSD and MIT-pthreads; Do sleeping threads take CPU?
    • Allow join on key parts (optimization issue).
    • Entry for DECRYPT().
    • Remember FOREIGN key definitions in the '.frm' file.
    • Server side cursors.
    • Allow users to change startup options.
    • Add --ansi option to MySQL (to change || -> CONCAT())
    • Don't add automatic DEFAULT values to columns. Give an error when using an INSERT that doesn't contain a column that doesn't have a DEFAULT.
    • Caching of queries and results. This should be done as a separated module that examines each query and if this is query is in the cache the cached result should be returned. When one updates a table one should remove as few queries as possible from the cache. This should give a big speed bost on machines with much RAM where queries are often repeated (like WWW applications). One idea would be to only cache queries of type: SELECT CACHED ....
    • Fix 'libmysql.c' to allow two mysql_query() commands in a row without reading results or give a nice error message when one does this.
    • Optimize BIT type to take 1 bit (now BIT takes 1 char).
    • Check why MIT-pthreads ctime() doesn't work on some FreeBSD systems.
    • Check if locked threads take any CPU.
    • Add ORDER BY to update. This would be handy with functions like: generate_id(start,step).
    • Add an IMAGE option to LOAD DATA INFILE to not update TIMESTAMP and AUTO_INCREMENT fields.
    • Make LOAD DATA INFILE understand a syntax like:
      LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name
      TEXT_FIELDS (text_field1, text_field2, text_field3)
      SET table_field1=concatenate(text_field1, text_field2),
       table_field3=23
      IGNORE text_field3
      
    • Add true VARCHAR support (There is already support for this in MyISAM).
    • Automatic output from mysql to netscape.
    • LOCK DATABASES. (with various options)
    • NATURAL JOIN.
    • Change sort to allocate memory in "hunks" to get better memory utilization.
    • DECIMAL and NUMERIC types can't read exponential numbers; Field_decimal::store(const char *from,uint len) must be recoded to fix this.
    • Fix mysql.cc to do fewer malloc() calls when hashing field names.
    • Functions: ADD_TO_SET(value,set) and REMOVE_FROM_SET(value,set)
    • Add use of t1 JOIN t2 ON ... and t1 JOIN t2 USING ... Currently, you can only use this syntax with LEFT JOIN.
    • Add full support for unsigned long long type.
    • Function CASE.
    • Many more variables for show status. Counts for: INSERT/DELETE/UPDATE statements. Records reads and updated. Selects on 1 table and selects with joins. Mean number of tables in select. Key buffer read/write hits (logical and real). ORDER BY, GROUP BY, temporary tables created.
    • If you abort mysql in the middle of a query, you should open another connection and kill the old running query. Alternatively, an attempt should be made to detect this in the server.
    • Add a handler interface for table information so you can use it as a system table. This would be a bit slow if you requested information about all tables, but very flexible. SHOW INFO FROM tbl_name for basic table information should be implemented.
    • Add support for UNICODE.
    • NATURAL JOIN.
    • Oracle like CONNECT BY PRIOR ... to search hierarchy structures.
    • RENAME DATABASE
    • mysqladmin copy database new-database.
    • Processlist should show number of queries/thread.
    • IGNORE option to the UPDATE statement (this will delete all rows that gets a dupplicate key error while updating).
    • Change the format of DATETIME to store fractions of seconds.
    • Add all missing ANSI92 and ODBC 3.0 types.
    • Change table names from empty strings to NULL for calculated columns.

    F.2 Things that have to be done sometime

    • Implement function: get_changed_tables(timeout,table1,table2,...)
    • Implement function: LAST_UPDATED(tbl_name)
    • Atomic updates; This includes a language that one can even use for a set of stored procedures.
    • update items,month set items.price=month.price where items.id=month.id;
    • Change reading through tables to use memmap when possible. Now only compressed tables use memmap.
    • Add a new privilege 'Show_priv' for SHOW commands.
    • Make the automatic timestamp code nicer. Add timestamps to the update log with SET TIMESTAMP=#;
    • Use read/write mutex in some places to get more speed.
    • Full foreign key support. One probably wants to implement a procedural language first.
    • Simple views (first on one table, later on any expression).
    • Automatically close some tables if a table, temporary table or temporary files gets error 23 (not enough open files).
    • When one finds a field=#, change all occurrences of field to #. Now this is only done for some simple cases.
    • Change all const expressions with calculated expressions if possible.
    • Optimize key = expression. At the moment only key = field or key = constant are optimized.
    • Join some of the copy functions for nicer code.
    • Change 'sql_yacc.yy' to an inline parser to reduce its size and get better error messages (5 days).
    • Change the parser to use only one rule per different number of arguments in function.
    • Use of full calculation names in the order part. (For ACCESS97)
    • UNION, MINUS, INTERSECT and FULL OUTER JOIN. (Currently only LEFT OUTER JOIN is supported)
    • Allow UNIQUE on fields that can be NULL.
    • SQL_OPTION MAX_SELECT_TIME=# to put a time limit on a query.
    • Make the update log to a database.
    • Negative LIMIT to retrieve data from the end.
    • Alarm around client connect/read/write functions.
    • Make a mysqld version which isn't multithreaded (3-5 days).
    • Please note the changes to safe_mysqld: according to FSSTND (which Debian tries to follow) PID files should go into '/var/run/<progname>.pid' and log files into '/var/log'. It would be nice if you could put the "DATADIR" in the first declaration of "pidfile" and "log", so the placement of these files can be changed with a single statement.
    • Better dynamic record layout to avoid fragmentation.
    • UPDATE SET blob=read_blob_from_file('my_gif') where id=1;
    • Allow a client to request logging.
    • Add use of zlib() for gzip-ed files to LOAD DATA INFILE.
    • Fix sorting and grouping of BLOB columns (partly solved now).
    • Stored procedures. This is currently not regarded to be very important as stored procedures are not very standardized yet. Another problem is that true stored procedures make it much harder for the optimizer and in many cases the result is slower than before We will, on the other hand, add a simple (atomic) update language that can be used to write loops and such in the MySQL server.
    • Change to use semaphores when counting threads. One should first implement a semaphore library to MIT-pthreads.
    • Don't assign a new AUTO_INCREMENT value when one sets a column to 0. Use NULL instead.
    • Add full support for JOIN with parentheses.
    • Reuse threads for system with a lot of connections.

    Time is given according to amount of work, not real time. TcX's main business is the use of MySQL not the development of it. But since TcX is a very flexible company, we have put a lot of resources into the development of MySQL.

    F.3 Some things we don't have any plans to do

    • Transactions with rollback (we mainly do SELECTs, and because we don't do transactions, we can be much quicker on everything else). We will support some kind of atomic operations on multiple tables, though. Currently atomic operations can be done with LOCK TABLES/UNLOCK TABLES but we will make this more automatic in the future.

    G Comments on porting to other systems

    A working Posix thread library is needed for the server. On Solaris 2.5 we use SUN PThreads (the native thread support in 2.4 and earlier versions are not good enough) and on Linux we use LinuxThreads by Xavier Leroy, Xavier.Leroy@inria.fr.

    The hard part of porting to a new Unix variant without good native thread support is probably to port MIT-pthreads. See 'mit-pthreads/README' and Programming POSIX Threads.

    The MySQL distribution includes a patched version of Provenzano's Pthreads from MIT (see MIT Pthreads web page). This can be used for some operating systems that do not have POSIX threads.

    It is also possible to use another user level thread package named FSU Pthreads (see FSU Pthreads home page). This implementation is being used for the SCO port.

    See the 'thr_lock.c' and 'thr_alarm.c' programs in the 'mysys' directory for some tests/examples of these problems.

    Both the server and the client need a working C++ compiler (we use gcc and have tried SparcWorks). Another compiler that is known to work is the Irix cc.

    To compile only the client use ./configure --without-server.

    There is currently no support for only compiling the server. Nor is it likly to be added unless someone has a good reason for it.

    If you want/need to change any 'Makefile' or the configure script you must get Automake and Autoconf. We have used the automake-1.2 and autoconf-2.12 distributions.

    All steps needed to remake everything from the most basic files.

    /bin/rm */.deps/*.P
    /bin/rm -f config.cache
    aclocal
    autoheader
    aclocal
    automake
    autoconf
    ./configure --with-debug --prefix='your installation directory'
    
    # The makefiles generated above need GNU make 3.75 or newer.
    # (called gmake below)
    gmake clean all install init-db
    

    If you run into problems with a new port, you may have to do some debugging of MySQL! See section G.1 Debugging a MySQL server.

    Note: Before you start debugging mysqld, first get the test programs mysys/thr_alarm and mysys/thr_lock to work. This will ensure that your thread installation has even a remote chance to work!

    G.1 Debugging a MySQL server

    If you are using some functionality that is very new in MySQL, you can try to run mysqld with the --skip-new (which will disable all new, potentially unsafe functionality) or with --safe-mode which disables a lot of optimization that may cause problems. See section 18.1 What to do if MySQL keeps crashing.

    If mysqld doesn't want to start, you should check that you don't have any my.cnf file that interferes with your setup! You can check your my.cnf arguments with mysqld --print-defaults and avoid using them by starting with mysqld --no-defaults ....

    If you have some very specific problem, you can always try to debug MySQL. To do this you must configure MySQL with the option --with-debug. You can check whether or not MySQL was compiled with debugging by doing: mysqld --help. If the --debug flag is listed with the options then you have debugging enabled. mysqladmin ver also lists the mysqld version as mysql ... -debug in this case.

    If you are using gcc or egcs, the recommended configure line is:

    CC=gcc CFLAGS="-O6" CXX=gcc CXXFLAGS="-O6 -felide-constructors
     -fno-exceptions -fno-rtti" ./configure
     --prefix=/usr/local/mysql --with-debug
    

    This will avoid problems with the libstdc++ library and with C++ exceptions.

    If you can cause the mysqld server to crash quickly, you can try to create a trace file of this:

    Start the mysqld server with a trace log in '/tmp/mysql.trace'. The log file will get very BIG.

    mysqld --debug --log

    or you can start it with

    mysqld --debug=d,info,error,query,general,where:O,/tmp/mysql.trace

    which only prints information with the most interesting tags.

    When you configure MySQL for debugging you automatically enable a lot of extra safety check functions that monitor the health of mysqld. If they find something "unexpected," an entry will be written to stderr, which safe_mysqld directs to the error log! This also means that if you are having some unexpected problems with MySQL and are using a source distribution, the first thing you should do is to configure MySQL for debugging! (The second thing, of course, is to send mail to mysql@lists.mysql.com and ask for help. Please use the mysqlbug script for all bug reports or questions regarding the MySQL version you are using!

    On most system you can also start mysqld from gdb to get more information if mysqld crashes.

    With some gdb versions on Linux you must use run --one-thread if you want to be able to debug mysqld threads. In this case you can only have one thread active at a time.

    If you are using gdb 4.17.x on Linux, you should install a '.gdb' file, with the following information, in your current directory:

    set print sevenbit off
    handle SIGUSR1 nostop noprint
    handle SIGUSR2 nostop noprint
    handle SIGWAITING nostop noprint
    handle SIGLWP nostop noprint
    handle SIGPIPE nostop
    handle SIGALRM nostop
    handle SIGHUP nostop
    handle SIGTERM nostop noprint
    

    Here follows an example how to debug mysqld:

    shell> gdb /usr/local/libexec/mysqld
    gdb> run
    ...
    back   # Do this when mysqld crashes
    info locals
    up
    info locals
    up
    ...
    (until you get some information about local variables)
    
    quit
    

    Include the above output in a mail generated with mysqlbug and mail this to mysql@lists.mysql.com.

    If mysqld hangs you can try to use some system tools like strace or /usr/proc/bin/pstack to examine where mysqld has hanged.

    If mysqld starts to eat up CPU or memory or if it "hangs", you can use mysqladmin processlist status to find out if someone is executing some query that takes a long time. It may be a good idea to run mysqladmin -i10 processlist status in some window if you are experiencing performance problems or problems when new clients can't connect.

    If mysqld dies or hangs, you should start mysqld with --log. When mysqld dies again, you can check in the log file for the query that killed mysqld. Note that before starting mysqld with --log you should check all your tables with myisamchk. See section 13 Maintaining a MySQL installation.

    If you are using a log file, mysqld --log, you should check the 'hostname' log files, that you can find in the database directory, for any queries that could cause a problem. Try the command EXPLAIN on all SELECT statements that takes a long time to ensure that mysqld are using indexes properly. See section 7.22 EXPLAIN syntax (Get information about a SELECT). You should also test complicated queries that didn't complete within the mysql command line tool.

    If you find the text mysqld restarted in the error log file (normally named 'hostname.err') you have probably found a query that causes mysqld to fail. If this happens you should check all your tables with myisamchk (see section 13 Maintaining a MySQL installation), and test the queries in the MySQL log files if someone doesn't work. If you find such a query, try first upgrading to the newest MySQL version. If this doesn't help and you can't find anything in the mysql mail archive, you should report the bug to mysql@lists.mysql.com. Links to mail archives are available at the online MySQL documentation page.

    If you get corrupted tables or if mysqld always fails after some update commands, you can test if this bug is reproducible by doing the following:

    • Stop the mysqld daemon (with mysqladmin shutdown)
    • Check all tables with myisamchk -s database/*.MYI. Repair any wrong tables with myisamchk -r database/table.MYI.
    • Start mysqld with --log-update
    • When you have got a crashed table, stop the mysqld server.
    • Restore the backup.
    • Restart the mysqld server without --log-update
    • Re-execute the commands with mysql < update-log. The update log is saved in the MySQL database directory with the name your-hostname.#.
    • If the tables are now again corrupted, you have found reproducible bug in the ISAM code! FTP the tables and the update log to ftp://www.mysql.com/pub/mysql/secret and we will fix this as soon as possible!

    The command mysqladmin debug will dump some information about locks in use, used memory and query usage to the mysql log file. This may help solve some problems. This command also provides some useful information even if you haven't compiled MySQL for debugging!

    If the problem is that some tables are getting slower and slower you should try to optimize the table with OPTIMIZE TABLE or myisamchk. See section 13 Maintaining a MySQL installation. You should also check the slow queries with EXPLAIN.

    You should also read the OS-specific section in this manual for problems that may be unique to your environment. See section 4.11 System-specific issues.

    If you are using the Perl DBI interface, you can turn on debugging information by using the trace method or by setting the DBI_TRACE environment variable. See section 20.5.2 The DBI interface.

    G.2 Debugging a MySQL client

    To be able to debug a MySQL client with the integrated debug package, you should configure MySQL with --with-debug. See section 4.7.3 Typical configure options.

    Before running a client, you should set the MYSQL_DEBUG environment variable:

    shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace
    shell> export MYSQL_DEBUG
    

    This causes clients to generate a trace file in '/tmp/client.trace'.

    If you have problems with your own client code, you should attempt to connect to the server and run your query using a client that is known to work. Do this by running mysql in debugging mode (assuming you have compiled MySQL with debugging on):

    shell> mysql --debug=d:t:O,/tmp/client.trace
    

    This will provide useful information in case you mail a bug report. See section 2.3 How to report bugs or problems.

    If your client crashes at some 'legal' looking code, you should check that your 'mysql.h' include file matches your mysql library file. A very common mistake is to use an old 'mysql.h' file from an old MySQL installation with new MySQL library.

    G.3 Comments about RTS threads

    I have tried to use the RTS thread packages with MySQL but stumbled on the following problems:

    They use old version of a lot of POSIX calls and it is very tedious to make wrappers for all functions. I am inclined to think that it would be easier to change the thread libraries to the newest POSIX specification.

    Some wrappers are already written. See 'mysys/my_pthread.c' for more info.

    At least the following should be changed:

    pthread_get_specific should use one argument. sigwait should take two arguments. A lot of functions (at least pthread_cond_wait, pthread_cond_timedwait) should return the error code on error. Now they return -1 and set errno.

    Another problem is that user-level threads use the ALRM signal and this aborts a lot of functions (read, write, open...). MySQL should do a retry on interrupt on all of these but it is not that easy to verify it.

    The biggest unsolved problem is the following:

    To get thread-level alarms I changed 'mysys/thr_alarm.c' to wait between alarms with pthread_cond_timedwait(), but this aborts with error EINTR. I tried to debug the thread library as to why this happens, but couldn't find any easy solution.

    If someone wants to try MySQL with RTS threads I suggest the following:

    • Change functions MySQL uses from the thread library to POSIX. This shouldn't take that long.
    • Compile all libraries with the -DHAVE_rts_threads.
    • Compile thr_alarm.
    • If there are some small differences in the implementation, they may be fixed by changing 'my_pthread.h' and 'my_pthread.c'.
    • Run thr_alarm. If it runs without any "warning", "error" or aborted messages, you are on the right track. Here follows a successful run on Solaris:
      Main thread: 1
      Tread 0 (5) started
      Thread: 5  Waiting
      process_alarm
      Tread 1 (6) started
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 1 (1) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 2 (2) sec
      Thread: 6  Simulation of no alarm needed
      Thread: 6  Slept for 0 (3) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 4 (4) sec
      Thread: 6  Waiting
      process_alarm
      thread_alarm
      Thread: 5  Slept for 10 (10) sec
      Thread: 5  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 5 (5) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      
      ...
      thread_alarm
      Thread: 5  Slept for 0 (1) sec
      end
      

    G.4 Differences between different thread packages

    MySQL is very dependent on the thread package used. So when choosing a good platform for MySQL, the thread package is very important.

    There are at least three types of thread packages:

    • User threads in a single process. Thread switching is managed with alarms and the threads library manages all non-thread-safe functions with locks. Read, write and select operations are usually managed with a thread-specific select that switches to another thread if the running threads have to wait for data. If the user thread packages are integrated in the standard libs (FreeBSD and BSDI threads) the thread package requires less overhead than thread packages that have to map all unsafe calls (MIT-pthreads, FSU Pthreads and RTS threads). In some environments (for example, SCO), all system calls are thread-safe so the mapping can be done very easily (FSU Pthreads on SCO). Downside: All mapped calls take a little time and it's quite tricky to be able to handle all situations. There are usually also some system calls that are not handled by the thread package (like MIT-pthreads and sockets). Thread scheduling isn't always optimal.
    • User threads in separate processes. Thread switching is done by the kernel and all data are shared between threads. The thread package manages the standard thread calls to allow sharing data between threads. LinuxThreads is using this method. Downside: Lots of processes. Thread creating is slow. If one thread dies the rest are usually left hanging and you must kill them all before restarting. Thread switching is somewhat expensive.
    • Kernel threads. Thread switching is handled by the thread library or the kernel and is very fast. Everything is done in one process, but on some systems, ps may show the different threads. If one thread aborts the whole process aborts. Most system calls are thread-safe and should require very little overhead. Solaris, HP-UX, AIX and OSF1 have kernel threads.

    In some systems kernel threads are managed by integrating user level threads in the system libraries. In such cases, the thread switching can only be done by the thread library and the kernel isn't really "thread aware".

    H Description of MySQL regular expression syntax

    A regular expression (regex) is a powerful way of specifying a complex search.

    MySQL uses regular Henry Spencer's inplementation of regular expressions. And that is aimed to conform to POSIX 1003.2. MySQL uses the extended version.

    This is a simplistic reference that skips the details. To get more exact information, see Henry Spencer's regex(7) manual page that is included in the source distribution. See section C Contributors to MySQL.

    A regular expression describes a set of strings. The simplest regexp is one that has no special characters in it. For example, the regexp hello matches hello and nothing else.

    Nontrivial regular expressions use certain special constructs so that they can match more than one string. For example, the regexp hello|word matches either the string hello or the string word.

    As a more complex example, the regexp B[an]*s matches any of the strings Bananas, Baaaaas, Bs and any other string starting with a B, ending with an s, and containing any number of a or n characters in between.

    A regular expression may use any of the following special characters/constructs:

    ^
    Match the beginning of a string.
    mysql> select "fo\nfo" REGEXP "^fo$";           -> 0
    mysql> select "fofo" REGEXP "^fo";              -> 1
    
    $
    Match the end of a string.
    mysql> select "fo\no" REGEXP "^fo\no$";         -> 1
    mysql> select "fo\no" REGEXP "^fo$";            -> 0
    
    .
    Match any character (including newline).
    mysql> select "fofo" REGEXP "^f.*";             -> 1
    mysql> select "fo\nfo" REGEXP "^f.*";           -> 1
    
    a*
    Match any sequence of zero or more a characters.
    mysql> select "Ban" REGEXP "^Ba*n";             -> 1
    mysql> select "Baaan" REGEXP "^Ba*n";           -> 1
    mysql> select "Bn" REGEXP "^Ba*n";              -> 1
    
    a+
    Match any sequence of one or more a characters.
    mysql> select "Ban" REGEXP "^Ba+n";             -> 1
    mysql> select "Bn" REGEXP "^Ba+n";              -> 0
    
    a?
    Match either zero or one a character.
    mysql> select "Bn" REGEXP "^Ba?n";              -> 1
    mysql> select "Ban" REGEXP "^Ba?n";             -> 1
    mysql> select "Baan" REGEXP "^Ba?n";            -> 0
    
    de|abc
    Match either of the sequences de or abc.
    mysql> select "pi" REGEXP "pi|apa";             -> 1
    mysql> select "axe" REGEXP "pi|apa";            -> 0
    mysql> select "apa" REGEXP "pi|apa";            -> 1
    mysql> select "apa" REGEXP "^(pi|apa)$";        -> 1
    mysql> select "pi" REGEXP "^(pi|apa)$";         -> 1
    mysql> select "pix" REGEXP "^(pi|apa)$";        -> 0
    
    (abc)*
    Match zero or more instances of the sequence abc.
    mysql> select "pi" REGEXP "^(pi)*$";            -> 1
    mysql> select "pip" REGEXP "^(pi)*$";           -> 0
    mysql> select "pipi" REGEXP "^(pi)*$";          -> 1
    
    {1}
    {2,3}
    The is a more general way of writing regexps that match many occurrences of the previous atom.
    a*
    Can be written as a{0,}.
    a+
    Can be written as a{1,}.
    a?
    Can be written as a{0,1}.
    To be more precise, an atom followed by a bound containing one integer i and no comma matches a sequence of exactly i matches of the atom. An atom followed by a bound containing one integer i and a comma matches a sequence of i or more matches of the atom. An atom followed by a bound containing two integers i and j matches a sequence of i through j (inclusive) matches of the atom. Both arguments must 0 >= value <= RE_DUP_MAX (default 255). If there are two arguments, the second must be greater than or equal to the first.
    [a-dX]
    [^a-dX]
    Matches any character which is (or is not, if ^ is used) either a, b, c, d or X. To include a literal ] character, it must immediately follow the opening bracket [. To include a literal - character, it must be written first or last. So [0-9] matches any decimal digit. Any character that does not have a defined meaning inside a [] pair has no special meaning and matches only itself.
    mysql> select "aXbc" REGEXP "[a-dXYZ]";         -> 1
    mysql> select "aXbc" REGEXP "^[a-dXYZ]$";       -> 0
    mysql> select "aXbc" REGEXP "^[a-dXYZ]+$";      -> 1
    mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$";     -> 0
    mysql> select "gheis" REGEXP "^[^a-dXYZ]+$";    -> 1
    mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$";   -> 0
    
    [[.characters.]]
    The sequence of characters of that collating element. The sequence is a single element of the bracket expression's list. A bracket expression containing a multi-character collating element can thus match more than one character, e.g., if the collating sequence includes a ch collating element, then the regular expression [[.ch.]]*c matches the first five characters of chchcc.
    [=character_class=]
    An equivalence class, standing for the sequences of characters of all collating elements equivalent to that one, including itself. For example, if o and (+) are the members of an equivalence class, then [[=o=]], [[=(+)=]], and [o(+)] are all synonymous. An equivalence class may not be an endpoint of a range.
    [:character_class:]
    Within a bracket expression, the name of a character class enclosed in [: and :] stands for the list of all characters belonging to that class. Standard character class names are:
    alnum digit punct
    alpha graph space
    blank lower upper
    cntrl print xdigit
    These stand for the character classes defined in the ctype(3) manual page. A locale may provide others. A character class may not be used as an endpoint of a range.
    mysql> select "justalnums" REGEXP "[[:alnum:]]+";  -> 1
    mysql> select "!!" REGEXP "[[:alnum:]]+";  -> 0
    
    [[:<:]]
    [[:>:]]
    These match the null string at the beginning and end of a word respectively. A word is defined as a sequence of word characters which is neither preceded nor followed by word characters. A word character is an alnum character (as defined by ctype(3)) or an underscore (_).
    mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]";  -> 1
    mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]";  -> 0
    
    mysql> select "weeknights" REGEXP
     "^(wee|week)(knights|nights)$"; -> 1
    

    I What is Unireg?

    Unireg is our tty interface builder, but it uses a low level connection to our ISAM (which is used by MySQL) and because of this it is very quick. It has existed since 1979 (on Unix in C since ~1986).

    Unireg has the following components:

    • One table viewer with updates/browsing.
    • Multi table viewer (with one scrolling region).
    • Table creator. (With lots of column tags you can't create with MySQL) This is WYSIWYG (for a tty). You design a screen and Unireg prompts for the column specification.
    • Report generator.
    • A lot of utilities (quick export/import of tables to/from text files, analysis of table contents...).
    • Powerful multi-table updates (which we use a lot) with a BASIC-like language with LOTS of functions.
    • Dynamic languages (at present in Swedish and Finnish). If somebody wants an English version there are a few files that would have to be translated.
    • The ability to run updates interactively or in a batch.
    • Emacs-like key definitions with keyboard macros.
    • All this in a binary of 800K.
    • The convform utility. Converts '.frm' and text files between different character sets.
    • The myisampack utility. Packs a ISAM table (makes it 50-80% smaller). The table can be read by MySQL like an ordinary table. Only one record has to be decompressed per access. Cannot handle BLOB or TEXT columns or updates (yet).

    We update most of our production databases with the Unireg interface and serve web pages through MySQL (and in some extreme cases the Unireg report generator).

    Unireg takes about 3M of disk space and works on at least the following platforms: SunOS 4.x, Solaris, Linux, HP-UX, ICL Unix, DNIX, SCO and MS-DOS.

    Unireg is currently only available in Swedish and Finnish.

    The price tag for Unireg is 10,000 Swedish kr (about $1500 US), but this includes support. Unireg is distributed as a binary. (But all the ISAM sources can be found in MySQL). Usually we compile the binary for the customer at their site.

    All new development is concentrated to MySQL.

    J The MySQL server license for non Microsoft operating systems

    MySQL FREE PUBLIC LICENSE (Version 4, March 5, 1995)

    Copyright (C) 1995, 1996 TcX AB & Monty Program KB & Detron HB Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN All rights reserved.

    NOTE: This license is not the same as any of the GNU Licenses published by the Free Software Foundation. Its terms are substantially different from those of the GNU Licenses. If you are familiar with the GNU Licenses, please read this license with extra care.

    This License applies to the computer program known as "MySQL". The "Program", below, refers to such program, and a "work based on the Program" means either the Program or any derivative work of the Program, as defined in the United States Copyright Act of 1976, such as a translation or a modification. The Program is a copyrighted work whose copyright is held by TcX Datakonsult AB and Monty Program KB and Detron HB.

    This License does not apply when running "MySQL" on any Microsoft operating system. Microsoft operating systems include all versions of Microsoft Windows NT and Microsoft Windows.

    BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM.

    1. Licenses. Licensor hereby grants you the following rights, provided that you comply with all of the restrictions set forth in this License and provided, further, that you distribute an unmodified copy of this License with the Program:
      1. You may copy and distribute literal (i.e., verbatim) copies of the Program's source code as you receive it throughout the world, in any medium.
      2. You may modify the Program, create works based on the Program and distribute copies of such throughout the world, in any medium.
    2. Restrictions. This license is subject to the following restrictions:
      1. Distribution of the Program or any work based on the Program by a commercial organization to any third party is prohibited if any payment is made in connection with such distribution, whether directly (as in payment for a copy of the Program) or indirectly (as in payment for some service related to the Program, or payment for some product or service that includes a copy of the Program "without charge"; these are only examples, and not an exhaustive enumeration of prohibited activities). However, the following methods of distribution involving payment shall not in and of themselves be a violation of this restriction:
        1. Posting the Program on a public access information storage and retrieval service for which a fee is received for retrieving information (such as an on-line service), provided that the fee is not content-dependent (i.e., the fee would be the same for retrieving the same volume of information consisting of random data).
        2. Distributing the Program on a CD-ROM, provided that the files containing the Program are reproduced entirely and verbatim on such CD-ROM, and provided further that all information on such CD-ROM be redistributable for non-commercial purposes without charge.
      2. Activities other than copying, distribution and modification of the Program are not subject to this License and they are outside its scope. Functional use (running) of the Program is not restricted, and any output produced through the use of the Program is subject to this license only if its contents constitute a work based on the Program (independent of having been made by running the Program).
      3. You must meet all of the following conditions with respect to the distribution of any work based on the Program:
        1. If you have modified the Program, you must cause your work to carry prominent notices stating that you have modified the Program's files and the date of any change;
        2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole and at no charge to all third parties under the terms of this License;
        3. If the modified program normally reads commands interactively when run, you must cause it, at each time the modified program commences operation, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty). Such notice must also state that users may redistribute the Program only under the conditions of this License and tell the user how to view the copy of this License included with the Program. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.);
        4. You must accompany any such work based on the Program with the complete corresponding machine-readable source code, delivered on a medium customarily used for software interchange. The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable code. However, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable code;
        5. If you distribute any written or printed material at all with the Program or any work based on the Program, such material must include either a written copy of this License, or a prominent written indication that the Program or the work based on the Program is covered by this License and written instructions for printing and/or displaying the copy of the License on the distribution medium;
        6. You may not impose any further restrictions on the recipient's exercise of the rights granted herein. If distribution of executable or object code is made by offering the equivalent ability to copy from a designated place, then offering equivalent ability to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source code along with the object code.
    3. Reservation of Rights. No rights are granted to the Program except as expressly set forth herein. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
    4. Other Restrictions. If the distribution and/or use of the Program is restricted in certain countries for any reason, Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
    5. Limitations. THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    K The MySQL license for Microsoft operating systems

    MySQL shareware license for Microsoft operating systems (Version 1, September 4, 1998)

    Copyright (C) 1998 TcX AB & Monty Program KB & Detron HB Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN All rights reserved.

    This License applies to the computer program known as "MySQL".

    This License applies when running MySQL on any Microsoft operating system. Microsoft operating systems include all versions of Microsoft Windows NT and Microsoft Windows.

    YOU SHOULD CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS BEFORE USING, COPYING OR DISTRIBUTING MySQL. BY USING, COPYING AND DISTRIBUTING MySQL, YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR USING, COPYING AND DISTRIBUTING MySQL OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO USE, COPY OR DISTRIBUTE MySQL OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT USE, COPY OR DISTRIBUTE MySQL.

    1. Evaluation and License Registration. This is an evaluation version of MySQL for Win32. Subject to the terms below, you are hereby licensed to use MySQL for evaluation purposes without charge for a period of 30 days. If you use MySQL after the 30 day evaluation period the registration and purchase of a MySQL license is required. The price for a MySQL license is currently 200 US dollars and email support starts from 200 US dollars/year. Quantity discounts are available. If you pay by credit card, the currency is EURO (The European Unions common currency) so the prices will differ slightly. The easiest way to register or find options about how to pay for MySQL is to use the license form at TcX's secure server at https://www.mysql.com/license.htmy. This can be used also when paying with credit card over the Internet. Other applicable methods for paying are SWIFT payments, cheques and credit cards. Payment should be made to:
      Postgirot Bank AB
      105 06 STOCKHOLM, SWEDEN
      
      TCX DataKonsult AB
      BOX 6434
      11382 STOCKHOLM, SWEDEN
      
      SWIFT address: PGSI SESS
      Account number: 96 77 06 - 3
      
      Specify: license and/or support and your name and email address. In Europe and Japan, EuroGiro (that should be cheaper) can be used to the same account. If you want to pay by cheque make it payable to "Monty Program KB" and mail it to the address below.
      TCX DataKonsult AB
      BOX 6434
      11382 STOCKHOLM, SWEDEN
      
      For more information about commercial licensing, please contact:
      David Axmark
      Kungsgatan 65 B
      753 21 UPPSALA
      SWEDEN
      Voice Phone +46-18-10 22 80  GMT 9-21. Swedish and
                             English spoken
      Fax +46-8-729 69 05          Email *much* preferred. 
      E-Mail: mysql-licensing@mysql.com
      
      For more about the license prices and commercial support, like email support, please refer to the MySQL manual. See section 3.5 MySQL licensing and support costs. See section 3.6 Types of commercial support. The use of MySQL or any work based on MySQL after the 30-day evaluation period is in violation of international copyright laws.
    2. Registered version of MySQL. After you have purchased a MySQL license we will send you a receipt by paper mail. You are allowed to use MySQL or any work based on MySQL after the 30-days evaluation period. The use of MySQL is, however, restricted to one physical computer, but there are no restrictions on concurrent uses of MySQL or the number of MySQL servers run on the computer. We will also email you an address and password for a password-protected WWW page that always has the newest MySQL-Win32 version. Our current policy is that a user with the MySQL license can get free upgrades. The best way to ensure that you get the best possible support is to purchase commercial support!
    3. Registration for use in education and university or government-sponsored research. You may obtain a MySQL license for the use in education and university or government-sponsored research for free. In that case, send a detailed application for licensing MySQL for such use to the email address The following information is required in the application:
      • The name of the school or institute.
      • A short description of the school or institute and of the type of education, resarch or other functions it provides.
      • A detailed report of the use of MySQL in the institution.
      In this case you will be provided with a license that entitles you to use MySQL in a specified manner.
    4. Distribution. Provided that you verify that you are distributing an evaluation or educational/research version of MySQL you are hereby licensed to make as many literal (i.e., verbatim) copies of the evaluation version of MySQL and documentation as you wish.
    5. Restrictions. The client code of MySQL is in the Public Domain or under the GPL (for example the code for readline) license. You are not allowed to modify, recompile, translate or create derivative works based upon any part of the server code of MySQL.
    6. Reservation of Rights. No rights are granted to MySQL except as expressly set forth herein. You may not copy or distribute MySQL except as expressly provided under this License. Any attempt otherwise to copy or distribute MySQL is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
    7. Other Restrictions. If the distribution and/or use of MySQL is restricted in certain countries for any reason, the Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
    8. Limitations. MySQL IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR MySQL, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF MySQL IS WITH YOU. SHOULD MySQL PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL THE LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE MySQL AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE MySQL (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF MySQL TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    SQL command, type and function index

  • ! (logical NOT)
  • != (not equal)
  • "
  • % (modulo)
  • % (wildcard character)
  • & (bitwise AND)
  • && (logical AND)
  • () (parentheses)
  • * (multiplication)
  • + (addition)
  • - (subtraction)
  • - (unary minus)
  • .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file
  • .mysql_history file
  • .pid (process ID) file
  • / (division)
  • /etc/passwd, /etc/passwd
  • < (less than)
  • << (left shift)
  • <= (less than or equal)
  • <=> (Equal to)
  • <> (not equal)
  • = (equal)
  • > (greater than)
  • >= (greater than or equal)
  • >> (right shift)
  • \" (double quote)
  • \' (single quote)
  • \0 (ASCII 0)
  • \\ (escape)
  • \b (backspace)
  • \n (newline)
  • \r (carriage return)
  • \t (tab)
  • _ (wildcard character)
  • '
  • A

  • ABS()
  • ACOS()
  • ADDDATE()
  • addition (+)
  • alias
  • ALTER TABLE
  • AND, bitwise
  • AND, logical
  • Arithmetic functions
  • ASCII()
  • ASIN()
  • ATAN()
  • ATAN2()
  • AUTO_INCREMENT, using with DBI
  • AVG()
  • B

  • backspace (\b)
  • BENCHMARK()
  • BETWEEN ... AND
  • BIGINT
  • BIN()
  • BINARY
  • Bit functions
  • BIT_AND()
  • BIT_COUNT()
  • BIT_OR()
  • BLOB, BLOB
  • C

  • carriage return (\r)
  • CASE
  • Casts
  • CC environment variable, CC environment variable
  • CEILING()
  • CFLAGS environment variable
  • CHAR, CHAR
  • CHAR VARYING
  • CHAR()
  • CHAR_LENGTH()
  • CHARACTER
  • CHARACTER VARYING
  • CHARACTER_LENGTH()
  • ChopBlanks DBI method
  • COALESCE()
  • Comment syntax
  • Comparison operators
  • CONCAT()
  • connect() DBI method
  • Control flow functions
  • CONV()
  • COS()
  • COT()
  • COUNT()
  • COUNT(DISTINCT)
  • CREATE DATABASE
  • CREATE FUNCTION
  • CREATE INDEX
  • CREATE TABLE
  • CROSS JOIN
  • CURDATE()
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • CURTIME()
  • CXX environment variable, CXX environment variable, CXX environment variable, CXX environment variable
  • CXXFLAGS environment variable, CXXFLAGS environment variable
  • D

  • data_sources() DBI method
  • DATABASE()
  • DATE, DATE
  • Date and time functions
  • DATE_ADD()
  • DATE_FORMAT()
  • DATE_SUB()
  • DATETIME, DATETIME
  • DAYNAME()
  • DAYOFMONTH()
  • DAYOFWEEK()
  • DAYOFYEAR()
  • DBI->connect()
  • DBI->data_sources()
  • DBI->disconnect
  • DBI->do()
  • DBI->execute
  • DBI->fetchall_arrayref
  • DBI->fetchrow_array
  • DBI->fetchrow_arrayref
  • DBI->fetchrow_hashref
  • DBI->finish
  • DBI->prepare()
  • DBI->quote
  • DBI->quote()
  • DBI->rows
  • DBI->trace, DBI->trace
  • DBI->{ChopBlanks}
  • DBI->{insertid}
  • DBI->{is_blob}
  • DBI->{is_key}
  • DBI->{is_not_null}
  • DBI->{is_num}
  • DBI->{is_pri_key}
  • DBI->{length}
  • DBI->{max_length}
  • DBI->{NAME}
  • DBI->{NULLABLE}
  • DBI->{NUM_OF_FIELDS}
  • DBI->{table}
  • DBI->{type}
  • DBI_TRACE environment variable, DBI_TRACE environment variable
  • DECIMAL
  • DECODE()
  • DEGREES()
  • DELAYED
  • DELETE
  • DESC
  • DESCRIBE
  • disconnect DBI method
  • DISTINCT, DISTINCT
  • division (/)
  • do() DBI method
  • DOUBLE
  • DOUBLE PRECISION
  • double quote (\")
  • DROP DATABASE
  • DROP FUNCTION
  • DROP INDEX
  • DROP TABLE
  • DUMPFILE
  • E

  • ELT()
  • ENCODE()
  • ENCRYPT()
  • ENUM, ENUM
  • Environment variable, CC, Environment variable, CC
  • Environment variable, CFLAGS
  • Environment variable, CXX, Environment variable, CXX, Environment variable, CXX
  • Environment variable, CXXFLAGS, Environment variable, CXXFLAGS
  • Environment variable, DBI_TRACE, Environment variable, DBI_TRACE
  • Environment variable, HOME
  • Environment variable, LD_RUN_PATH, Environment variable, LD_RUN_PATH, Environment variable, LD_RUN_PATH
  • Environment variable, MYSQL_DEBUG, Environment variable, MYSQL_DEBUG
  • Environment variable, MYSQL_HISTFILE
  • Environment variable, MYSQL_HOST
  • Environment variable, MYSQL_PWD, Environment variable, MYSQL_PWD
  • Environment variable, MYSQL_TCP_PORT, Environment variable, MYSQL_TCP_PORT, Environment variable, MYSQL_TCP_PORT
  • Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT
  • Environment variable, PATH
  • Environment variable, TMPDIR
  • Environment variable, TZ, Environment variable, TZ, Environment variable, TZ
  • Environment variable, UMASK
  • Environment variable, USER
  • Environment variables, CXX
  • equal (=)
  • escape (\\)
  • execute DBI method
  • EXP()
  • EXPLAIN
  • EXPORT_SET()
  • EXTRACT(type FROM date)
  • F

  • fetchall_arrayref DBI method
  • fetchrow_array DBI method
  • fetchrow_arrayref DBI method
  • fetchrow_hashref DBI method
  • FIELD()
  • FILE
  • FIND_IN_SET()
  • finish DBI method
  • FLOAT, FLOAT
  • FLOAT(M,D)
  • FLOAT(precision), FLOAT(precision)
  • FLOAT(precision) [ZEROFILL]
  • FLOOR()
  • FLUSH
  • FORMAT()
  • FROM_DAYS()
  • FROM_UNIXTIME(), FROM_UNIXTIME()
  • Functions, arithmetic
  • Functions, bit
  • Functions, control flow
  • Functions, date and time
  • Functions, GROUP BY
  • Functions, logical
  • Functions, mathematical
  • Functions, miscellaneous
  • Functions, string
  • Functions, string comparison
  • Functions, user-defined
  • G

  • GET_LOCK()
  • GRANT
  • greater than (>)
  • greater than or equal (>=)
  • GREATEST()
  • GROUP BY functions
  • H

  • HEX()
  • Hexadecimal values
  • HOME environment variable
  • host.frm, problems finding
  • HOUR()
  • I

  • IF()
  • IFNULL()
  • IN
  • INNER JOIN
  • INSERT
  • INSERT DELAYED
  • INSERT()
  • insertid DBI method
  • INSTR()
  • INT
  • INTEGER
  • INTERVAL()
  • IS NOT NULL
  • IS NULL
  • IS NULL, and indexes
  • is_blob DBI method
  • is_key DBI method
  • is_not_null DBI method
  • is_num DBI method
  • is_pri_key DBI method
  • ISNULL()
  • J

  • JOIN
  • K

  • KILL
  • L

  • LAST_INSERT_ID()
  • LAST_INSERT_ID([expr])
  • LCASE()
  • LD_RUN_PATH environment variable, LD_RUN_PATH environment variable, LD_RUN_PATH environment variable
  • LEAST()
  • LEFT JOIN
  • LEFT OUTER JOIN
  • LEFT()
  • length DBI method
  • LENGTH()
  • less than (<)
  • less than or equal (<=)
  • LIKE
  • LIKE, and indexes
  • LIKE, and wildcards
  • LOAD DATA INFILE, LOAD DATA INFILE
  • LOCATE(), LOCATE()
  • LOCK TABLES
  • LOG()
  • LOG10()
  • Logical functions
  • LONGBLOB
  • LONGTEXT
  • LOWER()
  • LPAD()
  • LTRIM()
  • M

  • MAKE_SET()
  • Mathematical functions
  • MAX()
  • max_length DBI method
  • MD5()
  • MEDIUMBLOB
  • MEDIUMINT
  • MEDIUMTEXT
  • MID()
  • MIN()
  • minus, unary (-)
  • MINUTE()
  • Miscellaneous functions
  • MOD()
  • modulo (%)
  • MONTH()
  • MONTHNAME()
  • multiplication (*)
  • my_ulonglong C type
  • my_ulonglong values, printing
  • MYSQL C type
  • mysql_affected_rows()
  • mysql_change_user()
  • mysql_close()
  • mysql_connect()
  • mysql_create_db()
  • mysql_data_seek()
  • MYSQL_DEBUG environment variable, MYSQL_DEBUG environment variable
  • mysql_debug()
  • mysql_drop_db()
  • mysql_dump_debug_info()
  • mysql_eof()
  • mysql_errno()
  • mysql_error()
  • mysql_escape_string()
  • mysql_escape_string()
  • mysql_fetch_field()
  • mysql_fetch_field_direct()
  • mysql_fetch_fields()
  • mysql_fetch_lengths()
  • mysql_fetch_row()
  • MYSQL_FIELD C type
  • mysql_field_count(), mysql_field_count()
  • MYSQL_FIELD_OFFSET C type
  • mysql_field_seek()
  • mysql_field_tell()
  • mysql_free_result()
  • mysql_get_client_info()
  • mysql_get_host_info()
  • mysql_get_proto_info()
  • mysql_get_server_info()
  • MYSQL_HISTFILE environment variable
  • MYSQL_HOST environment variable
  • mysql_info()
  • mysql_info(), mysql_info(), mysql_info(), mysql_info()
  • mysql_init()
  • mysql_insert_id()
  • mysql_insert_id()
  • mysql_kill()
  • mysql_list_dbs()
  • mysql_list_fields()
  • mysql_list_processes()
  • mysql_list_tables()
  • mysql_num_fields()
  • mysql_num_rows()
  • mysql_options()
  • mysql_ping()
  • MYSQL_PWD environment variable, MYSQL_PWD environment variable
  • mysql_query()
  • mysql_real_connect()
  • mysql_real_query()
  • mysql_reload()
  • MYSQL_RES C type
  • MYSQL_ROW C type
  • mysql_row_seek()
  • mysql_row_tell()
  • mysql_select_db()
  • mysql_shutdown()
  • mysql_stat()
  • mysql_store_result()
  • MYSQL_TCP_PORT environment variable, MYSQL_TCP_PORT environment variable, MYSQL_TCP_PORT environment variable
  • mysql_thread_id()
  • MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable
  • mysql_use_result()
  • N

  • NAME DBI method
  • NATIONAL CHAR
  • NATURAL LEFT JOIN
  • NATURAL LEFT OUTER JOIN
  • NCHAR
  • newline (\n)
  • not equal (!=)
  • not equal (<>)
  • NOT IN
  • NOT LIKE
  • NOT REGEXP
  • NOT, logical
  • NOW()
  • NUL
  • NULL
  • NULL value
  • NULLABLE DBI method
  • NUM_OF_FIELDS DBI method
  • NUMERIC
  • O

  • OCT()
  • OCTET_LENGTH()
  • OPTIMIZE TABLE
  • OR, bitwise
  • OR, logical
  • ORD()
  • P

  • parentheses ( and )
  • PASSWORD(), PASSWORD(), PASSWORD(), PASSWORD()
  • PATH environment variable
  • PERIOD_ADD()
  • PERIOD_DIFF()
  • PI()
  • POSITION()
  • POW()
  • POWER()
  • prepare() DBI method
  • PROCESSLIST
  • Q

  • QUARTER()
  • quote() DBI method
  • Quoting of identifiers
  • R

  • RADIANS()
  • RAND()
  • REAL
  • REGEXP
  • RELEASE_LOCK()
  • REPEAT()
  • REPLACE
  • REPLACE()
  • return (\r)
  • REVERSE()
  • REVOKE
  • RIGHT()
  • RLIKE
  • ROUND(), ROUND()
  • rows DBI method
  • RPAD()
  • RTRIM()
  • S

  • SEC_TO_TIME()
  • SECOND()
  • SELECT
  • SELECT, optimizing
  • SESSION_USER()
  • SET, SET
  • SET OPTION
  • SHOW COLUMNS
  • SHOW DATABASES
  • SHOW FIELDS
  • SHOW GRANTS
  • SHOW INDEX
  • SHOW KEYS
  • SHOW PROCESSLIST
  • SHOW STATUS
  • SHOW TABLE STATUS
  • SHOW TABLES
  • SHOW VARIABLES
  • SIGN()
  • SIN()
  • single quote (\')
  • SMALLINT
  • SOUNDEX()
  • SPACE()
  • SQRT()
  • STD()
  • STDDEV()
  • STRAIGHT_JOIN
  • STRCMP()
  • String comparison functions
  • String functions
  • SUBDATE()
  • SUBSTRING(), SUBSTRING()
  • SUBSTRING_INDEX()
  • subtraction (-)
  • SUM()
  • SYSDATE()
  • SYSTEM_USER()
  • T

  • tab (\t)
  • table DBI method
  • table_cache
  • TAN()
  • TEXT, TEXT
  • Threads
  • TIME, TIME
  • TIME_FORMAT()
  • TIME_TO_SEC()
  • TIMESTAMP, TIMESTAMP
  • TINYBLOB
  • TINYINT
  • TINYTEXT
  • TMPDIR environment variable
  • TO_DAYS()
  • trace DBI method, trace DBI method
  • TRIM()
  • TRUNCATE()
  • type DBI method
  • Types
  • TZ environment variable, TZ environment variable, TZ environment variable
  • U

  • UCASE()
  • UDF functions
  • ulimit
  • UMASK environment variable
  • unary minus (-)
  • UNIX_TIMESTAMP()
  • UNLOCK TABLES
  • UPDATE
  • UPPER()
  • USE
  • USER environment variable
  • USER()
  • User-defined functions
  • V

  • VARCHAR, VARCHAR
  • VERSION()
  • W

  • WEEK()
  • WEEKDAY()
  • Wildcard character (%)
  • Wildcard character (_)
  • Y

  • YEAR, YEAR
  • YEAR()
  • | (bitwise OR)
  • || (logical OR)
  • ~
  • Concept Index

    A

  • Adding native functions
  • Adding user-definable functions
  • Alias names, case sensitivity
  • Aliases, for expressions
  • Aliases, for tables
  • Aliases, in GROUP BY clauses
  • Aliases, in ORDER BY clauses
  • Aliases, on expressions
  • Anonymous user, Anonymous user, Anonymous user
  • ANSI SQL, differences from
  • Arithmetic expressions
  • AUTO_INCREMENT, and NULL values
  • B

  • Backups
  • Big5 Chinese character encoding
  • BLOB columns, default values
  • BLOB columns, indexing
  • BLOB, inserting binary data
  • Bug reports
  • C

  • C++ compiler cannot create executables
  • Case sensitivity, in access checking
  • Case sensitivity, in searches
  • Case sensitivity, in string comparisons
  • Case sensitivity, of alias names
  • Case sensitivity, of column names
  • Case sensitivity, of database names, Case sensitivity, of database names
  • Case sensitivity, of table names, Case sensitivity, of table names
  • Casts
  • cc1plus problems
  • Checking tables for errors
  • Chinese
  • Choosing table types
  • Choosing types
  • Choosing version
  • Client programs, building
  • Column names, case sensitivity
  • Command line history
  • Commands out of sync
  • Compatibility, between MySQL versions, Compatibility, between MySQL versions
  • Compatibility, with ANSI SQL
  • Compatibility, with mSQL
  • Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC
  • Compatibility, with Oracle, Compatibility, with Oracle, Compatibility, with Oracle
  • Compatibility, with PostgreSQL
  • Compatibility, with Sybase
  • Configuration files
  • configure, running after prior invocation
  • Constant table, Constant table
  • Contact information
  • Copyright
  • Costs, licensing and support
  • D

  • Database mirroring
  • Database names, case sensitivity, Database names, case sensitivity
  • Database replication, Database replication
  • Date and Time types
  • db table, sorting
  • DBI Perl module
  • Default options
  • Default values, BLOB and TEXT columns
  • Disk full
  • Downloading
  • E

  • Environment variables, Environment variables, Environment variables, Environment variables
  • Expression aliases
  • Expressions, aliases for
  • F

  • fatal signal 11
  • Foreign keys
  • FreeBSD troubleshooting
  • Full disk
  • Functions for SELECT and WHERE clauses
  • Functions, native, adding
  • Functions, user-definable, adding
  • G

  • Getting MySQL
  • Grant tables, sorting, Grant tables, sorting
  • GROUP BY, aliases in
  • Grouping of expressions
  • H

  • HEAP table type
  • History file
  • host table, sorting
  • How to pronounce MySQL
  • I

  • In memory tables
  • Indexes, Indexes
  • Indexes, and BLOB columns
  • Indexes, and IS NULL
  • Indexes, and LIKE
  • Indexes, and NULL values
  • Indexes, and TEXT columns
  • Indexes, leftmost prefix of
  • Indexes, multi-part
  • Internal compiler errors
  • ISAM table type
  • K

  • Keys
  • Keywords
  • L

  • Language support
  • Leftmost prefix of indexes
  • Licensing costs
  • Licensing policy
  • Licensing terms
  • Linking
  • Log file, names
  • M

  • make_binary_release
  • Manual information
  • Memory use
  • Mirroring, database
  • mSQL compatibility
  • msql2mysql
  • Multi-byte characters
  • Multi-part index
  • Multiple servers
  • MyISAM table type
  • myisamchk, myisamchk
  • myisampack, myisampack, myisampack, myisampack, myisampack
  • MyODBC
  • mysql
  • MySQL binary distribution
  • MySQL mailing lists
  • MySQL source distribution
  • MySQL version, MySQL version
  • MySQL, how to pronounce
  • MySQL, what it is
  • mysql_fix_privilege_tables
  • mysql_install_db
  • mysqlaccess
  • mysqladmin, mysqladmin, mysqladmin, mysqladmin, mysqladmin, mysqladmin
  • mysqlbug
  • mysqld
  • mysqldump, mysqldump
  • mysqlimport, mysqlimport, mysqlimport
  • mysqlshow
  • N

  • Native functions, adding
  • Net etiquette, Net etiquette
  • NULL values vs. empty values
  • NULL values, and indexes
  • NULL values, and AUTO_INCREMENT columns
  • NULL values, and TIMESTAMP columns
  • O

  • ODBC
  • ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility
  • Optimization
  • Optimizations
  • Option files
  • Oracle compatibility, Oracle compatibility, Oracle compatibility
  • ORDER BY, aliases in
  • P

  • pack_isam
  • Password encryption, reversibility of
  • Passwords, setting, Passwords, setting, Passwords, setting, Passwords, setting
  • Payment information
  • Performance
  • PostgreSQL compatibility
  • Protocol mismatch
  • Q

  • Quoting
  • Quoting binary data
  • Quoting strings
  • R

  • RedHat Package Manager, RedHat Package Manager
  • References
  • Release numbers
  • replace
  • Replication
  • Replication, database, Replication, database
  • Reporting bugs
  • Reporting errors
  • Reserved words
  • Reserved words, exceptions
  • Row-level locking
  • RPM, RPM
  • Running configure after prior invocation
  • S

  • safe_mysqld
  • Scripts
  • Sequence emulation
  • Server functions
  • Size of tables
  • Solaris troubleshooting
  • Sorting, grant tables, Sorting, grant tables
  • sql_yacc.cc problems
  • Stability
  • Startup parameters
  • Storage requirements
  • String comparisons, case sensitivity
  • Strings
  • Strings, escaping characters
  • Strings, quoting
  • Support costs
  • Support terms
  • Support, types
  • Sybase compatibility
  • System table
  • T

  • Table aliases
  • Table cache
  • Table names, case sensitivity, Table names, case sensitivity
  • Table size
  • Table types
  • Table types, Choosing
  • Table, constant, Table, constant
  • Table, system
  • Tables, In memory
  • TEXT columns, default values
  • TEXT columns, indexing
  • The table is full, The table is full
  • TIMESTAMP, and NULL values
  • Timezone problems, Timezone problems, Timezone problems
  • TODO
  • Troubleshooting, FreeBSD
  • Troubleshooting, Solaris
  • Type conversions
  • Type portability
  • Types of support
  • Types, choosing
  • Types, Date and Time
  • U

  • Update log
  • user table, sorting
  • User-definable functions, adding
  • V

  • Version, choosing
  • Version, latest
  • Virtual memory problems while compiling
  • W

  • Which languages MySQL supports
  • Wildcards, and LIKE
  • Wildcards, in mysql.columns_priv table
  • Wildcards, in mysql.db table
  • Wildcards, in mysql.host table
  • Wildcards, in mysql.tables_priv table
  • Wildcards, in mysql.user table
  • Windows
  • Y

  • Year 2000 compliance
  • Year 2000 issues

  • This document was generated on 1 January 2000 using the texi2html translator version 1.52 (extended by davida@detron.se).

    Previous | Contents



With any suggestions or questions please feel free to contact us