of 91
8/14/2019 MySQL Technical Reference Manual.
1/91
MySQL Technical Reference Manual.
Introduction [p 5]
General Information about MySQL[p 6]
What is MySQL? [p 6]
History ofMySQL[p 6]
The main features in MySQL[p 6]
What is the current MySQL version? [p 7]
How do I get MySQL? [p 7]
Should I get MySQL in source or binary distribution? [p 8]
Which operating systems does MySQL support? [p 8]
What languages are supported by MySQL. [p 8]
How/when will you release updates? [p 9]
What is UNIREG ? [p 9]
General SQL information and tutorials [p 10]
What are stored procedurs and triggers and so on [p 10]
MySQL mailing lists and how to ask questions [p 11]
Subscribing to/un-subscribing from the MySQL mailing list. [p 11]
Asking questions or reporting bugs. [p 11]
Guidelines for answering questions on the mailing list. [p 12]
When do I have/want to pay for MySQL? [p 13]
How much does MySQL cost? [p 13]
How do I get comercial support [p 14]
Types of comercial support [p 14]
How do I pay for a license? [p 15]
Who do I contact when I want support/a license? [p 15]
What Copyright does MySQL use? [p 16]
When may I distribute MySQL commercially without a fee [p 16]
Im selling a product that can be configured to use MySQL[p 17]I am running a commercial web server using MySQL. [p 17]
Do I need a license to sell commercial perl/tcl/PHP etc applications? [p 17]
Possible future changes in the licensing. [p 18]
How standards compatible are MySQL[p 19]
What extension has MySQL to ANSI SQL92? [p 19]
What functionality is missing in MySQL. [p 20]
What standards does MySQL follow? [p 21]
What functions exist only for compatibility? [p 21]
Limitations of BLOB and TEXT types [p 21]
How to go cope without COMMIT-ROLLBACK [p 21]
Compiling and installing MySQL[p 24]Compiling MySQL[p 24]
Problems starting MySQL[p 24]
Automatic start/stop ofMySQL[p 25]
How to debug MySQL[p 25]
How does MySQL privileges work[p 26]
How does the privilege system work? [p 26]
1
8/14/2019 MySQL Technical Reference Manual.
2/91
Adding new user privileges to MySQL[p 28]
Default privileges. [p 28]
A example of permission setup. [p 29]
MySQL language reference [p 30]
Literals. How do you write strings and numbers? [p 30]
Column types. [p 31]
More about data types [p 33]
Database size info. [p 33]
The numeric types [p 33]
TIMESTAMP type [p 33]
TEXT and BLOB types [p 33]
ENUM type [p 34]
SET type [p 34]
Column indexes [p 35]
Multiple field indexes [p 35]
Type mapping (to ease moving tabel definitions between different databases engines)
[p 35]
CREATE TABLE syntax. [p 36]
ALTER TABLE syntax [p 37]
DROP TABLE syntax. [p 38]
DELETE syntax. [p 38]
SELECT syntax [p 39]
Functions [p 40]
INSERT syntax [p 45]
LOAD DATA INFILE syntax [p 45]
UPDATE syntax [p 47]
SHOW syntax. Get information about names of columns. [p 47]
EXPLAIN syntax. Get information about a SELECT. [p 47]
DESCRIBE syntax. Get information about columns. [p 48]
Lock tables syntax [p 48]SET OPTION syntax. [p 48]
GRANT syntax. (Compatibility function). [p 49]
CREATE INDEX syntax (Compatibility function). [p 49]
DROP INDEX syntax (Compatibility function). [p 49]
Is MySQL picky about reserved words? [p 49]
How safe/stable is MySQL[p 52]
How stable is MySQL? [p 52]
Why are there is so many release ofMySQL? Is it because there are so many bugs? [p 54]
Checking a table for errors. [p 54]
How to repair tables. [p 55]
Is there anything special to do when upgrading/downgrading MySQL? [p 56]How to get maximum performance out ofMySQL[p 57]
How does MySQL use memory ? [p 57]
How does MySQL use keys? [p 58]
How does MySQL open & close tables? [p 59]
How should I arrange my table to be as fast/small as possible? [p 59]
What affects the speed of the INSERT statement? [p 60]
2
8/14/2019 MySQL Technical Reference Manual.
3/91
What affects the speed of DELETE statement? [p 60]
What kind of optimisation is done on the WHERE clause? [p 60]
How can I change the buffer sizes ofmysqld ? [p 61]
What options to use to get MySQL to run at full speed? [p 62]
How to get MySQL to run as fast as possible with little memory? [p 62]
What are the different row formats? Or when to use VARCHAR/CHAR? [p 63]
Why so many open tables? [p 64]
MySQL Utilites [p 65]
Overview of the different MySQL programs [p 65]
The MySQL table check, optimize and repair program [p 66]
Getting low level table information [p 66]
The MySQL compressed read only table generator [p 70]
Adding functions to MySQL[p 75]
Adding new functions to MySQL[p 75]
ODBC [p 76]
Which operating systems does MySQL ODBC support? [p 76]
How should I report problems with MySQL ODBC? [p 76]
Programs known to work with MyODBC. [p 76]
How do I fill in the various fields in the ODBC administrator program? [p 76]Problems [p 78]
Why do I get Access denied? [p 78]
How to run MySQL as a normal user. [p 79]
Problems with file permissions [p 79]
Problems using DATE fields. [p 80]
MySQL client tools and APIs [p 81]
MySQL C API [p 81]
Why is it that after mysql_query() returns success, mysql_store_result()
sometimes returns NULL? [p 82]
What results can I get from a query? [p 83]
How can I get the unique ID for the last row? [p 83]What is the difference between mysql_use_result() and
mysql_store_result()modes? [p 83]
Problems linking with C API. [p 84]
How to make a threadsafe client [p 84]
Making a threadsafe client [p 84]
What is the difference between different thread packages? [p 85]
MySQL Perl APIs [p 85]
mysqlperl[p 85]
DBD::mysql[p 85]
MySQL JAVA connectivity (JDBC) [p 85]
MySQL C++ APIs [p 85]MySQL TCL APIs [p 85]
MySQL Python APIs [p 86]
MySQL Python APIs [p 86]
How does MySQL compare with other databases [p 87]
How does MySQL compare with mSQL [p 87]
How about mSQL tools like msql-tcl, msqljava? [p 88]
3
8/14/2019 MySQL Technical Reference Manual.
4/91
How different from mSQL are the MySQL client/server communications protocols? [p 88]
What are the differences in the SQL syntax between MySQL & mSQL 2.0? [p 89]
Problems with AND and OR priority [p 91]
This document was generated on 3 November 1997 using the texi2html translator version 1.51
(extended by [email protected]).
4
http://wwwcn.cern.ch/dci/texi2html/http://wwwcn.cern.ch/dci/texi2html/8/14/2019 MySQL Technical Reference Manual.
5/91
Go to the first, previous, next [p 6] , last [p 87] section, table of contents [p 1] .
Introduction
This is the technical manual about MySQL. This version is about the 3.21.x version ofMySQL.
This document contains the basic documenatation about MySQL.
The latest version of this manual can be found at http://www.tcx.se/
This manual is currently available in TeXInfo, Raw text, Info, Postscript and HTML versions.
The primary document is the TeXInfo file. The HTML version is automatically produced with
texi2html. The ASCII and info version is produced using makeinfo. The Postscript version is
produced using texi2dvi and divps.
If you have any suggestions concerning additions or corrections, please send them to the MySQL
mailing list [email protected] withthe following subject line; documentation suggestion:
[Insert Topic Here]. See section Subscribing to/un-subscribing from the MySQL mailing list.
[p 11] .
This manual is written and maintained by David Axmark, Michael (Monty) Widenius and Kim Aldale.
Go to the first, previous, next [p 6] , last [p 87] section, table of contents [p 1] .
5
http://www.tcx.se/http://www.tcx.se/8/14/2019 MySQL Technical Reference Manual.
6/91
Go to the first [p 5] , previous [p 5] , next [p 11] , last [p 87] section, table of contents [p 1] .
General Information about MySQL
What is MySQL?
MySQL is a SQL (Structured Query Language) database server. SQL is the most popular databaselanguage in the world. MySQL is a client server implementation that consists of a server daemon
mysqld and many different client programs/libraries.
The main goals of MySQL are speed and robustness.
The base upon which MySQL is built is a set of routines that have been used in a highly demanding
production environment for many years. While MySQL is currently still in development it already
offers a rich and highly useful function set.
See the CREDITS file in the distribution for persons that have been involved in the MySQL
project.
History of MySQL
We once started off with the intension to use mSQL to connect to our own fast low level (ISAM)
tables. However, after some testing we came to the conclusion that mSQL was not fast or flexible
enough for our needs. This resulted in a new SQL interface to our database but with almost the same
API interface as mSQL. This API was chosen to ease porting of third party code.
It is not perfectly clear where the name MySQL derives from. Our base directory and a large amount
of our libraries and tools have had the prefix my for well over 10 years. However, Montys daughter
(some years younger) is also named My. So which of the two gave its name to MySQL is still a
mystery, even for us.
The main features in MySQL
Multi-threaded.
C, C++, JAVA, Perl, Python and TCL APIs. See section MySQL client tools and APIs [p 81]
Lots of column types like: signed/unsigned integers 1,2,3,4,8 bytes long, FLOAT, CHAR,
VARCHAR, TEXT, BLOB, DATE, SET and ENUM types. See section Column types. [p 31]
Join optimiser with one-sweep multi-join (all joins made in one pass).
Full function support in the SELECT and WHERE parts. Example: select
column1+column2 from table where column1/column2 > 0
SQL functions are implemented through a very optimised class library and should be as fast asthey can get! Usually there shouldnt be any memory allocation at all after the query
initialisation.
Full support for SQL GROUP BY and ORDER BY. Support for group functions (SUM, MAX and
MIN).
A privilege and password system with is very flexible and secure. Allows host based verification.
All password traffic on the net is encrypted.
6
8/14/2019 MySQL Technical Reference Manual.
7/91
Very fast B-tree disk tables with key compression.
Fixed and variable length records.
16 indexes/table. Each index may consist of 1 to 15 columns/parts of columns. Max key length is
127 bytes. A key may be a prefix of a CHAR field.
ODBC Open-DataBase-Connectivity for Windows95 (with source). All ODBC 2.5 functions and
lots of others.
In memory hash tables always used as temporary tables.
Can handle big databases (we are using MySQL with some databases that contain 50,000,000
records).All columns have default values. One can always use INSERT on any subset of columns.
Uses GNU autoconf for portability.
Written in C and C++. Tested with gcc 2.7.2.
A thread based memory allocation system (very fast and no memory trashing).
No memory leaks. Tested with a commercial memory leakage detector (purify).
A very fast table check and repair utility (isamchk).
All data saved in ISO8859_1 format. All comparisons for normal string columns are case
insensitive.
Full ISO8859_1 (Latin1) support. For example Scandinavian is allowed in table and column
names.
Sorts by ISO8859_1 Latin1 (the Swedish way at the moment). It is possible to change this in thesource by adding new sort order arrays.
Alias on tables and columns as in the SQL92 standard. avg & count).
INSERT,UPDATE and DELETE returns how many rows were affected.
Function names do not clash with table or column names. For example ABS is a valid column
name. The only restriction is that space is not allowed between a function name and the ( when
using functions.
All MySQL commands have --help or -? for help.
The server currently supports error messages to clients in many languages. See section What
languages are supported by MySQL. [p 8] .
The clients uses a TCP connection or unix socket when connecting to the MySQL server.
User commands as show tables, show keys from table and show columns fromtable
What is the current MySQL version?
You can always checkhttp://www.tcx.se/for the latest version ofMySQL.
How do I get MySQL?
On the Internet, try using a web browser to http://www.tcx.se/
Or ftp to ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/. That isSunets (Swedish UniversityNetwork) FTP archive in Sweden.
7
http://www.tcx.se/http://www.tcx.se/ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/http://www.tcx.se/http://www.tcx.se/8/14/2019 MySQL Technical Reference Manual.
8/91
Should I get MySQL in source or binary distribution?
If you want to read (and/or modify) the C and C++ code that makes up MySQL you should always get
a source distribution. The code is always the ultimate manual. The source distribution also contains
more tests and examples than the binary distribution.
For most people who want to run MySQL on a platform that has binary releases, a binary version of
MySQL is more convenient. However, TcXs binary release is not compiled in the same way as the
source release so there are some differences in where support files are located.
Which operating systems does MySQL support?
We use GNU autoconf so it will be possible to port to all modern systems with working Posix threads
and a C++ compiler. The client code requires C++ but not threads. We use the software ourselves
primarily on Solaris (currently 2.5.1) and some on RedHat Linux 4.2 (kernel 2.0.30).
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 Linux
Threads by Xavier Leroy @email{[email protected]}.
A good web page about different thread implementations is http://www.humanfactor.com/pthreads/.
The MySQL distribution includes a patched version of Provenzanos Pthreads from MIT (see
http://www.mit.edu:8001/people/proven/pthreads.html) in thedistribution. This can be used for some
operating systems that does not have posix threads.
We have also tried to use another user level thread package named FSU Pthreads (see
http://www.informatik.hu-berlin.de/~mueller/pthreads.html). Thisimplementation is being used for the
SCO port.
See the thr_lock and thr_alarm programs in the mysys directory for some tests/examples of these
problems. More information can be found in the PORTING file in the distribution.
What languages are supported by MySQL.
mysqld can give error messages in the following languages: Czech, Dutch, English (default), French,
German, Norwegian, New Norwegian, Polish, Portuguese, Spanish and Swedish.
To start mysqld with a language use the --language=lang or -L lang switch:
mysqld --language swedishmysqld --language /usr/local/share/swedish
The language files are located (by default) in
mysql_base_dir/share/LANGUAGE/
8
http://www.humanfactor.com/pthreads/http://www.mit.edu:8001/people/proven/pthreads.htmlhttp://www.informatik.hu-berlin.de/~mueller/pthreads.htmlhttp://www.informatik.hu-berlin.de/~mueller/pthreads.htmlhttp://www.mit.edu:8001/people/proven/pthreads.htmlhttp://www.humanfactor.com/pthreads/8/14/2019 MySQL Technical Reference Manual.
9/91
How/when will you release updates?
We are going to use the following policy when updating MySQL:
Each minor patch will increment the last number in the version string. When there are new features or
minor incompatibilities with previous versions, the second number in the version string will be
incremented.
On the rare occasions when a fatal bug is found that cant be avoided we will make new binaryreleases for Solaris & Linux as soon as possible. Other people may make binary releases for other
systems but probably less frequently.
For other fatal bugs we will make patches available as soon as we have located and fixed the bug.
For non crucial but annoying bugs we will make patches available if they are sent to me,
otherwise we will combine many of them into a bigger patch.
When there are more then about 10 patches we will make a new full source release.
When we have made a lot of changes we will make a new source and binary release. (About once
a month?)
What is UNIREG ?
Unireg is our tty interface builder, but it uses a low level connection to our NISAM (with 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 1 scrolling region)
Table creator. (With lots of column tags you cant 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 translate.
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. Changes .frm and text files between different character sets.
The pack_isam utility. Packs a NISAM table (makes it 50-80% smaller). The table can be read by
MySQL like an ordinary table. Only 1 record has to be decompressed / access. Cannot handle
BLOB:s 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: SUN OS 4.x,
Solaris, Linux, HPUX, ICL Unix, DNIX, SCO and MSDOS.
9
8/14/2019 MySQL Technical Reference Manual.
10/91
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.
General SQL information and tutorialsThere is one SQL tutor on the net ata http://w3.one.net/~jhoffman/sqltut.htm
This one has been recommended by a lot of people on the MySQL mailing list.
Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky
"The Practical SQL Handbook: Using Structured Query Language"
Second Edition
Addison Wesley
ISBN 0-201-62623-3
http://www.awl.com
And another book also recommended by people on the MySQL mailing list.
Understanding SQL
ISBN 0-89588-644-8
Publisher Sybex 510 523 8233
Alameda CA USA
What are stored procedurs and triggers and so on
A stored procedure is a couple of SQL commands that can be stored and compiled in the server. After
this the client doesnt have to issue the hole query but can refer to the stored procedure. This gives
some more speed because the query only have to be parsed once and there is less data that has to be
sent between the server and the client. You can also raise the conceptual level by having libraies offunctions in the server.
A trigger is a stored procedure that is invoked when something happens. For example one can install a
stored procedure that checks every delete to a transaction table and does a automatic delete on the
corresponding customer when all his transactions are deleted.
Go to the first [p 5] , previous [p 5] , next [p 11] , last [p 87] section, table of contents [p 1] .
10
http://w3.one.net/~jhoffman/sqltut.htmhttp://w3.one.net/~jhoffman/sqltut.htm8/14/2019 MySQL Technical Reference Manual.
11/91
Go to the first [p 5] , previous [p 6] , next [p 13] , last [p 87] section, table of contents [p 1] .
MySQL mailing lists and how to ask questions
Subscribing to/un-subscribing from the MySQL mailing list.
Requests to be added or dropped from the MySQL list should be sent to the electronic mail [email protected]. Sending a one linemessage saying either subscribe mysql or un-subscribe
mysql will suffice. If your reply address is not valid you may use subscribe mysql
[email protected] un-subscribe mysql
Please do notsend mail about [un]subscribing to [email protected] since any mail sent to this address
isautomatically forwarded to hundreds of other users.
Your local site may have many subscribers to MySQL. In that case, it may have a local mailing list,
so that a single message from tcx.se is sent to the site and propagated to the local list. In such cases,
please contact your system administrator to be added to or dropped from the local MySQL list.
Mail to mdomo is handled automatically by majordomo.
Asking questions or reporting bugs.
Before you ask a question on the mailing list it is a good idea to check in the manual. If you cant find
an answer in the manual, check with your local MySQL expert. If you do not have any luck there,
read through this manual. If you still cant find an answer to your question go ahead and send mail to
I think I have found a bug. What information do you need to help me?
If you can, please use the mysqlbug script that can be found in the scripts directory in the
distribution. If that is not possible, remember to specify (if relevant) the following:
1. State which version ofMySQL you are using (for example mysql-3.20.0.tgz). You can find out
which version you are running by typing mysqladmin version.
2. The manufacturer and model of machine you are working on.
3. The operating system. For most operating systems you can get this from uname -a.
4. Sometimes the amount of memory (real and virtual) is also relevant.
5. If this is a bug when compiling: Include the exact error messages and also a few lines around the
offending code in the file from which you got the error.
6. If this is a run time bug, please describe exactly how you got the error. If you can include a test
program which shows the error you can get a more explicit answer.
If you are a support customer, please post the bug report to the specified mailing list for higher priority
treatment.
11
8/14/2019 MySQL Technical Reference Manual.
12/91
When answers are sent to you individually and not to the mailing list, it is considered good etiquette to
summarise the answers and mail them to the mailing list.
Guidelines for answering questions on the mailing list.
Try to make your answer broad enough that people other than the original poster may benefit from it.
If you consider your answer to have broad interest, you may want to post it to the mailing list instead
of replying directly to the individual who asked. In such cases, please make sure that your answer is
not a duplication of a previous answer.
Try to summarise the essential part of the question in your reply, but dont feel obliged to quote the
whole question.
Go to the first [p 5] , previous [p 6] , next [p 13] , last [p 87] section, table of contents [p 1] .
12
8/14/2019 MySQL Technical Reference Manual.
13/91
Go to the first [p 5] , previous [p 11] , next [p 19] , last [p 87] section, table of contents [p 1] .
When do I have/want to pay for MySQL?
Basic licensing issues:
The easiest way to pay for MySQL is to use the license form at TcXs secure server at
@url{https://www.tcx.se/license.htmy}We hope everybody understands that you only have to pay if you are selling MySQL directly or
selling a product which includes the MySQL server. You may not include MySQL in a
distribution if you charge for some part of it. For internal use you do not have to pay us if you do
not want to.
The client code is in the Public Domain or under the GPL (read-line). So there should not be any
problems with client code in commercial programs.
We may add some additional functionality in the commercial version. The likely test candidate
for this is fast compressed read only databases. The current server includes support to read such
databases but not the packing tool. If we get enough revenue from support we will probably
release this under the same license as the other stuff.
But if you like MySQL and want to encourage further development you are welcome to purchasea license or support.
For more information see the rest of this chapter and the file PUBLIC in the distribution.
How much does MySQL cost?
For normal use MySQL costs nothing. When you sell MySQL directly or as a part of another product
you have to pay for it. See the file PUBLIC in the distribution.
The client access part ofMySQL is in the public domain. The command line client includes parts that
is under the GNU Public License (readline).
These are our current license prices. All prices in US Dollars. If you pay by credit card the currency is
FIM (Finish Marks) so the prices will differ slightly.
Number of licenses Price/Copy Total
1 US $200 US $200
10 pack US $150 US $1500
50 pack US $120 US $6000
For high volume (OEM) purchases the following apply:
13
8/14/2019 MySQL Technical Reference Manual.
14/91
licenses Price/Copy Minimum at one time Minimum Payment
100-1000 $40 100 $4000
1000-2500 $25 200 $5000
2500-5000 $20 400 $8000
The OEM prices require that you act as a middle-man for eventual problems/extension requests from
users. We also require that the OEM customer has a support contract. If you have a low margin highvolume product you can always talk to us about other terms. If you do, please be informative about
your product, pricing, market and any other information that may be relevant.
How do I get comercial support
A full price license includes really basic support. This means that we are trying to answer any relevant
question. If the answer is in the documentation, we are going to direct you to the relevant
documentation. If you do not have a license/support we will probably not answer at all.
If you discover what we consider a real bug, we are likely to fix it in any case. But if you pay for
support we will notify you about the fix status instead of just fixing it in a later release.
More comprehensive support is sold separately:
Types of comercial support
basic email support
One year of basic email support costs $200. And includes
1. For MySQL specific questions that doesnt belong to the mysql mailing list
(@email{[email protected]}) you can contact [email protected]. Remember to give your
registration numberand expiration date when mailing any list to ensure a quick responce.
2. We guaranty a timely answer for your mails. We cant garanty that we can solve any
problem, but at least you will receive an answer if we can contact you by email.
3. Your suggestions for the further development of MySQL will be taken into consideration.
By taking email support you have already helped the further devolpment of MySQL. If you
want to have more input upgrade to extended support.
4. You are entitled to upgrade to extended email support for the difference between the
different support prices. If you have extend email support you are allowed sligtly alter the
MySQL TODO, your email will be even more prioritized and if you have a very specific
problem we can try to log in on your system and try to solve it in place.
extented email support
One year of extented email support costs $1000.
1. For MySQL specific questions that doesnt belong to the mysql mailing list
(@email{[email protected]}) you can contact [email protected]. Remember to give yourregistration numberand expiration date when mailing any list to ensure a quick responce.
2. We guaranty a timely answer for your mails. We cant garanty that we can solve every
problem, but at least you will receive an answer if we can contact you by email.
3. Your suggestions for the further development of MySQL will be taken into consideration.
By taking extended email support you have already helped the further devolpment of
MySQL.
14
8/14/2019 MySQL Technical Reference Manual.
15/91
4. You are allowed to alter the MySQL TODO.
5. Your email will be dealt with before normal email support users and non registred users.
6. If you have a very specific problem we can try to log in on your system and try to solve it
in place.
login support
One year of email/phone/telnet support costs $2000. In this we include support for fast
compressed read only databases (no blobs yet). The current server includes support to read such
databases but not the packing tool. If we get enough revenue from support we will probably
release this under the same license as the server sometime in the future...extented login supprt
One year of extented email/phone/telnet support costs $5000. This of course also includes the
compressed read only database support.
General terms for all types of support:
How do I pay for a license?
Well currently we can take SWIFT payments, cheques or credit cards.
Payment should be made to:
Postgirot Bank AB
105 06 STOCKHOLM, SWEDEN
T.C.X DATAKONSULT AB
BOX 6434
11382 STOCKHOLM
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 you can use EuroGiro (that should be cheaper) 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.
Monty Program KB
Michael Widenius
Gamla Skomakarbolev. 1 E 11
00740 Helsingfors
Finland
If you want to pay with credit card over Internet you can use https://www.tcx.se/license.htmy
Who do I contact when I want support/a license?For commercial licensing or if you have any questions about any of the information in this document,
please contact:
15
https://www.tcx.se/license.htmyhttps://www.tcx.se/license.htmy8/14/2019 MySQL Technical Reference Manual.
16/91
Detron HB
David Axmark
Kungsgatan 65 B
753 21 UPPSALA
SWEDEN
Voice Phone +46-18-10 22 80
Fax +46-8-729 69 05 (I prefer email if possible as the fax machine happens to be in another town.)
E-Mail: [email protected]
What Copyright does MySQL use?
There are four different copyrights on the MySQL distribution.
1. The MySQL specific source needed to make the mysqlclient library and programs in the
client directory is in the public domain. Each file which is in the public domain has a
header which clearly states so. This is everything in client directory and some parts of
mysys, mystring and dbug libraries.
2. Some small parts of the source (GNU getopt) are covered by the "GNU LIBRARY GENERAL
PUBLIC LICENSE". See the mysys/COPYING.LIB file.
3. Some parts of the source (GNU readline) are covered by the "GNU GENERAL PUBLIC
LICENSE". See the readline/COPYING file.
4. Some parts of the source (the regexp library) are covered by a Berkeley style copyright.
5. The other source needed for the MySQL server is AGPL. See the file PUBLIC for more info.
Our philosophy behind this is:
The SQL client library should be totally free so it can be included in commercial products
without limitations.
People who want free access to the software we have put a lot of work into can have it so long
they do not try to make money directly by distributing it for profit.
People who want the right to keep their own software proprietary, but also want the value from
our work, can pay for the privilege.
That means that normal in house use is FREE. But if you use it for something important to you,
you may want to support further development ofMySQL by purchasing a support license.
When may I distribute MySQL commercially without a fee
This is a clarification of the information in the PUBLIC file.
MySQL may be *used* freely, including by commercial entities for evaluation or unsupported internal
use. However, *distribution* for commercial purposes ofMySQL, or anything containing or derived
from MySQL in whole or in part, requires a written commercial license from TcX AB, the sole entity
authorised by to grant such licenses.
You may not include MySQL "free" in a package containing anything for which a charge is being
made except as noted below.
The intent of the exception provided in the second clause is to allow commercial organisations
operating an FTP server or a bulletin board to distribute MySQL freely from it, provided that:
16
8/14/2019 MySQL Technical Reference Manual.
17/91
1. The organisation complies with the other provisions of the FPL, which include among other
things a requirement to distribute the full source code ofMySQL and of any derived work, and to
distribute the FPL itself along with MySQL;
2. the only charge for downloading MySQL is a charge based on the distribution service and not
one based on the content of the information being retrieved (i.e., the charge would be the same
for retrieving a random collection of bits of the same size);
3. the server or BBS is accessible to the general public, i.e., the phone number or IP address is not
kept secret, and anyone may obtain access to the information (possibly by paying a subscription
or access fee that is not dependent on or related to purchasing anything else).
If you want to distribute software in a commercial context that incorporates MySQL and you do *not*
want to meet these conditions, you should contact TcX AB to find out about commercial licensing.
Commercial licenses involve a payment, and include support and other benefits. These are the only
ways you legally can distribute MySQL or anything containing MySQL: either by distributing
MySQL under the requirements of the FPL, or by getting a commercial license from TcX AB.
Im selling a product that can be configured to use MySQL
Im selling a product that can be configured to use MySQL although my customer is responsible for
obtaining/installing MySQL (or some other supported alternative). Does one of us owe you money ifmy customer chooses to use MySQL?
If your product REQUIRED MySQL to work you would have to pay a license. IfMySQL just added
some new features it should fall inside normal use. For example is using MySQL added logging to a
database instead of a text file it should not require a license. This would of course mean that the user
has to fetch and install MySQL by himself. If the program is (almost) useless without MySQL you
would have to get a MySQL license to sell your product.
I am running a commercial web server using MySQL.
Do I have to get a license for my copy?
No you are not selling MySQL itself. But is this case we would like you to purchase MySQL support.
That is either your support ofMySQL or our support of you (the later is more expensive since our
time is limited).
Do I need a license to sell commercial perl/tcl/PHP etc
applications?
Is your script designed for MySQL alone? Does it require MySQL to function at all? Or is it designed
for a database and can run under MySQL, PostgreSQL, or something else?
If youve designed it strictly around MySQL then youve really made a commercial product that
requires the engine, so yes, I would think you have to pay.
If, however, you can support any database with a base level of functionality (and you dont rely on
anything that only MySQL supports) you probably DO NOT have to pay.
17
8/14/2019 MySQL Technical Reference Manual.
18/91
8/14/2019 MySQL Technical Reference Manual.
19/91
Go to the first [p 5] , previous [p 13] , next [p 24] , last [p 87] section, table of contents [p 1] .
How standards compatible are MySQL
What extension has MySQL to ANSI SQL92?
The following are useful extensions in MySQL that you probably will not find in other SQL:s. Bewarned that if you use this your code will not be portable to other SQL servers.
The field types MEDIUMINT, SET, EMUN???? and the different BLOB and TEXT types.
The field attributes auto_increment, unsigned and zerofill.
MySQL maps all tables to filenames and with MySQL one can use standard system tools to
backup, rename, move, delete and copy tables. This forces MySQL to be case sensitive on table
names on operating systems that have case sensitive filenames (like most Unix systems). If you
have a problem remembering table names, create everything in lowercase.
Use ofINTO OUTFILE and STRAIGHT_JOIN in a SELECT statement. See section SELECT
syntax [p 39] .
EXPLAIN SELECT to get a description on how tables are joined.
Use of key names, keys on a subpart of a field, and use ofKEY or INDEX in a CREATE TABLE
statement. See section CREATE TABLE syntax. [p 36]
Use ofDROP column or CHANGE column in a ALTER TABLE statement. See section
ALTER TABLE syntax [p 37] .
Use ofLOAD DATA INFILE. This syntax is in many cases compatible with Oracles LOAD
DATA INFILE. See section LOAD DATA INFILE syntax [p 45] .
Using " instead of to enclose strings.
Using the escape \ character.
The SET OPTION statement. See section SET OPTION syntax. [p 48]
Using, in the SELECT part of a GROUP BY statement, fields or functions that do not appear in
the GROUP BY list. In MySQL this means any matching value. By using this one can get a
much higher performance by avoiding sorting and grouping unnecessary items. This is often used
in this context:
SELECT order.customerid,customer.name,max(payments) from order,customer
WHERE order.customerid = customer.customerid GROUP BY order.customerid;
In ANSI SQL you would have to add the customer.name in the GROUP BY clause which is
redundant in MySQL.
To make it easier for user that comes from different SQL environments mysql supports a lot of
aliases for many functions. For example all string functions support both the ANSI SQL and the
ODBC syntax.
The || and && operators is in MySQL synonyms for OR and AND, like in the C programming
language. Likewise | and & stands for bitwise OR and AND. Because if this nice syntax, MySQLdoesnt support the ANSI SQL operator || for string concatenation, but one have to use
CONCAT() instead. As CONCAT() takes any number of arguments its easy to convert use of
the || operatior to MySQL.
Use of any of the following functions:
=, , , AND, OR, or LIKE in a column statement
LAST_INSERT_ID. See section How can I get the unique ID for the last row? [p 83]
19
8/14/2019 MySQL Technical Reference Manual.
20/91
REGEXP or NOT REGEXP.
CONCAT() or CHAR() with 1 or more than 2 arguments. In MySQL the above functions
can take any number of arguments.
BIT_COUNT(), ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(),
ENCRYPT(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), or WEEKDAY().
Use ofTRIM to trim substrings. ANSI SQL only supports removal of single characters.
The STD(), BIT_OR and BIT_AND group functions.
Use ofMIN() or MAX() as functions, not group functions.
What functionality is missing in MySQL.
The following functionality is missing in the current version ofMySQL. For the priority of new
extensions you should consult: http://www.tcx.se/TODO
Sub-SELECT. The following will not work in MySQL:
SELECT * from table WHERE id IN (SELECT id from table2)
MySQL only supports INSERT ... SELECT.... Independent sub-SELECTs will be
availably in 3.22.0. One can use the function IN() in other context thought.
MySQL doesnt yet support sqlSELECT ... INTO TABLE..... Currentlyl MySQL onlysupports SELECT ... INTO OUTFILE....
Outer joins. LEFT OUTER JOIN will be availabe in 3.22.0.
Transactions is not supported. MySQL will shortly support atomic operations which is like
transactions without rollback. With atomic operations you can make a bunch of
insert/select/whatever commands and be guaranteed that no other thread will interfere. In this
context you wont usually need rollback. Currently you can do this with the help of the LOCK
TABLES/UNLOCK TABLES command. See section Lock tables syntax [p 48]
Triggers is not supported. The planed update language will be able to handle stored procedures,
but without triggers. Triggers usually slow down everything, even for queries when they arent
needed.
The FOREIGN KEY syntax in MySQL exists only for compatibility with other SQL vendorsCREATE TABLE commands: It doesnt do anything. The FOREIGN KEY syntax without ON
DELETE .. is mostly used for documentation purposes. Some ODBC applications may uses
this to produce automatic WHERE clauses thought, but this is usually easy to override. FOREIGN
KEY is sometimes used as a constraint check, but this check is in practice unnecessary if one
insert rows in the tables in the right order. In MySQL one can go around the problem that ON
DELETE ... isnt implement by adding the approative DELETE statement to the application
when one deletes record from a table that has FOREIGN KEY. In practice this is as quick (in
some case quicker) and much more portable than using FOREING KEY Foreign keys is
something that makes life very complicated, because the foreign key definition must be stored in
some database and then the hole nice approach by using only files that can be moved, copied
and removed will be destroyed. In the near future we will extend FOREIGN KEYS so that the at
least the information will be saved and may be retrieved by mysqldump and ODBC.
MySQL doesnt support views, but this is on the TODO.
Some other SQL has -- as start comment. MySQL has # as the start comment character, even if
the MySQL command line tool removes all lines that starts with --. MySQL will not support this
degenerated comment style because we have had many problems with automatic generated SQL
queries that has used something like the following code:
20
http://www.tcx.se/TODOhttp://www.tcx.se/TODO8/14/2019 MySQL Technical Reference Manual.
21/91
UPDATE table_name SET credit=credit-!payment!
Where instead of !payment! we automaticly insert the value of the payment. What do you think
will happen when payment is negative ? Because 1--1 is legal in SQL, we think is terrible that
-- means start comment. If you have a sql program in a textfile that contains -- comments you
should use
replace " --" " #" < text-file-with-funny-comments.sql | mysql database.
instead of the normal
mysql database < text-file-with-funny-comments.sql
You can also change the -- to # comments in the command file with:
replace " --" " #" -- text-file-with-funny-comments.sql
and change them back with:
replace " #" " --" -- text-file-with-funny-comments.sql
What standards does MySQL follow?
Entry level SQL92. ODBC level 0-2.
What functions exist only for compatibility?
GRANT. See section GRANT syntax. (Compatibility function). [p 49] This always succeeds. You
should use the MySQL privilege tables. See section How does the privilege system work? [p 26]
CREATE INDEX. See section CREATE INDEX syntax (Compatibility function). [p 49] This
always succeeds. You should create your index with CREATE TABLE. See section CREATE
TABLE syntax. [p 36] You can also use ALTER TABLE. See section ALTER TABLE syntax [p
37] .
DROP INDEX. See section DROP INDEX syntax (Compatibility function). [p 49] This alwayssucceeds. You can use ALTER TABLE to drop indexes. See section ALTER TABLE syntax [p
37] .
Limitations of BLOB and TEXT types
If you want to GROUP BY or a ORDER BY on a BLOB or TEXT field, you must make the field into a
fixed length object. The standard way to do this is with the SUBSTRING functions. If you dont do
this only the first max_sort_length (default=1024) will considered when sorting.
SELECT comment from table order by substring(comment,20);
How to go cope without COMMIT-ROLLBACK
MySQL doesnt support COMMIT-ROLLBACK. The problem with COMMIT-ROLLBACK is that
for it to handle this efficiently it would require a completely different table layout than MySQL uses
today. MySQL would also need extra threads that does automatic cleanups on the tables and the disk
usage space needed would be much higher. This would make MySQL about 2-4 times slower than it
is today. One of the reasons that MySQL is so much faster than almost all other SQL databases
21
8/14/2019 MySQL Technical Reference Manual.
22/91
(typical times are at least 2-3 times faster) is the lack of COMMIT-ROLLBACK.
For the moment, we are much more for implementing the SQL server language (stored procedures).
With this you very seldom really need COMMIT-ROLLBACK besides being able to do many more
things without losing any speed.
Loops that need transactions can normally be coded with the help ofLOCK TABLES and one doesnt
need cursors when one can update records on the fly.
We have transactions and cursors on the TODO but not quite prioritised. If it is implemented it will beas a option to CREATE TABLE. That means that COMMIT-ROLLBACK will only work on those
tables and only those tables will be slower.
We at TcX have a greater need for a real fast database than a 100% general database. Whenever we
find a way to implement these without any speed loss we will probably do it, but for the moment there
is many more important things to do. Check the TODO for how we prioritise things at the moment.
Customers with extended mail support can alter this slightly, so things may be reprioritised.
The current problem is actually ROLLBACK. Without ROLLBACK you can do anything with LOCK
TABLES. To support ROLLBACKMySQL would had to be changed to store all old records that was
updated and revert everything back to the starting point ifROLLBACK was issued. For simple cases
this isnt that hard to do (the current isamlog could be used for this), but if one wants to have
ROLLBACKwith ALTER/DROP/CREATE TABLE it would make everything much harder to
implement.
To avoid using ROLLBACK one can do:
LOCK TABLES ...
- Test conditions.
- Update if everything is ok.
UNLOCK TABLES.
This is usually much faster, but not always. The only thing this doesnt handle if someone does a killon the process...
One can also use functions to update things in one operation. By doing all updates relatively and/or
only update those fields that actually have changed one can get a very efficient application.
For example, when we are doing updates on some customer information, we only update the customer
data that has changed and only test that not any of the changed data, or data that depends on the
changed data, has changed in the original row. The test for change is down with the WHERE clause in
the UPDATE statement. If the record wasnt updated we give the client a message: "Some of the data
you have changed has been changed by another user", and then we show the old row versus the new
row in a window. The user can then decide which version of the customer record he should use.
This gives us something like column locking but actually even better, because we only update some
of the columns with relative information. This means that a typical update statement looks something
like:
22
8/14/2019 MySQL Technical Reference Manual.
23/91
8/14/2019 MySQL Technical Reference Manual.
24/91
Go to the first [p 5] , previous [p 19] , next [p 26] , last [p 87] section, table of contents [p 1] .
Compiling and installing MySQL
Compiling MySQL
See the file INSTALL-SOURCE in the MySQL distribution.
Problems starting MySQL
Check the log file to see if mysqld started up correctly.
cd
tail .log
To verify that MySQL is working run the following tests:
> cd /usr/local/bin
> ./mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
+-----------+
> ./mysqlshow mysql
Database: mysql
+--------+
| Tables |
+--------+
| db |
| host |
| user |
+--------+
> ./mysql -e "select host,db,user from db" mysql
+------+--------+------+
| host | db | user |
+------+--------+------+
| % | test | |
| % | test_% | |
+------+--------+------+
There is also a benchmark suite so you can compare how MySQL perform on different platforms. In
the near future this will also be used to comapre MySQL to other SQL databases.
> cd bench> run-auto-increment-test
You can also run the tests in the test subdirectory. To run auto_increment.tst:
./mysql -vf test < ./tests/auto_increment.tst
24
8/14/2019 MySQL Technical Reference Manual.
25/91
Expected results are shown in the file ./tests/auto_increment.res.
Automatic start/stop of MySQL
To start or stop MySQL use the following commands:
scripts/mysql.server stop
scripts/mysql.server start
You might want to add these start and stop commands in the appropriate places in your /etc/rc* files
when you start using MySQL for production applications.
How to debug MySQL
If you are porting MySQL to an new system you should first try to get mysys/thr_lock and
mysys/thr_alarm to work. They shouldnt core dump and not print any error (they also print a lot of
other information). Also see the file PORTING in the distribution.
By starting bin/safe_mysqld with --log you will get a log in
install-directory/var/hostname.log(the top level database directory). This log will
contain all successful connections and all commands issued to the MySQL server.
If you have compiled MySQL with --with-debug=yes you can can also get a very informative log
with:
libexec/mysqld --debug
which makes a large log in /tmp/mysql.trace. The default debug option is
d:i:t:o,/tmp/mysql.trace.
You can get a smaller log with:
libexec/mysqld --debug=d,info,query,general:o,/tmp/mysql.trace
or an even smaller (on stdout):
libexec/mysqld --debug=d,general,query
You can get more information about the debug switches by examining the file dbug/dbug.c.
If you have a problem with mysqld that it crashes and you want this quickly solved, you should
include a trace file with your mail if possible. Trace files can be posted directly to
@email{[email protected]} to avoid long messages to the standard mail list. If the trace file is big
you should use ftp and send it to ftp://www.tcx.se/pub/mysql/secret/ together with a
mysqldump of any tables that you think can help to solve the problem. The context of the above
directory is hidden for outside users so no one except the TCX staff can look at what you send into it.
Go to the first [p 5] , previous [p 19] , next [p 26] , last [p 87] section, table of contents [p 1] .
25
8/14/2019 MySQL Technical Reference Manual.
26/91
Go to the first [p 5] , previous [p 24] , next [p 30] , last [p 87] section, table of contents [p 1] .
How does MySQL privileges work
MySQL has a advanded but non standard security/privileges system.
How does the privilege system work?The MySQL privilege system makes sure that each user may do exactly the things that they are
supposed to be allowed to do. The system decides to grant different privileges depending on which
user connects from which host to which database. The decision is based on the contents of the three
tables in the MySQL database: user, host and db.
The grant tables privileges on rows are select, insert, update and delete.
The table and database privileges are create and drop. Create and drop are for both tables and
databases. Since a user with a drop grant can delete any table, this is the same thing as a drop grant for
the database.
Other privileges give the right to use files (for LOAD DATA INFILE and SELECT INTO OUTFILE)
and to use the administrative commands shutdown, reload, refresh and process, to get the current
process list.
The privilege tables are read into mysqld with mysqladmin reload. If the privilege tables are
empty or non-existent or if the server is started with --skip-grant-tables, full access is
granted to everyone.
You can always test your privileges with the script mysqlaccess, which Yves Carlier has provided
for the MySQL distribution. See section Why do I get Access denied? [p 78]
The hostand db fields may contain a SQL regexp with chars % and_. Leaving any of these fieldsempty is equivalent to setting it to %.
A hostmay be localhost, a hostname, an IP number or an SQL expression. An empty host in
the db table means any host in the host table. An empty host in the host or user table means any
host that can create a TCP connection to your server.
A db is the name of a database or an SQL regexp.
An empty userfield means any username will do.
An empty password means that the entry will only be used if no password is supplied.
The privileges from the user table are ORed to the db table. This means that a superuser only
needs to be in the user table with all privilege-flags set to Y.
Everything granted in the user table is valid for every database that cannot be found in the db table.
For this reason, it might be wise to grant users (apart from superusers) privileges on a per-databasebasis only.
The host table is mainly there to maintain a list of "secure" servers. At TcX host contains a list of
all machines on the local network. These are granted all privileges.
26
8/14/2019 MySQL Technical Reference Manual.
27/91
The connecting users privileges are calculated by the following algorithm:
1. First sort all three tables by host by putting hosts without wildcards first, followed by hosts with
wildcards and entries with host = "". Within each host, di.e. very much like GROUP BY
Host, sort by user using the same rules. Finally, in the db table, sort by db using the same rules.
In the steps below, we will look through the sorted tables and always use the first match found.
2. Get the privileges for the connecting user from the db table using the first match found. Call this
set of privileges P.
3. Ifhost = "" for the entry found in the db table, AND P with the privileges for the host in thehost table, i.e. remove all privileges that are not "Y" in both. (Ifhost "", P is not
affected. In suchcases, host must have matched the connecting hosts name at least partially.
Therefor it can be assumed that the privileges found in this row match the connecting hosts
profile.)
4. OR (add) P with the privileges for the user from the user table, i.e. add all privileges that are
"Y" in user.
The connecting user gets the set of privileges P.
Lets show an example of the sorting and matching! Suppose that the user table contains this:
+-----------+----------+-
| Host | User | ...
+-----------+----------+-
| % | root | ...
| % | jeffrey | ...
| localhost | root | ...
| localhost | | ...
+-----------+----------+-
Then the search order will be:
localhost/root
localhost/any
any/jeffreyany/root
So jeffrey attempting to connect on localhost will be matched by the localhost/any line, not by
the any/jeffrey line. The first match found is used!
So if you have access problems, print out the user table, sort it by hand, and see where the match is
being made.
Here follows an example to add a user custom that can connect from hosts localhost,
server.domain and whitehouse.gov. He wants to have password stupid. The database
bankacount he only want to use from localhost and the customer database he wants to be able to
reach from all three hosts.shell> mysql mysql.
mysql> insert into users (host,user,password)
values(localhost,custom,password(stupid));
mysql> insert into users (host,user,password)
values(server.domain,custom,password(stupid));
mysql> insert into users (host,user,password)
values(whitehouse.gov,custom,password(stupid));
27
8/14/2019 MySQL Technical Reference Manual.
28/91
mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
(localhost,bankacount,custom,Y,Y,Y,Y,Y,Y);
mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
(%,customers,custom,Y,Y,Y,Y,Y,Y);
You can of course also use xmysqladmin, mysql_webadmin, mysqladmin and even xmysql to
insert/change and update values in the privilege tables. You can find these utilities in the Contrib
directory.
Adding new user privileges to MySQL
To add privileges to the MySQL database:
This assumes the current user has insert privileges for the mysql db table and reload privileges. The
server (mysqld) has to be running. If it is not, start it with safe_mysqld --log &.
> mysql mysql
insert into user values (%,monty,password(something),Y,Y,Y,Y,Y,Y,Y,Y,Y,Y) ;
insert into user (host,user,password) values(localhost,dummy,") ;
insert into user values (%,admin,",N,N,N,N,N,N,Y,N,Y,Y) ;
quit
> mysqladmin reload
This makes three new users:
Monty
Full superuser, but must use password when using MySQL.
admin
Doesnt need a password but is only allowed to use mysqladmin reload, mysqladmin
refresh and mysqladmin processlist. May be granted individual database privilegesthrough table db.
dummy
Must be granted individual database privileges through table db.
Default privileges.
The default privileges (set in scripts/mysql_install_db) is that root can do anything. Any
user can do anything with any database whose name is test or starts with test_. A normal user cant
use mysqladmin shutdown or mysqladmin processlist. See the script
(scripts/mysql_install_db) for an example on how to add other users.
The privilege tables are read into mysqld with mysqladmin reload. If the privilege tables are empty
(or non-existent) full access are granted to everyone.
28
8/14/2019 MySQL Technical Reference Manual.
29/91
A example of permission setup.
A common mistake is to try something like:
INSERT INTO user VALUES
(%,jeffrey,bLa81m0,Y,Y,Y,N,N,N,N,N, N,N);
Then (of course) a mysqladmin reload to make the authentication change take effect, then trying
to connect to the server:
$ ./mysql -h sqlserver -u jeffrey -p bLa81m0 test Access denied
Try this instead:
INSERT INTO user VALUES(%,jeffrey,password(bLa81m0),Y,Y,Y,N,N,N,N,N,N,N);
And like before mysqladmin reload to make the authentication change take effect.
Now things should work.
Go to the first [p 5] , previous [p 24] , next [p 30] , last [p 87] section, table of contents [p 1] .
29
8/14/2019 MySQL Technical Reference Manual.
30/91
Go to the first [p 5] , previous [p 26] , next [p 52] , last [p 87] section, table of contents [p 1] .
MySQL language reference
Literals. How do you write strings and numbers?
STRINGS
A string may have or " around it.
\ is a escape character. The following escape characters are recognised:
\0 A ascii 0 character.
\n A newline character.
\t A tab character.
\r A return character.
\b A backspace character.
\ A character.
\" A " character.\\ A \ character.
\% A % character. This is used in wild-card strings to search after %.
\_ A_ character. This is used in wild-card strings to search after_.
A inside a string started with may be written as ".
A " inside a string started with " may be written as "".
MySQL> select hello, "hello", ""hello"", "h"e"l"l"o", "hel""lo";
1 rows in set (0.00 sec)
+-------+---------+-----------+-------------+--------+
| hello | hello | ""hello"" | hello | hel"lo |
+-------+---------+-----------+-------------+--------+
| hello | hello | ""hello"" | hello | hel"lo |
+-------+---------+-----------+-------------+--------+
mysql> select hello, "hello", ""hello"", "ello", e"l"lo, \hello;
1 rows in set (0.00 sec)
+-------+-------+-----------+-------+--------+--------+
| hello | hello | ""hello"" | ello | ello | hello |
+-------+-------+-----------+-------+--------+--------+
| hello | hello | ""hello"" | ello | ello | hello |
+-------+-------+-----------+-------+--------+--------+
mysql> select "This\nIs\nFour\nlines";
1 rows in set (0.00 sec)
+--------------------+
| This
Is
Four
lines |
+--------------------+
| This
30
8/14/2019 MySQL Technical Reference Manual.
31/91
Is
Four
lines |
+--------------------+
If you want to insert binary data into a blob the following characters must be represented by escape
sequences:
\0 Ascii 0. Should be replaced with "\0" (A backslash and a 0 digit).
\ Ascii 92, backslash Ascii 39, Single quote
" Ascii 33, Double quote
NUMBERS
Integers are just a sequence of digits. Floats use . as a decimal separator.
Examples of valid numbers are: 1221, 294.42, -32032.6809e+10.
NULL
When using the text file export formats, NULL may be represented by \N. See section LOAD DATA
INFILE syntax [p 45]
Column types.
The following column types are supported:
Name Description Size
TINYINT [(max display size)]
[UNSIGNED] [ZEROFILL]
A very small integer. Signed range -128 - 127. Unsigned
range 0 - 255.1
SMALLINT [(max display
size)]. [UNSIGNED]
[ZEROFILL]
A small integer. Signed range -32768 - 32767. Unsignedrange 0 - 65535.
2
MEDIUMINT [(max display
size)] [UNSIGNED]
[ZEROFILL]
A medium integer. Signed range -8388608-8388607.
Unsigned range 0 - 16777215.3
INT [(max display size)]
[UNSIGNED] [ZEROFILL]
A normal integer. xSigned range -2147483648 -
2147483647. Unsigned range 0 - 4294967295.4
BIGINT [(max display size)]
[UNSIGNED] [ZEROFILL]
A large integer. Signed range -9223372036854775808 -
9223372036854775807. Unsigned Range 0 -
18446744073709551615.
8
31
8/14/2019 MySQL Technical Reference Manual.
32/91
FLOAT(Precision)
A small floating point number. Precision can be 4 or 8.
FLOAT(4) is a single precision number and FLOAT(8) is a
double precision number (se the DOUBLE entry). This
syntax is for ODBC compatibility. Range
-3.402823466E+38F - -1.175494351E-38, 0,
-1.175494351E-38 - 3.402823466E+38F.
4
FLOAT [(max display
size,number of decimals)]
A small floating point number. Cannot be unsigned. Range
-3.402823466E+38F - -1.175494351E-38, 0,
-1.175494351E-38 - 3.402823466E+38F.
4
DOUBLE PRECISION [(max
display size,number of
decimals)]
A normal floating point number. Cannot be unsigned.
Range -1.7976931348623157E+308 -
-2.2250738585072014E-308, 0,
2.2250738585072014E-308 - 1.7976931348623157E+308.
8
REAL [(length,decimals)] Same as DOUBLE 8
DECIMAL [(max display
size,number of decimals)]
An unpacked floating point number. Cannot be unsigned.
Currently the same range maximum range as a double.
Behaves as a CHAR column
M+D
NUMERIC [(length,decimals)] Same as DECIMAL M+D
TIMESTAMP [(display size)] An automatic timestamp. 4
DATE
A type to store date information. Uses the
"YYYY-MM-DD" syntax, but may be updated with a
number or a string. Understands at least the following
syntaxes: YY-MM-DD, YYYY-MM-DD, YYMMDD,
YYMM, YY. Range 0000-00-00 to 9999-12-31.
4
TIME
A type to store time information. Uses the "HH:MM:SS"
syntax, but may be updated with a number or a string.
Understands at least the following syntaxes: HH:MM:DD,HHMMDD, HHMM, HH.
3
DATETIME
A type to store date and time information. Format
"YYYY-MM-DD HH:MM:SS". Takes 8 bytes. Range
0000-01-01 00:00:00 - 9999-12-31 23:59:59.
8
CHAR(max_length) [binary]
A fixed length string that is always filled up with spaces to
the specified length. Range 1 - 255 characters. All end
space are removed when retrieved. Is sorted and compared
case insensitively unless the binary keyword is given.
M
VARCHAR(max_length)[binary]
A variable length string that is stored with its length.
Maximum range 1 - 255 characters. Is sorted and comparedcase insensitively unless the binary keyword is given.
L + 1
TINYTEXT and TINYBLOB A TEXT/BLOB with max length of 255 characters. L + 1
TEXT and BLOB A TEXT/BLOB with max length of 65535 characters. L + 2
32
8/14/2019 MySQL Technical Reference Manual.
33/91
MEDIUMTEXT and
MEDIUMBLOBA TEXT/BLOB with max length of 1677216 characters. L + 3
LONGTEXT and LONGBLOBA TEXT/BLOB with max length of 4294967295
characters.L + 4
ENUM(value,value2,...)A string object that can have only one set of allowed
values. See section More about data types [p 33] .
1 or
2
SET(value,value2,....) A string object that can have one or many values of a set ofallowed values. See section More about data types [p 33] . 1-8
More about data types
Database size info.
In the above table L means the actual length of a instance and M the maximum length. So L+1 for
"abcd" means 5 bytes in the database.
If you use any data type with a L in the length field you will get a variable length record format.
The numeric types
All integer types can have a optional argument unsigned. This can be used when you only want to
allow positive numbers in the column or you need a little bigger numerical range for the column.
Also for all integer columns the optional argument ZEROFILL means that the column will be padded
with zeroes upto the maximum length.
Max display size and decimals are for formating and calculation of max column width.
TIMESTAMP type
Has a range of 1 Dec 1970 time 0.00 to sometime in the year 2106 and a resolution of one second.
Will be automatically updated if not used in a statement that updates a row or if set to NULL. Can be a
(part of) a key. Note that if you have many timestamp fields in a row, then only the first timestamp
field will be automatically updated. Any timestamp field will be set to the current time if set to NULL.
Depending on the display size one gets one of the following formats: "YYYY-MM-DD HH:MM:SS",
"YY-MM-DD HH:MM:SS", "YYYY-MM-DD" or "YY-MM-DD".
TEXT and BLOB types
These are objects that can have a variable length without upper limit. All TEXT and BLOB objects are
stored with is length (saved in 1 to 4 bytes depending on the type of object). The maximum TEXT and
BLOB length you can use is dependent on available memory and client buffers. The only differencesbetween TEXT and BLOB is that TEXT is sorted and compared case insensitively while BLOB is
compared case insensitive (by character values). TEXT and BLOB objects CANNOT be keys.
A BLOB is a binary large object which can hold any amount of data :) There are 4 kinds of blobs See
section Column types. [p 31] . Normally one can regard a BLOB as a VARCHAR without a specified
limit.
33
8/14/2019 MySQL Technical Reference Manual.
34/91
TEXT is a BLOB that is sorted and compared case insensitively.
There are some constraints because of the message buffer used. The default size of the buffer is 64K
for the server and 512K for the clients. To change the buffer length for the server, use mysqld -O
max_allowed_packet=max_blob_length. This allows the message buffer to grow up to this
limit when needed.
MyODBC defines BLOB:s as LONGVARBINARY and TEXT:s as LONGVARCHAR.
Restrictions for BLOB and TEXT columns:
1. A BLOB or TEXT cannot be a key or a part of a key
2. When one sorts or groups a BLOB or TEXT only the firstmax_sort_length (default 1024)
of the blob is used. This value can be changed by the -O option when starting the mysqld demon.
One can group on an expression involving a BLOB/TEXT: SELECT
id,SUBSTR(blob,1,100) GROUP BY 2
3. There is no end space truncation for BLOB and TEXT as there is for CHAR and VARCHAR.
ENUM type
A string object that can have only one set of allowed values. The value to be stored may be given caseindependently. If one tries to store a non existing value, "" is stored. If used in a number context this
object returns/stores the value index. If there is less than 255 possible values this object occupies 1
byte, else two bytes (with a maximum of 65535 different values). Note that if a integer is put in the
ENUM you get the corresponding string with the first counting as number zero. Sorting on ENUM types
are done after the order of the strings in the enum.
For example the column test ENUM("one","two", "three") can have any off these values:
"one"
"two"
"three"
SET type
A string object that can have one or many values of a set of allowed values. Each value is separated by
a ,. If used in a number context this object returns/stores the bit positions of the used values. This
object occupies (number_of_different_values-1)/8+1 bytes, rounded up to 1,2,3,4 or 8. One cant have
more than 64 different values. Note that if a integer is put in the SET you get the corresponding string
with the first bit corresponding to the first string.Sorting on SET types are done numericaly.
For example the column test SET("one","two") can have any off these values:
""
"one"
"two"
"one,two"
34
8/14/2019 MySQL Technical Reference Manual.
35/91
Column indexes
You can have indexes on all MysQL column types except BLOB and TEXT. Using indexes on the
relevant columns is the most important thing is getting you selects to run fast.
For CHAR and VARCHAR columns you can have a index on a prefix. The example below show how
to create a index for the first 10 characters of a column. This is much faster and requires less disk
space than having a index on the whole field.
CREATE TABLE test (
name CHAR(200),
KEY name (last_name(10));
Multiple field indexes
MySQL can have one index on parts of different columns.
A multiple column key can be considered as a sorted array where the columns are concatenated.
Suppose that you have a table:
CREATE TABLE test (id INT,
last_name CHAR(30),
first_name CHAR(30),
PRIMARY KEY (id),
KEY name (last_name,first_name));
Then the key name is a key over last_name and first_name.
The name key will be used in the following queries:
SELECT * FROM test WHERE last_name="Widenius";
SELECT * FROM test WHERE last_name="Widenius" AND first_name="Michael";
SELECT * FROM test WHERE last_name="Widenius" AND (first_name="Michael" OR first_name="Monty");
SELECT * FROM test WHERE last_name="Widenius" and first_name >="M" and first_name < "N";
The name key will NOT be used in the following queries:
SELECT * FROM test WHERE first_name="Michael";
SELECT * FROM test WHERE last_name="Widenius" or first_name="Michael";
Type mapping (to ease moving tabel definitions between different
databases engines)
To support easier use of code from different SQL vendors, MySQL does supports the following
mappings:
35
8/14/2019 MySQL Technical Reference Manual.
36/91
binary(num) char(num) binary
char varying varchar
float4 float
float8 double
int1 tinyint
int2 smallint
int3 mediumint
int4 int
int8 bigint
long varbinary blob
long varchar text
middleint mediumint
varbinary(num) varchar(num) binary
CREATE TABLE syntax.
CREATE TABLE table_name ( create_definition,... )
create_definition:
column_name type [DEFAULT default_value] [NOT NULL | NULL] [ PRIMARY KEY ]
[reference_definition]
or PRIMARY KEY ( key_column_name,... )
or KEY [key_name] KEY( key_column_name,...)
or INDEX [key_name] ( key_column_name,...)
or UNIQUE [key_name] ( key_column_name,...)or FOREIGN KEY key_name ( key_column_name,...) [reference_definition]
or CHECK (expr)
key_column_name:
column_name [ (length) ]
reference_definition:
REFERENCES table_name [( key_coulmn_name,...)]
[ MATCH FULL | MATCH PARTIAL]
[ ON DELETE reference_option]
[ ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
The FOREIGN KEY, CHECK and REFERENCE syntax are only for compatibility. They dont
actually do anything.
If a column doesnt have a DEFAULT value and is not declared as NOT NULL, the default value is
NULL.
36
8/14/2019 MySQL Technical Reference Manual.
37/91
ZEROFILL means that number is pre-zeroed to maximal length. With INT(5) ZEROFILL a
value of 5 is retrieved as 00005.
BINARY means that the column will be compared case sensitive. The default is that all strings
are compared case insensitive. BINARY is sticky which means that if a column marked
binary is used in a expression, the whole expression is compared binary.
INDEX is only a synonym for KEY.
If one doesnt assign a name to a key, the key will get the same name as the first key_column
with an optional _# to make it unique.
Key columns and timestamp columns cant be NULL. For these columns the NULL attribute issilently removed.
With column_name(length) syntax one can specify a key which is only a part of a string
column. This can make the index file much smaller.
A number column may have the additional attribute AUTO_INCREMENT to automatically get
the largest value+1 for each insert where column value is NULL or 0. See section How can I get
the unique ID for the last row? [p 83]
One can insert NULL for timestamp and auto_increment columns. This results in the current time
/ the next number.
Blob columns cant be keys.
When one groups on a blob only the first max_sort_length bytes are used See section
Limitations of BLOB and TEXT types [p 21] .Deleted records are in a linked list and subsequent inserts will reuse old positions. To get smaller
files one can use the isamchk utility to reorganise tables.
Each null column takes 1 bit extra, rounded up to the nearest byte.
The maximum record length can be calculated as follows: 1+ sum_of_column_lengths +
null_columns/8 + number of variable length columns.
In some cases an attribute may silently change after creation: VARCHAR columns with a length of
1 or 2 are changed to CHAR. When using one VARCHAR column all CHAR columns longer than 2
are changed to VARCHARs.
On INSERT/UPDATE all strings (CHAR and VARCHAR) are silently chopped/padded to the
maximal length given by CREATE. All end spaces are also automatically removed. For example
VARCHAR(10) means that the column can contain strings with a length up to 10 characters.Something/0 gives a NULL value.
The regular expression function (REGEXP and RLIKE) uses ISO8859-1 (Latin1) when deciding
the type of a character.
ALTER TABLE syntax
ALTER [IGNORE] TABLE table_name alter_specification [, alter_specification ...]
alter_specification:
ADD [COLUMN] create_definition
or CHANGE [COLUMN] old_column_name create_definition
or ALTER [COLUMN] column_name { SET DEFAULT literal | DROP DEFAULT }
or DROP [COLUMN] column_name
or DROP PRIMARY KEY
DROP INDEX key_name
ALTER TABLE works by creating a temporary table and copying all information to it and then
the old table is deleted and the new one is renamed. This is done in such a way that all updates
are automatically redirect to the new table without any failed updates. While the ALTER TABLE
is working, the old table is readable for other clients. Table updates/writes to the table are stalled
37
8/14/2019 MySQL Technical Reference Manual.
38/91
and only executed after the new table is ready.
If IGNORE isnt specified then the copy will be aborted and rolled back if there exists any
duplicated unique keys in the new table. This is a MySQL extension.
The CHANGE column_name, DROP column_name and DROP INDEX are MySQL
extensions to ANSI SQL92.
The optional word COLUMN is a pure noise word and can be omitted.
The ADD and CHANGE takes the same create_definition as CREATE TABLE. See section
CREATE TABLE syntax. [p 36] .
ALTER COLUMN sets a new default value or removes the old default value for a column.DROP INDEX removes an index. This is an MySQL extension.
The FOREIGN KEY syntax in MySQL exists only for compatibility with other SQL vendors
CREATE TABLE commands: It doesnt do anything. See section How standards compatible are
MySQL[p 19]
If one drops a column_name which is part of some key, this key part is removed. If all key parts
are removed then the key is removed.
DROP PRIMARY KEY drops the first UNIQUE key in the table.
CHANGE tries to convert data to the new format as good as possible.
With mysql_info(MYSQL*) one can retrieve how many records were copied and how many
records were deleted because of multiple keys.
To use ALTER TABLE one has to have select, insert, delete, update, create and drop privilegeson the table.
DROP TABLE syntax.
DROP TABLE table_name [, table_name....]
Removes one or more tables. All the data and the definition is removedso take it easy with this
command!
DELETE syntax.
DELETE FROM table_name WHERE where_definition
Returns records affected.
If one does a delete without a where clause then the table is recreated which is much faster than doing
a delete for each row. In these cases, the SQL command returns zero as affected records.
Using DELETE FROM table_name will work even if the data files do not exist as only
information from the table definition file, table_name.frm, is used.
All string comparisons are case independent with case according to ISO-8859-1 Latin1.
LIKE is allowed on numerical columns.Compare with explicit NULL (column == NULL) is the same as if IS NULL was used (column
IS NULL). This is is done to be consistent with mSQL.
38
8/14/2019 MySQL Technical Reference Manual.
39/91
SELECT syntax
SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [INTO
OUTFILE file_name ...] [ FROM tables... [WHERE where_definition ]
[GROUP BY column,...] [ ORDER BY column [ASC | DESC] ,..] HAVING
where_definition [LIMIT [offset,] rows] [PROCEDURE procedure_name]]
Strings are automatically converted to numbers and numbers to strings when needed (ala perl). If in a
compare operation ((=, , )) either if the arguments are numerical thearguments are compared as numbers, else the arguments are compared as strings. All string
comparisons are by default done case-independent by ISO8859-1 (The Scandinavian letter set which
also works excellent with English).
select 1 > "6x"; -> 0
select 7 > "6x"; -> 1
select 0 > "x6"; -> 0
select 0 = "x6"; -> 1
A column name does not have to have a table prefix if the given column name is unique.A select expression may be given an alias which will be column name and can be used when
sorting and grouping or in the HAVING clause.
select concat(last_name, ,first_name) as name from table order by name
In LIKE expressions % and _ may be preceded with \ to skip the wild-card meaning.
A DATE is a string with one of the following syntaxes:
YYMMDD (Year is assumed to be 2000 if YY < 70.)
YYYYMMDD
YY.MM.DD Where . may be any non numerical separator.
YYYY.MM.DD Where . may be any non numerical separator.
IFNULL() and IF() returns number or string value according to use.ORDER and GROUP columns may be given as column names, column alias or column numbers in
SELECT clauses.
The HAVING clause can take any columns or alias in the select_expressions. It is applied last,
just before items are sent to the client, without any optimisation. Dont use it for items that
should be in the WHERE clause. You cant write (yet):
SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10
Change it to:
SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10
STRAIGHT_JOIN forces the optimiser to join the tables in the same order that the tables are
given in the FROM clause. One can use this to get a query to be done more quickly if the
optimiser joins the tables in not optimal order. See section EXPLAIN syntax. Get information
about a SELECT. [p 47]
LIMIT takes one or two numerical arguments.
If one argument, the argument indicates the maximum number of rows in a result.
If two arguments, the first argument says the offset to the first row to return, the second is
39
8/14/2019 MySQL Technical Reference Manual.
40/91
the maximum number of rows.
INTO OUTFILE filename writes the given set to a file. The file can not exist from before. See
section LOAD DATA INFILE syntax [p 45] .
Functions
A select_expression or where_definition can consist of any expression using the
following functions:
Group functions.
(
) Parenthesis
Normal mathematical operations.
+
-
*
/ A division by zero results in a NULL.
Bit functions. These have a range of maximum 64 bits because MySQL uses longlong arithmetic.
|
&
BIT_COUNT()
Number of set bits in an argument.
Normal logical. Returns TRUE (1) or FALSE (0).
NOT
!
ORAND
Comparison operators. Returns TRUE (1) or FALSE (0). These functions work for both numbers and
strings.
= Equal
Not equal. Synonym: !=
= Bigger or equal
> Bigger
ISNULL(A)Returns 1 if A is NULL else 0. Same as ( A == NULL ).
A BETWEEN B AND C
A is bigger or equal as B and A is smaller or equal to C. Is the same as (A >= B AND A
8/14/2019 MySQL Technical Reference Manual.
41/91
String comparison functions.
expr IN (value,...)
Returns 1 if expr is any of the values in the IN list, else it returns 0. If all values are constants,
then all values are evaluated according to the type of expr and sorted. The search for them item is
then done by using a binary search. This means IN is very quick when used with constants in the
IN part.
expr LIKE expr
SQL simple regular expression comparison. Returns TRUE (1) or FALSE (0). With LIKE youhave two wild characters. % stands for any number of characters, even zero characters. _stands exactly one character. If you want to search after a % or a _ you must precede it with
a \ For example the string "Monty was here" is matched by "Monty%", "%Monty ___ h%"
and "%was%".
expr NOT LIKE expr
Returns TRUE (1) or FALSE (0).
expr REGEXP expr
Checks string against extended regular expr.
expr NOT REGEXP expr
Checks string against extended regular expr.
STRCMP()
Returns 0 if the strings are the same. Otherwise return -1 if first argument is smaller according tosort-order, otherwise it returns 1.
Control flow functions.
IFNULL(A,B)
If A is not null it returns A, else B.
IF(A,B,C)
If A is true ( 0 and NULL) then return B, else return C.
Mathematical functions. These returns NULL in the case of a error.
- SignABS()
SIGN()
Sign of argument. Returns -1, 0 or 1.
MOD()
% Module (like in C). Equivalent with MOD().
FLOOR()
CEILING()
ROUND()
EXP()
LOG()
LOG10()
POW()SQRT()
PI()
COS()
SIN()
41
8/14/2019 MySQL Technical Reference Manual.
42/91
TAN()
TAN2()
ACOS()
ASIN()
ATAN()
RAND([integer_expr])
Returns a random float, 0
8/14/2019 MySQL Technical Reference Manual.
43/91
SUBSTRING(A FROM B FOR C)
Same as SUBSTRING(A,B,C). This is ANSI SQL 92.
SUBSTRING(A FROM B)
Same as RIGHT(A,B). This is ANSI SQL 92.
SUBSTRING_INDEX(string,delimiter,count)
Returns the substring from string after count delimiters. If count is positive the strings are
searched from left else if count is negative the substrings are searched and returned from right.
substring("www.tcx.se",".",2) would return "www.tcx" and
substring("www.tcx.se",".",-2) would return "tcx.se".
REPLACE(A,B,C)
Repla