MySQL Technical Reference Manual

Embed Size (px)

Citation preview

  • 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.htm
  • 8/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

    [email protected].

    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

    [email protected].

    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.htmy
  • 8/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/TODO
  • 8/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