manual.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1762k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.      convenience only.  Client programs allow a different name to be
  2.      specified with the `-u' or `--user' options. This means that you
  3.      can't make a database secure in any way unless all *MySQL* user
  4.      names have passwords.  Anyone may attempt to connect to the server
  5.      using any name, and they will succeed if they specify any name
  6.      that doesn't have a password.
  7.    * *MySQL* user names can be up to 16 characters long; Unix user names
  8.      typically are limited to 8 characters.
  9.    * *MySQL* passwords have nothing to do with Unix passwords.  There
  10.      is no necessary connection between the password you use to log in
  11.      to a Unix machine and the password you use to access a database on
  12.      that machine.
  13.    * *MySQL* encrypts passwords using a different algorithm than the
  14.      one used during the Unix login process.  See the descriptions of
  15.      the `PASSWORD()' and `ENCRYPT()' functions in *Note Miscellaneous
  16.      functions::.  Note that even if the password is stored
  17.      'scrambled', and knowing your 'scrambled' password is enough to be
  18.      able to connect to the *MySQL* server!
  19. Connecting to the MySQL Server
  20. ==============================
  21. *MySQL* client programs generally require that you specify connection
  22. parameters when you want to access a *MySQL* server: the host you want
  23. to connect to, your user name, and your password.  For example, the
  24. `mysql' client can be started like this (optional arguments are enclosed
  25. between `[' and `]'):
  26.      shell> mysql [-h host_name] [-u user_name] [-pyour_pass]
  27. Alternate forms of the `-h', `-u', and `-p' options are
  28. `--host=host_name', `--user=user_name', and `--password=your_pass'.
  29. Note that there is _no space_ between `-p' or `--password=' and the
  30. password following it.
  31. *NOTE:* Specifying a password on the command line is not secure!  Any
  32. user on your system may then find out your password by typing a command
  33. like: `ps auxww'.  *Note Option files::.
  34. `mysql' uses default values for connection parameters that are missing
  35. from the command line:
  36.    * The default hostname is `localhost'.
  37.    * The default user name is your Unix login name.
  38.    * No password is supplied if `-p' is missing.
  39. Thus, for a Unix user `joe', the following commands are equivalent:
  40.      shell> mysql -h localhost -u joe
  41.      shell> mysql -h localhost
  42.      shell> mysql -u joe
  43.      shell> mysql
  44. Other *MySQL* clients behave similarly.
  45. On Unix systems, you can specify different default values to be used
  46. when you make a connection, so that you need not enter them on the
  47. command line each time you invoke a client program.  This can be done
  48. in a couple of ways:
  49.    * You can specify connection parameters in the `[client]' section of
  50.      the `.my.cnf' configuration file in your home directory.  The
  51.      relevant section of the file might look like this:
  52.           [client]
  53.           host=host_name
  54.           user=user_name
  55.           password=your_pass
  56.      *Note Option files::.
  57.    * You can specify connection parameters using environment variables.
  58.      The host can be specified for `mysql' using `MYSQL_HOST'.  The
  59.      *MySQL* user name can be specified using `USER' (this is for
  60.      Windows only).  The password can be specified using `MYSQL_PWD'
  61.      (but this is insecure; see the next section).  *Note Environment
  62.      variables::.
  63. Keeping Your Password Secure
  64. ============================
  65. It is inadvisable to specify your password in a way that exposes it to
  66. discovery by other users.  The methods you can use to specify your
  67. password when you run client programs are listed below, along with an
  68. assessment of the risks of each method:
  69.    * Never give a normal user access to the `mysql.user' table. Knowing
  70.      the encrypted password for a user makes it possible to login as
  71.      this user.  The passwords are only scrambled so that one shouldn't
  72.      be able to see the real password you used (if you happen to use a
  73.      similar password with your other applications).
  74.    * Use a `-pyour_pass' or `--password=your_pass' option on the command
  75.      line.  This is convenient but insecure, because your password
  76.      becomes visible to system status programs (such as `ps') that may
  77.      be invoked by other users to display command lines.  (*MySQL*
  78.      clients typically overwrite the command-line argument with zeroes
  79.      during their initialization sequence, but there is still a brief
  80.      interval during which the value is visible.)
  81.    * Use a `-p' or `--password' option (with no `your_pass' value
  82.      specified).  In this case, the client program solicits the
  83.      password from the terminal:
  84.           shell> mysql -u user_name -p
  85.           Enter password: ********
  86.      The `*' characters represent your password.
  87.      It is more secure to enter your password this way than to specify
  88.      it on the command line because it is not visible to other users.
  89.      However, this method of entering a password is suitable only for
  90.      programs that you run interactively.  If you want to invoke a
  91.      client from a script that runs non-interactively, there is no
  92.      opportunity to enter the password from the terminal. On some
  93.      systems, you may even find that the first line of your script is
  94.      read and interpreted (incorrectly) as your password!
  95.    * Store your password in a configuration file.  For example, you can
  96.      list your password in the `[client]' section of the `.my.cnf' file
  97.      in your home directory:
  98.           [client]
  99.           password=your_pass
  100.      If you store your password in `.my.cnf', the file should not be
  101.      group or world readable or writable.  Make sure the file's access
  102.      mode is `400' or `600'.
  103.      *Note Option files::.
  104.    * You can store your password in the `MYSQL_PWD' environment
  105.      variable, but this method must be considered extremely insecure
  106.      and should not be used.  Some versions of `ps' include an option
  107.      to display the environment of running processes; your password
  108.      will be in plain sight for all to see if you set `MYSQL_PWD'.
  109.      Even on systems without such a version of `ps', it is unwise to
  110.      assume there is no other method to observe process environments.
  111.      *Note Environment variables::.
  112. All in all, the safest methods are to have the client program prompt
  113. for the password or to specify the password in a properly protected
  114. `.my.cnf' file.
  115. Privileges Provided by MySQL
  116. ============================
  117. Information about user privileges is stored in the `user', `db',
  118. `host', `tables_priv', and `columns_priv' tables in the `mysql'
  119. database (that is, in the database named `mysql').  The *MySQL* server
  120. reads the contents of these tables when it starts up and under the
  121. circumstances indicated in *Note Privilege changes::.
  122. The names used in this manual to refer to the privileges provided by
  123. *MySQL* are shown below, along with the table column name associated
  124. with each privilege in the grant tables and the context in which the
  125. privilege applies:
  126. *Privilege* *Column*           *Context*
  127. *select*    `Select_priv'      tables
  128. *insert*    `Insert_priv'      tables
  129. *update*    `Update_priv'      tables
  130. *delete*    `Delete_priv'      tables
  131. *index*     `Index_priv'       tables
  132. *alter*     `Alter_priv'       tables
  133. *create*    `Create_priv'      databases, tables, or indexes
  134. *drop*      `Drop_priv'        databases or tables
  135. *grant*     `Grant_priv'       databases or tables
  136. *references*`References_priv'  databases or tables
  137. *reload*    `Reload_priv'      server administration
  138. *shutdown*  `Shutdown_priv'    server administration
  139. *process*   `Process_priv'     server administration
  140. *file*      `File_priv'        file access on server
  141. The *select*, *insert*, *update*, and *delete* privileges allow you to
  142. perform operations on rows in existing tables in a database.
  143. `SELECT' statements require the *select* privilege only if they
  144. actually retrieve rows from a table.  You can execute certain `SELECT'
  145. statements even without permission to access any of the databases on the
  146. server.  For example, you could use the `mysql' client as a simple
  147. calculator:
  148.      mysql> SELECT 1+1;
  149.      mysql> SELECT PI()*2;
  150. The *index* privilege allows you to create or drop (remove) indexes.
  151. The *alter* privilege allows you to use `ALTER TABLE'.
  152. The *create* and *drop* privileges allow you to create new databases
  153. and tables, or to drop (remove) existing databases and tables.
  154. Note that if you grant the *drop* privilege for the `mysql' database to
  155. a user, that user can drop the database in which the *MySQL* access
  156. privileges are stored!
  157. The *grant* privilege allows you to give to other users those
  158. privileges you yourself possess.
  159. The *file* privilege gives you permission to read and write files on
  160. the server using the `LOAD DATA INFILE' and `SELECT ... INTO OUTFILE'
  161. statements.  Any user to whom this privilege is granted can read or
  162. write any file that the *MySQL* server can read or write.
  163. The remaining privileges are used for administrative operations, which
  164. are performed using the `mysqladmin' program.  The table below shows
  165. which `mysqladmin' commands each administrative privilege allows you to
  166. execute:
  167. *Privilege* *Commands permitted to privilege holders*
  168. *reload*    `reload', `refresh', `flush-privileges', `flush-hosts',
  169.             `flush-logs', and `flush-tables'
  170. *shutdown*  `shutdown'
  171. *process*   `processlist', `kill'
  172. The `reload' command tells the server to re-read the grant tables.  The
  173. `refresh' command flushes all tables and opens and closes the log
  174. files.  `flush-privileges' is a synonym for `reload'.  The other
  175. `flush-*' commands perform functions similar to `refresh' but are more
  176. limited in scope, and may be preferable in some instances.  For example,
  177. if you want to flush just the log files, `flush-logs' is a better choice
  178. than `refresh'.
  179. The `shutdown' command shuts down the server.
  180. The `processlist' command displays information about the threads
  181. executing within the server.  The `kill' command kills server threads.
  182. You can always display or kill your own threads, but you need the
  183. *process* privilege to display or kill threads initiated by other
  184. users. *Note KILL::.
  185. It is a good idea in general to grant privileges only to those users
  186. who need them, but you should exercise particular caution in granting
  187. certain privileges:
  188.    * The *grant* privilege allows users to give away their privileges to
  189.      other users.  Two users with different privileges and with the
  190.      *grant* privilege are able to combine privileges.
  191.    * The *alter* privilege may be used to subvert the privilege system
  192.      by renaming tables.
  193.    * The *file* privilege can be abused to read any world-readable file
  194.      on the server into a database table, the contents of which can
  195.      then be accessed using `SELECT'. This includes the contents of all
  196.      databases hosted by the server!
  197.    * The *shutdown* privilege can be abused to deny service to other
  198.      users entirely, by terminating the server.
  199.    * The *process* privilege can be used to view the plain text of
  200.      currently executing queries, including queries that set or change
  201.      passwords.
  202.    * Privileges on the `mysql' database can be used to change passwords
  203.      and other access privilege information.  (Passwords are stored
  204.      encrypted, so a malicious user cannot simply read them to know the
  205.      plain text password).  If they can access the `mysql.user' password
  206.      column, they can use it to log into the *MySQL* server for the
  207.      given user.  (With sufficient privileges, the same user can
  208.      replace a password with a different one.)
  209. There are some things that you cannot do with the *MySQL* privilege
  210. system:
  211.    * You cannot explicitly specify that a given user should be denied
  212.      access.  That is, you cannot explicitly match a user and then
  213.      refuse the connection.
  214.    * You cannot specify that a user has privileges to create or drop
  215.      tables in a database but not to create or drop the database itself.
  216. How the Privilege System Works
  217. ==============================
  218. The *MySQL* privilege system ensures that all users may do exactly the
  219. things that they are supposed to be allowed to do.  When you connect to
  220. a *MySQL* server, your identity is determined by *the host from which
  221. you connect* and *the user name you specify*.  The system grants
  222. privileges according to your identity and *what you want to do*.
  223. *MySQL* considers both your hostname and user name in identifying you
  224. because there is little reason to assume that a given user name belongs
  225. to the same person everywhere on the Internet.  For example, the user
  226. `bill' who connects from `whitehouse.gov' need not be the same person
  227. as the user `bill' who connects from `microsoft.com'.  *MySQL* handles
  228. this by allowing you to distinguish users on different hosts that
  229. happen to have the same name:  you can grant `bill' one set of
  230. privileges for connections from `whitehouse.gov', and a different set
  231. of privileges for connections from `microsoft.com'.
  232. *MySQL* access control involves two stages:
  233.    * Stage 1: The server checks whether or not you are even allowed to
  234.      connect.
  235.    * Stage 2: Assuming you can connect, the server checks each request
  236.      you issue to see whether or not you have sufficient privileges to
  237.      perform it.  For example, if you try to select rows from a table
  238.      in a database or drop a table from the database, the server makes
  239.      sure you have the *select* privilege for the table or the *drop*
  240.      privilege for the database.
  241. The server uses the `user', `db', and `host' tables in the `mysql'
  242. database at both stages of access control.  The fields in these grant
  243. tables are shown below:
  244. *Table name*   `user'             `db'               `host'
  245. *Scope         `Host'             `Host'             `Host'
  246. fields*                                              
  247.                `User'             `Db'               `Db'
  248.                `Password'         `User'             
  249. *Privilege     `Select_priv'      `Select_priv'      `Select_priv'
  250. fields*                                              
  251.                `Insert_priv'      `Insert_priv'      `Insert_priv'
  252.                `Update_priv'      `Update_priv'      `Update_priv'
  253.                `Delete_priv'      `Delete_priv'      `Delete_priv'
  254.                `Index_priv'       `Index_priv'       `Index_priv'
  255.                `Alter_priv'       `Alter_priv'       `Alter_priv'
  256.                `Create_priv'      `Create_priv'      `Create_priv'
  257.                `Drop_priv'        `Drop_priv'        `Drop_priv'
  258.                `Grant_priv'       `Grant_priv'       `Grant_priv'
  259.                `References_priv'                     
  260.                `Reload_priv'                         
  261.                `Shutdown_priv'                       
  262.                `Process_priv'                        
  263.                `File_priv'                           
  264. For the second stage of access control (request verification), the
  265. server may, if the request involves tables, additionally consult the
  266. `tables_priv' and `columns_priv' tables.  The fields in these tables
  267. are shown below:
  268. *Table name*   `tables_priv'      `columns_priv'
  269. *Scope         `Host'             `Host'
  270. fields*                           
  271.                `Db'               `Db'
  272.                `User'             `User'
  273.                `Table_name'       `Table_name'
  274.                                   `Column_name'
  275. *Privilege     `Table_priv'       `Column_priv'
  276. fields*                           
  277.                `Column_priv'      
  278. *Other         `Timestamp'        `Timestamp'
  279. fields*                           
  280.                `Grantor'          
  281. Each grant table contains scope fields and privilege fields.
  282. Scope fields determine the scope of each entry in the tables, that is,
  283. the context in which the entry applies.  For example, a `user' table
  284. entry with `Host' and `User' values of `'thomas.loc.gov'' and `'bob''
  285. would be used for authenticating connections made to the server by
  286. `bob' from the host `thomas.loc.gov'.  Similarly, a `db' table entry
  287. with `Host', `User', and `Db' fields of `'thomas.loc.gov'', `'bob'' and
  288. `'reports'' would be used when `bob' connects from the host
  289. `thomas.loc.gov' to access the `reports' database.  The `tables_priv'
  290. and `columns_priv' tables contain scope fields indicating tables or
  291. table/column combinations to which each entry applies.
  292. For access-checking purposes, comparisons of `Host' values are case
  293. insensitive.  `User', `Password', `Db', and `Table_name' values are
  294. case sensitive.  `Column_name' values are case insensitive in *MySQL*
  295. Version 3.22.12 or later.
  296. Privilege fields indicate the privileges granted by a table entry, that
  297. is, what operations can be performed.  The server combines the
  298. information in the various grant tables to form a complete description
  299. of a user's privileges.  The rules used to do this are described in
  300. *Note Request access::.
  301. Scope fields are strings, declared as shown below; the default value for
  302. each is the empty string:
  303. *Field      *Type*      
  304. name*                   
  305. `Host'      `CHAR(60)'  
  306. `User'      `CHAR(16)'  
  307. `Password'  `CHAR(16)'  
  308. `Db'        `CHAR(64)'  (`CHAR(60)' for the `tables_priv' and
  309.                         `columns_priv' tables)
  310. `Table_name'`CHAR(60)'  
  311. `Column_name'`CHAR(60)'  
  312. In the `user', `db' and `host' tables, all privilege fields are
  313. declared as `ENUM('N','Y')' -- each can have a value of `'N'' or `'Y'',
  314. and the default value is `'N''.
  315. In the `tables_priv' and `columns_priv' tables, the privilege fields
  316. are declared as `SET' fields:
  317. *Table name*   *Field name*   *Possible set elements*
  318. `tables_priv'  `Table_priv'   `'Select', 'Insert', 'Update', 'Delete',
  319.                               'Create', 'Drop', 'Grant', 'References',
  320.                               'Index', 'Alter''
  321. `tables_priv'  `Column_priv'  `'Select', 'Insert', 'Update',
  322.                               'References''
  323. `columns_priv' `Column_priv'  `'Select', 'Insert', 'Update',
  324.                               'References''
  325. Briefly, the server uses the grant tables like this:
  326.    * The `user' table scope fields determine whether to allow or reject
  327.      incoming connections.  For allowed connections, any privileges
  328.      granted in the `user' table indicate the user's global (superuser)
  329.      privileges.  These privileges apply to *all* databases on the
  330.      server.
  331.    * The `db' and `host' tables are used together:
  332.         - The `db' table scope fields determine which users can access
  333.           which databases from which hosts.  The privilege fields
  334.           determine which operations are allowed.
  335.         - The `host' table is used as an extension of the `db' table
  336.           when you want a given `db' table entry to apply to several
  337.           hosts.  For example, if you want a user to be able to use a
  338.           database from several hosts in your network, leave the `Host'
  339.           value empty in the user's `db' table entry, then populate the
  340.           `host' table with an entry for each of those hosts.  This
  341.           mechanism is described more detail in *Note Request access::.
  342.    * The `tables_priv' and `columns_priv' tables are similar to the
  343.      `db' table, but are more fine-grained: they apply at the table and
  344.      column levels rather than at the database level.
  345. Note that administrative privileges (*reload*, *shutdown*, etc.) are
  346. specified only in the `user' table.  This is because administrative
  347. operations are operations on the server itself and are not
  348. database-specific, so there is no reason to list such privileges in the
  349. other grant tables.  In fact, only the `user' table need be consulted
  350. to determine whether or not you can perform an administrative operation.
  351. The *file* privilege is specified only in the `user' table, too.  It is
  352. not an administrative privilege as such, but your ability to read or
  353. write files on the server host is independent of the database you are
  354. accessing.
  355. The `mysqld' server reads the contents of the grant tables once, when it
  356. starts up.  Changes to the grant tables take effect as indicated in
  357. *Note Privilege changes::.
  358. When you modify the contents of the grant tables, it is a good idea to
  359. make sure that your changes set up privileges the way you want.  For
  360. help in diagnosing problems, see *Note Access denied::.  For advice on
  361. security issues, *note Security::.
  362. A useful diagnostic tool is the `mysqlaccess' script, which Yves
  363. Carlier has provided for the *MySQL* distribution.  Invoke
  364. `mysqlaccess' with the `--help' option to find out how it works.  Note
  365. that `mysqlaccess' checks access using only the `user', `db' and `host'
  366. tables.  It does not check table- or column-level privileges.
  367. Access Control, Stage 1: Connection Verification
  368. ================================================
  369. When you attempt to connect to a *MySQL* server, the server accepts or
  370. rejects the connection based on your identity and whether or not you can
  371. verify your identity by supplying the correct password.  If not, the
  372. server denies access to you completely.  Otherwise, the server accepts
  373. the connection, then enters Stage 2 and waits for requests.
  374. Your identity is based on two pieces of information:
  375.    * The host from which you connect
  376.    * Your *MySQL* user name
  377. Identity checking is performed using the three `user' table scope fields
  378. (`Host', `User', and `Password').  The server accepts the connection
  379. only if a `user' table entry matches your hostname and user name, and
  380. you supply the correct password.
  381. Values in the `user' table scope fields may be specified as follows:
  382.    * A `Host' value may be a hostname or an IP number, or `'localhost''
  383.      to indicate the local host.
  384.    * You can use the wild-card characters `%' and `_' in the `Host'
  385.      field.
  386.    * A `Host' value of `'%'' matches any hostname.  A blank `Host'
  387.      value is equivalent to `'%''.  Note that these values match _any
  388.      host that can create a connection to your server!_
  389.    * As of MySQL Version 3.23, for `Host' values specified as IP
  390.      numbers, you can specify a netmask indicating how many address
  391.      bits to use for the network number. For example:
  392.           GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0';
  393.      This will allow everyone to connect from an IP where the following
  394.      is true:
  395.           user_ip & netmask = host_ip.
  396.      In the above example all IP:s in the interval 192.58.197.0 -
  397.      192.58.197.255 can connect to the *MySQL* server.
  398.    * Wild-card characters are not allowed in the `User' field, but you
  399.      can specify a blank value, which matches any name.  If the `user'
  400.      table entry that matches an incoming connection has a blank user
  401.      name, the user is considered to be the anonymous user (the user
  402.      with no name), rather than the name that the client actually
  403.      specified.  This means that a blank user name is used for all
  404.      further access checking for the duration of the connection (that
  405.      is, during Stage 2).
  406.    * The `Password' field can be blank.  This does not mean that any
  407.      password matches, it means the user must connect without
  408.      specifying a password.
  409. Non-blank `Password' values represent encrypted passwords.  *MySQL*
  410. does not store passwords in plaintext form for anyone to see.  Rather,
  411. the password supplied by a user who is attempting to connect is
  412. encrypted (using the `PASSWORD()' function). The encrypted password is
  413. then used when the client/server is checking if the password is correct
  414. (This is done without the encrypted password ever traveling over the
  415. connection.)  Note that from *MySQL*'s point of view the encrypted
  416. password is the REAL password, so you should not give anyone access to
  417. it!  In particular, don't give normal users read access to the tables
  418. in the `mysql' database!
  419. The examples below show how various combinations of `Host' and `User'
  420. values in `user' table entries apply to incoming connections:
  421. `Host' *value*     `User'      *Connections matched by entry*
  422.                    *value*     
  423. `'thomas.loc.gov'' `'fred''    `fred', connecting from `thomas.loc.gov'
  424. `'thomas.loc.gov'' `'''        Any user, connecting from `thomas.loc.gov'
  425. `'%''              `'fred''    `fred', connecting from any host
  426. `'%''              `'''        Any user, connecting from any host
  427. `'%.loc.gov''      `'fred''    `fred', connecting from any host in the
  428.                                `loc.gov' domain
  429. `'x.y.%''          `'fred''    `fred', connecting from `x.y.net',
  430.                                `x.y.com',`x.y.edu', etc. (this is
  431.                                probably not useful)
  432. `'144.155.166.177''`'fred''    `fred', connecting from the host with IP
  433.                                address `144.155.166.177'
  434. `'144.155.166.%''  `'fred''    `fred', connecting from any host in the
  435.                                `144.155.166' class C subnet
  436. `'144.155.166.0/255.255.255.0''`'fred''    Same as previous example
  437. Because you can use IP wild-card values in the `Host' field (for
  438. example, `'144.155.166.%'' to match every host on a subnet), there is
  439. the possibility that someone might try to exploit this capability by
  440. naming a host `144.155.166.somewhere.com'.  To foil such attempts,
  441. *MySQL* disallows matching on hostnames that start with digits and a
  442. dot. Thus, if you have a host named something like `1.2.foo.com', its
  443. name will never match the `Host' column of the grant tables.  Only an
  444. IP number can match an IP wild-card value.
  445. An incoming connection may be matched by more than one entry in the
  446. `user' table.  For example, a connection from `thomas.loc.gov' by
  447. `fred' would be matched by several of the entries just shown above.  How
  448. does the server choose which entry to use if more than one matches?  The
  449. server resolves this question by sorting the `user' table after reading
  450. it at startup time, then looking through the entries in sorted order
  451. when a user attempts to connect.  The first matching entry is the one
  452. that is used.
  453. `user' table sorting works as follows.  Suppose the `user' table looks
  454. like this:
  455.      +-----------+----------+-
  456.      | Host      | User     | ...
  457.      +-----------+----------+-
  458.      | %         | root     | ...
  459.      | %         | jeffrey  | ...
  460.      | localhost | root     | ...
  461.      | localhost |          | ...
  462.      +-----------+----------+-
  463. When the server reads in the table, it orders the entries with the
  464. most-specific `Host' values first (`'%'' in the `Host' column means
  465. "any host" and is least specific).  Entries with the same `Host' value
  466. are ordered with the most-specific `User' values first (a blank `User'
  467. value means "any user" and is least specific).  The resulting sorted
  468. `user' table looks like this:
  469.      +-----------+----------+-
  470.      | Host      | User     | ...
  471.      +-----------+----------+-
  472.      | localhost | root     | ...
  473.      | localhost |          | ...
  474.      | %         | jeffrey  | ...
  475.      | %         | root     | ...
  476.      +-----------+----------+-
  477. When a connection is attempted, the server looks through the sorted
  478. entries and uses the first match found.  For a connection from
  479. `localhost' by `jeffrey', the entries with `'localhost'' in the `Host'
  480. column match first.  Of those, the entry with the blank user name
  481. matches both the connecting hostname and user name.  (The
  482. `'%'/'jeffrey'' entry would have matched, too, but it is not the first
  483. match in the table.)
  484. Here is another example.  Suppose the `user' table looks like this:
  485.      +----------------+----------+-
  486.      | Host           | User     | ...
  487.      +----------------+----------+-
  488.      | %              | jeffrey  | ...
  489.      | thomas.loc.gov |          | ...
  490.      +----------------+----------+-
  491. The sorted table looks like this:
  492.      +----------------+----------+-
  493.      | Host           | User     | ...
  494.      +----------------+----------+-
  495.      | thomas.loc.gov |          | ...
  496.      | %              | jeffrey  | ...
  497.      +----------------+----------+-
  498. A connection from `thomas.loc.gov' by `jeffrey' is matched by the first
  499. entry, whereas a connection from `whitehouse.gov' by `jeffrey' is
  500. matched by the second.
  501. A common misconception is to think that for a given user name, all
  502. entries that explicitly name that user will be used first when the
  503. server attempts to find a match for the connection.  This is simply not
  504. true.  The previous example illustrates this, where a connection from
  505. `thomas.loc.gov' by `jeffrey' is first matched not by the entry
  506. containing `'jeffrey'' as the `User' field value, but by the entry with
  507. no user name!
  508. If you have problems connecting to the server, print out the `user'
  509. table and sort it by hand to see where the first match is being made.
  510. Access Control, Stage 2: Request Verification
  511. =============================================
  512. Once you establish a connection, the server enters Stage 2.  For each
  513. request that comes in on the connection, the server checks whether you
  514. have sufficient privileges to perform it, based on the type of
  515. operation you wish to perform.  This is where the privilege fields in
  516. the grant tables come into play.  These privileges can come from any of
  517. the `user', `db', `host', `tables_priv', or `columns_priv' tables.  The
  518. grant tables are manipulated with `GRANT' and `REVOKE' commands.  *Note
  519. `GRANT': GRANT.  (You may find it helpful to refer to *Note
  520. Privileges::, which lists the fields present in each of the grant
  521. tables.)
  522. The `user' table grants privileges that are assigned to you on a global
  523. basis and that apply no matter what the current database is.  For
  524. example, if the `user' table grants you the *delete* privilege, you can
  525. delete rows from any database on the server host!  In other words,
  526. `user' table privileges are superuser privileges.  It is wise to grant
  527. privileges in the `user' table only to superusers such as server or
  528. database administrators.  For other users, you should leave the
  529. privileges in the `user' table set to `'N'' and grant privileges on a
  530. database-specific basis only, using the `db' and `host' tables.
  531. The `db' and `host' tables grant database-specific privileges.  Values
  532. in the scope fields may be specified as follows:
  533.    * The wild-card characters `%' and `_' can be used in the `Host' and
  534.      `Db' fields of either table.
  535.    * A `'%'' `Host' value in the `db' table means "any host." A blank
  536.      `Host' value in the `db' table means "consult the `host' table for
  537.      further information."
  538.    * A `'%'' or blank `Host' value in the `host' table means "any host."
  539.    * A `'%'' or blank `Db' value in either table means "any database."
  540.    * A blank `User' value in either table matches the anonymous user.
  541. The `db' and `host' tables are read in and sorted when the server
  542. starts up (at the same time that it reads the `user' table).  The `db'
  543. table is sorted on the `Host', `Db', and `User' scope fields, and the
  544. `host' table is sorted on the `Host' and `Db' scope fields.  As with
  545. the `user' table, sorting puts the most-specific values first and
  546. least-specific values last, and when the server looks for matching
  547. entries, it uses the first match that it finds.
  548. The `tables_priv' and `columns_priv' tables grant table- and
  549. column-specific privileges.  Values in the scope fields may be
  550. specified as follows:
  551.    * The wild-card characters `%' and `_' can be used in the `Host'
  552.      field of either table.
  553.    * A `'%'' or blank `Host' value in either table means "any host."
  554.    * The `Db', `Table_name' and `Column_name' fields cannot contain
  555.      wild cards or be blank in either table.
  556. The `tables_priv' and `columns_priv' tables are sorted on the `Host',
  557. `Db', and `User' fields.  This is similar to `db' table sorting,
  558. although the sorting is simpler because only the `Host' field may
  559. contain wild cards.
  560. The request verification process is described below.  (If you are
  561. familiar with the access-checking source code, you will notice that the
  562. description here differs slightly from the algorithm used in the code.
  563. The description is equivalent to what the code actually does; it
  564. differs only to make the explanation simpler.)
  565. For administrative requests (*shutdown*, *reload*, etc.), the server
  566. checks only the `user' table entry, because that is the only table that
  567. specifies administrative privileges.  Access is granted if the entry
  568. allows the requested operation and denied otherwise.  For example, if
  569. you want to execute `mysqladmin shutdown' but your `user' table entry
  570. doesn't grant the *shutdown* privilege to you, access is denied without
  571. even checking the `db' or `host' tables.  (They contain no
  572. `Shutdown_priv' column, so there is no need to do so.)
  573. For database-related requests (*insert*, *update*, etc.), the server
  574. first checks the user's global (superuser) privileges by looking in the
  575. `user' table entry.  If the entry allows the requested operation,
  576. access is granted.  If the global privileges in the `user' table are
  577. insufficient, the server determines the user's database-specific
  578. privileges by checking the `db' and `host' tables:
  579.   1. The server looks in the `db' table for a match on the `Host',
  580.      `Db', and `User' fields.  The `Host' and `User' fields are matched
  581.      to the connecting user's hostname and *MySQL* user name.  The `Db'
  582.      field is matched to the database the user wants to access.  If
  583.      there is no entry for the `Host' and `User', access is denied.
  584.   2. If there is a matching `db' table entry and its `Host' field is
  585.      not blank, that entry defines the user's database-specific
  586.      privileges.
  587.   3. If the matching `db' table entry's `Host' field is blank, it
  588.      signifies that the `host' table enumerates which hosts should be
  589.      allowed access to the database.  In this case, a further lookup is
  590.      done in the `host' table to find a match on the `Host' and `Db'
  591.      fields.  If no `host' table entry matches, access is denied.  If
  592.      there is a match, the user's database-specific privileges are
  593.      computed as the intersection (_not_ the union!) of the privileges
  594.      in the `db' and `host' table entries, that is, the privileges that
  595.      are `'Y'' in both entries.  (This way you can grant general
  596.      privileges in the `db' table entry and then selectively restrict
  597.      them on a host-by-host basis using the `host' table entries.)
  598. After determining the database-specific privileges granted by the `db'
  599. and `host' table entries, the server adds them to the global privileges
  600. granted by the `user' table.  If the result allows the requested
  601. operation, access is granted.  Otherwise, the server checks the user's
  602. table and column privileges in the `tables_priv' and `columns_priv'
  603. tables and adds those to the user's privileges.  Access is allowed or
  604. denied based on the result.
  605. Expressed in boolean terms, the preceding description of how a user's
  606. privileges are calculated may be summarized like this:
  607.      global privileges
  608.      OR (database privileges AND host privileges)
  609.      OR table privileges
  610.      OR column privileges
  611. It may not be apparent why, if the global `user' entry privileges are
  612. initially found to be insufficient for the requested operation, the
  613. server adds those privileges to the database-, table-, and
  614. column-specific privileges later. The reason is that a request might
  615. require more than one type of privilege.  For example, if you execute
  616. an `INSERT ...  SELECT' statement, you need both *insert* and *select*
  617. privileges.  Your privileges might be such that the `user' table entry
  618. grants one privilege and the `db' table entry grants the other.  In
  619. this case, you have the necessary privileges to perform the request,
  620. but the server cannot tell that from either table by itself; the
  621. privileges granted by the entries in both tables must be combined.
  622. The `host' table can be used to maintain a list of secure servers.
  623. At TcX, the `host' table contains a list of all machines on the local
  624. network. These are granted all privileges.
  625. You can also use the `host' table to indicate hosts that are _not_
  626. secure.  Suppose you have a machine `public.your.domain' that is located
  627. in a public area that you do not consider secure.  You can allow access
  628. to all hosts on your network except that machine by using `host' table
  629. entries like this:
  630.      +--------------------+----+-
  631.      | Host               | Db | ...
  632.      +--------------------+----+-
  633.      | public.your.domain | %  | ... (all privileges set to 'N')
  634.      | %.your.domain      | %  | ... (all privileges set to 'Y')
  635.      +--------------------+----+-
  636. Naturally, you should always test your entries in the grant tables (for
  637. example, using `mysqlaccess') to make sure your access privileges are
  638. actually set up the way you think they are.
  639. When Privilege Changes Take Effect
  640. ==================================
  641. When `mysqld' starts, all grant table contents are read into memory and
  642. become effective at that point.
  643. Modifications to the grant tables that you perform using `GRANT',
  644. `REVOKE', or `SET PASSWORD' are noticed by the server immediately.
  645. If you modify the grant tables manually (using `INSERT', `UPDATE',
  646. etc.), you should execute a `FLUSH PRIVILEGES' statement or run
  647. `mysqladmin flush-privileges' or `mysqladmin reload' to tell the server
  648. to reload the grant tables.  Otherwise your changes will have _no
  649. effect_ until you restart the server. If you change the grant tables
  650. manually but forget to reload the privileges, you will be wondering why
  651. your changes don't seem to make any difference!
  652. When the server notices that the grant tables have been changed,
  653. existing client connections are affected as follows:
  654.    * Table and column privilege changes take effect with the client's
  655.      next request.
  656.    * Database privilege changes take effect at the next `USE db_name'
  657.      command.
  658. Global privilege changes and password changes take effect the next time
  659. the client connects.
  660. Setting Up the Initial MySQL Privileges
  661. =======================================
  662. After installing *MySQL*, you set up the initial access privileges by
  663. running `scripts/mysql_install_db'.  *Note Quick install::.  The
  664. `mysql_install_db' script starts up the `mysqld' server, then
  665. initializes the grant tables to contain the following set of privileges:
  666.    * The *MySQL* `root' user is created as a superuser who can do
  667.      anything.  Connections must be made from the local host.
  668.      *NOTE:* The initial `root' password is empty, so anyone can
  669.      connect as `root' _without a password_ and be granted all
  670.      privileges.
  671.    * An anonymous user is created that can do anything with databases
  672.      that have a name of `'test'' or starting with `'test_''.
  673.      Connections must be made from the local host.  This means any
  674.      local user can connect without a password and be treated as the
  675.      anonymous user.
  676.    * Other privileges are denied.  For example, normal users can't use
  677.      `mysqladmin shutdown' or `mysqladmin processlist'.
  678. *NOTE:* The default privileges are different for Windows.  *Note
  679. Windows running::.
  680. Because your installation is initially wide open, one of the first
  681. things you should do is specify a password for the *MySQL* `root' user.
  682. You can do this as follows (note that you specify the password using
  683. the `PASSWORD()' function):
  684.      shell> mysql -u root mysql
  685.      mysql> UPDATE user SET Password=PASSWORD('new_password')
  686.                 WHERE user='root';
  687.      mysql> FLUSH PRIVILEGES;
  688. You can, in *MySQL* Version 3.22 and above, use the `SET PASSWORD'
  689. statement:
  690.      shell> mysql -u root mysql
  691.      mysql> SET PASSWORD FOR root=PASSWORD('new_password');
  692. Another way to set the password is by using the `mysqladmin' command:
  693.      shell> mysqladmin -u root password new_password
  694. Only users with write/update access to the mysql database can change the
  695. password for others users.  All normal users (not anonymous ones) can
  696. only change their own password with either of the above commands or with
  697. `SET PASSWORD=PASSWORD('new password')'.
  698. Note that if you update the password in the `user' table directly using
  699. the first method, you must tell the server to re-read the grant tables
  700. (with `FLUSH PRIVILEGES'), because the change will go unnoticed
  701. otherwise.
  702. Once the `root' password has been set, thereafter you must supply that
  703. password when you connect to the server as `root'.
  704. You may wish to leave the `root' password blank so that you don't need
  705. to specify it while you perform additional setup or testing. However,
  706. be sure to set it before using your installation for any real
  707. production work.
  708. See the `scripts/mysql_install_db' script to see how it sets up the
  709. default privileges.  You can use this as a basis to see how to add
  710. other users.
  711. If you want the initial privileges to be different than those just
  712. described above, you can modify `mysql_install_db' before you run it.
  713. To re-create the grant tables completely, remove all the `.frm',
  714. `.MYI', and `.MYD' files in the directory containing the `mysql'
  715. database.  (This is the directory named `mysql' under the database
  716. directory, which is listed when you run `mysqld --help'.) Then run the
  717. `mysql_install_db' script, possibly after editing it first to have the
  718. privileges you want.
  719. *NOTE:* For *MySQL* versions older than Version 3.22.10, you should NOT
  720. delete the `.frm' files.  If you accidentally do this, you should copy
  721. them back from your *MySQL* distribution before running
  722. `mysql_install_db'.
  723. Adding New User Privileges to MySQL
  724. ===================================
  725. You can add users two different ways: by using `GRANT' statements or by
  726. manipulating the *MySQL* grant tables directly.  The preferred method
  727. is to use `GRANT' statements, because they are more concise and less
  728. error-prone.
  729. The examples below show how to use the `mysql' client to set up new
  730. users.  These examples assume that privileges are set up according to
  731. the defaults described in the previous section.  This means that to
  732. make changes, you must be on the same machine where `mysqld' is
  733. running, you must connect as the *MySQL* `root' user, and the `root'
  734. user must have the *insert* privilege for the `mysql' database and the
  735. *reload* administrative privilege.  Also, if you have changed the
  736. `root' user password, you must specify it for the `mysql' commands
  737. below.
  738. You can add new users by issuing `GRANT' statements:
  739.      shell> mysql --user=root mysql
  740.      mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
  741.                 IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
  742.      mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
  743.                 IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
  744.      mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
  745.      mysql> GRANT USAGE ON *.* TO dummy@localhost;
  746. These `GRANT' statements set up three new users:
  747. `monty'
  748.      A full superuser who can connect to the server from anywhere, but
  749.      who must use a password `'some_pass'' to do so.  Note that we must
  750.      issue `GRANT' statements for both `monty@localhost' and
  751.      `monty@"%"'.  If we don't add the entry with `localhost', the
  752.      anonymous user entry for `localhost' that is created by
  753.      `mysql_install_db' will take precedence when we connect from the
  754.      local host, because it has a more specific `Host' field value and
  755.      thus comes earlier in the `user' table sort order.
  756. `admin'
  757.      A user who can connect from `localhost' without a password and who
  758.      is granted the *reload* and *process* administrative privileges.
  759.      This allows the user to execute the `mysqladmin reload',
  760.      `mysqladmin refresh', and `mysqladmin flush-*' commands, as well as
  761.      `mysqladmin processlist' .  No database-related privileges are
  762.      granted.  (They can be granted later by issuing additional `GRANT'
  763.      statements.)
  764. `dummy'
  765.      A user who can connect without a password, but only from the local
  766.      host.  The global privileges are all set to `'N'' -- the `USAGE'
  767.      privilege type allows you to create a user with no privileges.  It
  768.      is assumed that you will grant database-specific privileges later.
  769. You can also add the same user access information directly by issuing
  770. `INSERT' statements and then telling the server to reload the grant
  771. tables:
  772.      shell> mysql --user=root mysql
  773.      mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),
  774.                      'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
  775.      mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),
  776.                      'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
  777.      mysql> INSERT INTO user SET Host='localhost',User='admin',
  778.                       Reload_priv='Y', Process_priv='Y';
  779.      mysql> INSERT INTO user (Host,User,Password)
  780.                              VALUES('localhost','dummy','');
  781.      mysql> FLUSH PRIVILEGES;
  782. Depending on your *MySQL* version, you may have to use a different
  783. number of `'Y'' values above (versions prior to Version 3.22.11 had
  784. fewer privilege columns).  For the `admin' user, the more readable
  785. extended `INSERT' syntax that is available starting with Version
  786. 3.22.11 is used.
  787. Note that to set up a superuser, you need only create a `user' table
  788. entry with the privilege fields set to `'Y''.  No `db' or `host' table
  789. entries are necessary.
  790. The privilege columns in the `user' table were not set explicitly in the
  791. last `INSERT' statement (for the `dummy' user), so those columns are
  792. assigned the default value of `'N''.  This is the same thing that
  793. `GRANT USAGE' does.
  794. The following example adds a user `custom' who can connect from hosts
  795. `localhost', `server.domain', and `whitehouse.gov'.  He wants to access
  796. the `bankaccount' database only from `localhost', the `expenses'
  797. database only from `whitehouse.gov', and the `customer' database from
  798. all three hosts.  He wants to use the password `stupid' from all three
  799. hosts.
  800. To set up this user's privileges using `GRANT' statements, run these
  801. commands:
  802.      shell> mysql --user=root mysql
  803.      mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  804.                 ON bankaccount.*
  805.                 TO custom@localhost
  806.                 IDENTIFIED BY 'stupid';
  807.      mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  808.                 ON expenses.*
  809.                 TO custom@whitehouse.gov
  810.                 IDENTIFIED BY 'stupid';
  811.      mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  812.                 ON customer.*
  813.                 TO custom@'%'
  814.                 IDENTIFIED BY 'stupid';
  815. To set up the user's privileges by modifying the grant tables directly,
  816. run these commands (note the `FLUSH PRIVILEGES' at the end):
  817.      shell> mysql --user=root mysql
  818.      mysql> INSERT INTO user (Host,User,Password)
  819.             VALUES('localhost','custom',PASSWORD('stupid'));
  820.      mysql> INSERT INTO user (Host,User,Password)
  821.             VALUES('server.domain','custom',PASSWORD('stupid'));
  822.      mysql> INSERT INTO user (Host,User,Password)
  823.             VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
  824.      mysql> INSERT INTO db
  825.             (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
  826.              Create_priv,Drop_priv)
  827.             VALUES
  828.             ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
  829.      mysql> INSERT INTO db
  830.             (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
  831.              Create_priv,Drop_priv)
  832.             VALUES
  833.             ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
  834.      mysql> INSERT INTO db
  835.             (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
  836.              Create_priv,Drop_priv)
  837.             VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
  838.      mysql> FLUSH PRIVILEGES;
  839. The first three `INSERT' statements add `user' table entries that allow
  840. user `custom' to connect from the various hosts with the given
  841. password, but grant no permissions to him (all privileges are set to the
  842. default value of `'N'').  The next three `INSERT' statements add `db'
  843. table entries that grant privileges to `custom' for the `bankaccount',
  844. `expenses', and `customer' databases, but only when accessed from the
  845. proper hosts.  As usual, when the grant tables are modified directly,
  846. the server must be told to reload them (with `FLUSH PRIVILEGES') so
  847. that the privilege changes take effect.
  848. If you want to give a specific user access from any machine in a given
  849. domain, you can issue a `GRANT' statement like the following:
  850.      mysql> GRANT ...
  851.                 ON *.*
  852.                 TO myusername@"%.mydomainname.com"
  853.                 IDENTIFIED BY 'mypassword';
  854. To do the same thing by modifying the grant tables directly, do this:
  855.      mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
  856.                 PASSWORD('mypassword'),...);
  857.      mysql> FLUSH PRIVILEGES;
  858. You can also use `xmysqladmin', `mysql_webadmin', and even `xmysql' to
  859. insert, change, and update values in the grant tables.  You can find
  860. these utilities in the Contrib directory of the *MySQL* Website
  861. (http://www.mysql.com/Downloads/Contrib/).
  862. Setting Up Passwords
  863. ====================
  864. In most cases you should use `GRANT' to set up your users/passwords, so
  865. the following only applies for advanced users. *Note `GRANT': GRANT.
  866. The examples in the preceding sections illustrate an important
  867. principle: when you store a non-empty password using `INSERT' or
  868. `UPDATE' statements, you must use the `PASSWORD()' function to encrypt
  869. it.  This is because the `user' table stores passwords in encrypted
  870. form, not as plaintext.  If you forget that fact, you are likely to
  871. attempt to set passwords like this:
  872.      shell> mysql -u root mysql
  873.      mysql> INSERT INTO user (Host,User,Password)
  874.             VALUES('%','jeffrey','biscuit');
  875.      mysql> FLUSH PRIVILEGES;
  876. The result is that the plaintext value `'biscuit'' is stored as the
  877. password in the `user' table.  When the user `jeffrey' attempts to
  878. connect to the server using this password, the `mysql' client encrypts
  879. it with `PASSWORD()' and sends the result to the server.  The server
  880. compares the value in the `user' table (the encrypted value of
  881. `'biscuit'') to the encrypted password (which is _not_ `'biscuit'').
  882. The comparison fails and the server rejects the connection:
  883.      shell> mysql -u jeffrey -pbiscuit test
  884.      Access denied
  885. Passwords must be encrypted when they are inserted in the `user' table,
  886. so the `INSERT' statement should have been specified like this instead:
  887.      mysql> INSERT INTO user (Host,User,Password)
  888.             VALUES('%','jeffrey',PASSWORD('biscuit'));
  889. You must also use the `PASSWORD()' function when you use `SET PASSWORD'
  890. statements:
  891.      mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
  892. If you set passwords using the `GRANT ... IDENTIFIED BY' statement or
  893. the `mysqladmin password' command, the `PASSWORD()' function is
  894. unnecessary.  They both take care of encrypting the password for you,
  895. so you would specify a password of `'biscuit'' like this:
  896.      mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
  897. or
  898.      shell> mysqladmin -u jeffrey password biscuit
  899. *NOTE:* `PASSWORD()' does not perform password encryption in the same
  900. way that Unix passwords are encrypted.  You should not assume that if
  901. your Unix password and your *MySQL* password are the same, that
  902. `PASSWORD()' will result in the same encrypted value as is stored in the
  903. Unix password file. *Note User names::.
  904. Causes of `Access denied' Errors
  905. ================================
  906. If you encounter `Access denied' errors when you try to connect to the
  907. *MySQL* server, the list below indicates some courses of action you can
  908. take to correct the problem:
  909.    * After installing *MySQL*, did you run the `mysql_install_db'
  910.      script to set up the initial grant table contents?  If not, do so.
  911.      *Note Default privileges::.  Test the initial privileges by
  912.      executing this command:
  913.           shell> mysql -u root test
  914.      The server should let you connect without error.  You should also
  915.      make sure you have a file `user.MYD' in the *MySQL* database
  916.      directory.  Ordinarily, this is `PATH/var/mysql/user.MYD', where
  917.      `PATH' is the pathname to the *MySQL* installation root.
  918.    * After a fresh installation, you should connect to the server and
  919.      set up your users and their access permissions:
  920.           shell> mysql -u root mysql
  921.      The server should let you connect because the *MySQL* `root' user
  922.      has no password initially.  That is also a security risk, so
  923.      setting the `root' password is something you should do while
  924.      you're setting up your other *MySQL* users.
  925.      If you try to connect as `root' and get this error:
  926.           Access denied for user: '@unknown' to database mysql
  927.      this means that you don't have an entry in the `user' table with a
  928.      `User' column value of `'root'' and that `mysqld' cannot resolve
  929.      the hostname for your client.  In this case, you must restart the
  930.      server with the `--skip-grant-tables' option and edit your
  931.      `/etc/hosts' or `windowshosts' file to add an entry for your
  932.      host.
  933.    * If you get an error like the following:
  934.           shell> mysqladmin -u root -pxxxx ver
  935.           Access denied for user: 'root@localhost' (Using password: YES)
  936.      It means that you are using a wrong password. *Note Passwords::.
  937.      If you have forgot the root password, you can restart `mysqld' with
  938.      `--skip-grant-tables' to change the password. You can find more
  939.      about this option later on in this manual section.
  940.      If you get the above error even if you haven't specified a
  941.      password, this means that you a wrong password in some `my.ini'
  942.      file. *Note Option files::.  You can avoid using option files with
  943.      the `--no-defaults' option, as follows:
  944.           shell> mysqladmin --no-defaults -u root ver
  945.    * If you updated an existing *MySQL* installation from a version
  946.      earlier than Version 3.22.11 to Version 3.22.11 or later, did you
  947.      run the `mysql_fix_privilege_tables' script?  If not, do so.  The
  948.      structure of the grant tables changed with *MySQL* Version 3.22.11
  949.      when the `GRANT' statement became functional.
  950.    * If your privileges seem to have changed in the middle of a
  951.      session, it may be that a superuser has changed them.  Reloading
  952.      the grant tables affects new client connections, but it also
  953.      affects existing connections as indicated in *Note Privilege
  954.      changes::.
  955.    * If you can't get your password to work, remember that you must use
  956.      the `PASSWORD()' function if you set the password with the
  957.      `INSERT', `UPDATE', or `SET PASSWORD' statements.  The
  958.      `PASSWORD()' function is unnecessary if you specify the password
  959.      using the `GRANT ... INDENTIFIED BY' statement or the `mysqladmin
  960.      password' command.  *Note Passwords::.
  961.    * `localhost' is a synonym for your local hostname, and is also the
  962.      default host to which clients try to connect if you specify no host
  963.      explicitly.  However, connections to `localhost' do not work if
  964.      you are running on a system that uses MIT-pthreads (`localhost'
  965.      connections are made using Unix sockets, which are not supported
  966.      by MIT-pthreads).  To avoid this problem on such systems, you
  967.      should use the `--host' option to name the server host explicitly.
  968.      This will make a TCP/IP connection to the `mysqld' server.  In
  969.      this case, you must have your real hostname in `user' table
  970.      entries on the server host.  (This is true even if you are running
  971.      a client program on the same host as the server.)
  972.    * If you get an `Access denied' error when trying to connect to the
  973.      database with `mysql -u user_name db_name', you may have a problem
  974.      with the `user' table. Check this by executing `mysql -u root
  975.      mysql' and issuing this SQL statement:
  976.           mysql> SELECT * FROM user;
  977.      The result should include an entry with the `Host' and `User'
  978.      columns matching your computer's hostname and your *MySQL* user
  979.      name.
  980.    * The `Access denied' error message will tell you who you are trying
  981.      to log in as, the host from which you are trying to connect, and
  982.      whether or not you were using a password. Normally, you should
  983.      have one entry in the `user' table that exactly matches the
  984.      hostname and user name that were given in the error message. For
  985.      example if you get an error message that contains `Using password:
  986.      NO', this means that you tried to login without an password.
  987.    * If you get the following error when you try to connect from a
  988.      different host than the one on which the *MySQL* server is
  989.      running, then there is no row in the `user' table that matches
  990.      that host:
  991.           Host ... is not allowed to connect to this MySQL server
  992.      You can fix this by using the command-line tool `mysql' (on the
  993.      server host!) to add a row to the `user', `db', or `host' table
  994.      for the user/hostname combination from which you are trying to
  995.      connect and then execute `mysqladmin flush-privileges'.  If you are
  996.      not running *MySQL* Version 3.22 and you don't know the IP number
  997.      or hostname of the machine from which you are connecting, you
  998.      should put an entry with `'%'' as the `Host' column value in the
  999.      `user' table and restart `mysqld' with the `--log' option on the
  1000.      server machine.  After trying to connect from the client machine,
  1001.      the information in the *MySQL* log will indicate how you really did
  1002.      connect.  (Then replace the `'%'' in the `user' table entry with
  1003.      the actual hostname that shows up in the log.  Otherwise, you'll
  1004.      have a system that is insecure.)
  1005.      Another reason for this error on Linux is that you are using a
  1006.      binary *MySQL* version that is compiled with a different glibc
  1007.      version than the one you are using.  In this case you should
  1008.      either upgrade your OS/glibc or download the source *MySQL*
  1009.      version and compile this yourself.  A source RPM is normally
  1010.      trivial to compile and install, so this isn't a big problem.
  1011.    * If you get an error message where the hostname is not shown or
  1012.      where the hostname is an IP, even if you try to connect with a
  1013.      hostname:
  1014.           shell> mysqladmin -u root -pxxxx -h some-hostname ver
  1015.           Access denied for user: 'root('Using password: YES)
  1016.      This means that *MySQL* got some error when trying to resolve the
  1017.      IP to a hostname.  In this case you can execute `mysqladmin
  1018.      flush-hosts' to reset the internal DNS cache. *Note DNS::.
  1019.      Some permanent solutions are:
  1020.         - Try to find out what is wrong with your DNS server and fix
  1021.           this.
  1022.         - Specify IPs instead of hostnames in the *MySQL* privilege
  1023.           tables.
  1024.         - Start mysqld with `--skip-name-resolve'.
  1025.         - Start mysqld with `--skip-host-cache'.
  1026.         - Connect to `localhost' if you are running the server and the
  1027.           client on the same machine.
  1028.         - Put the client machine names in `/etc/hosts'.
  1029.    * If `mysql -u root test' works but `mysql -h your_hostname -u root
  1030.      test' results in `Access denied', then you may not have the
  1031.      correct name for your host in the `user' table.  A common problem
  1032.      here is that the `Host' value in the user table entry specifies an
  1033.      unqualified hostname, but your system's name resolution routines
  1034.      return a fully qualified domain name (or vice-versa).  For
  1035.      example, if you have an entry with host `'tcx'' in the `user'
  1036.      table, but your DNS tells *MySQL* that your hostname is
  1037.      `'tcx.subnet.se'', the entry will not work. Try adding an entry to
  1038.      the `user' table that contains the IP number of your host as the
  1039.      `Host' column value.  (Alternatively, you could add an entry to the
  1040.      `user' table with a `Host' value that contains a wild card--for
  1041.      example, `'tcx.%''.  However, use of hostnames ending with `%' is
  1042.      _insecure_ and is _not_ recommended!)
  1043.    * If `mysql -u user_name test' works but `mysql -u user_name
  1044.      other_db_name' doesn't work, you don't have an entry for
  1045.      `other_db_name' listed in the `db' table.
  1046.    * If `mysql -u user_name db_name' works when executed on the server
  1047.      machine, but `mysql -u host_name -u user_name db_name' doesn't
  1048.      work when executed on another client machine, you don't have the
  1049.      client machine listed in the `user' table or the `db' table.
  1050.    * If you can't figure out why you get `Access denied', remove from
  1051.      the `user' table all entries that have `Host' values containing
  1052.      wild cards (entries that contain `%' or `_').  A very common error
  1053.      is to insert a new entry with `Host'=`'%'' and `User'=`'some
  1054.      user'', thinking that this will allow you to specify `localhost'
  1055.      to connect from the same machine.  The reason that this doesn't
  1056.      work is that the default privileges include an entry with
  1057.      `Host'=`'localhost'' and `User'=`'''.  Because that entry has a
  1058.      `Host' value `'localhost'' that is more specific than `'%'', it is
  1059.      used in preference to the new entry when connecting from
  1060.      `localhost'!  The correct procedure is to insert a second entry
  1061.      with `Host'=`'localhost'' and `User'=`'some_user'', or to remove
  1062.      the entry with `Host'=`'localhost'' and `User'=`'''.
  1063.    * If you get the following error, you may have a problem with the
  1064.      `db' or `host' table:
  1065.           Access to database denied
  1066.      If the entry selected from the `db' table has an empty value in the
  1067.      `Host' column, make sure there are one or more corresponding
  1068.      entries in the `host' table specifying which hosts the `db' table
  1069.      entry applies to.
  1070.      If you get the error when using the SQL commands `SELECT ...  INTO
  1071.      OUTFILE' or `LOAD DATA INFILE', your entry in the `user' table
  1072.      probably doesn't have the *file* privilege enabled.
  1073.    * Remember that client programs will use connection parameters
  1074.      specified in configuration files or environment variables.  *Note
  1075.      Environment variables::.  If a client seems to be sending the
  1076.      wrong default connection parameters when you don't specify them on
  1077.      the command line, check your environment and the `.my.cnf' file in
  1078.      your home directory.  You might also check the system-wide *MySQL*
  1079.      configuration files, though it is far less likely that client
  1080.      connection parameters will be specified there. *Note Option
  1081.      files::.  If you get `Access denied' when you run a client without
  1082.      any options, make sure you haven't specified an old password in
  1083.      any of your option files!  *Note Option files::.
  1084.    * If you make changes to the grant tables directly (using an
  1085.      `INSERT' or `UPDATE' statement) and your changes seem to be
  1086.      ignored, remember that you must issue a `FLUSH PRIVILEGES'
  1087.      statement or execute a `mysqladmin flush-privileges' command to
  1088.      cause the server to re-read the privilege tables.  Otherwise your
  1089.      changes have no effect until the next time the server is
  1090.      restarted.  Remember that after you set the `root' password with
  1091.      an `UPDATE' command, you won't need to specify it until after you
  1092.      flush the privileges, because the server won't know you've changed
  1093.      the password yet!
  1094.    * If you have access problems with a Perl, PHP, Python, or ODBC
  1095.      program, try to connect to the server with `mysql -u user_name
  1096.      db_name' or `mysql -u user_name -pyour_pass db_name'.  If you are
  1097.      able to connect using the `mysql' client, there is a problem with
  1098.      your program and not with the access privileges.  (Note that there
  1099.      is no space between `-p' and the password; you can also use the
  1100.      `--password=your_pass' syntax to specify the password. If you use
  1101.      the `-p' option alone, MySQL will prompt you for the password.)
  1102.    * For testing, start the `mysqld' daemon with the
  1103.      `--skip-grant-tables' option.  Then you can change the *MySQL*
  1104.      grant tables and use the `mysqlaccess' script to check whether or
  1105.      not your modifications have the desired effect.  When you are
  1106.      satisfied with your changes, execute `mysqladmin flush-privileges'
  1107.      to tell the `mysqld' server to start using the new grant tables.
  1108.      *Note:* Reloading the grant tables overrides the
  1109.      `--skip-grant-tables' option.  This allows you to tell the server
  1110.      to begin using the grant tables again without bringing it down and
  1111.      restarting it.
  1112.    * If everything else fails, start the `mysqld' daemon with a
  1113.      debugging option (for example, `--debug=d,general,query'). This
  1114.      will print host and user information about attempted connections,
  1115.      as well as information about each command issued. *Note Debugging
  1116.      server::.
  1117.    * If you have any other problems with the *MySQL* grant tables and
  1118.      feel you must post the problem to the mailing list, always provide
  1119.      a dump of the *MySQL* grant tables. You can dump the tables with
  1120.      the `mysqldump mysql' command. As always, post your problem using
  1121.      the `mysqlbug' script.  *Note Bug reports::.  In some cases you
  1122.      may need to restart `mysqld' with `--skip-grant-tables' to run
  1123.      `mysqldump'.
  1124. MySQL Language Reference
  1125. ************************
  1126. Literals: How to Write Strings and Numbers
  1127. ==========================================
  1128. Strings
  1129. -------
  1130. A string is a sequence of characters, surrounded by either single quote
  1131. (`'') or double quote (`"') characters (only the single quote if you
  1132. run in ANSI mode).  Examples:
  1133.      'a string'
  1134.      "another string"
  1135. Within a string, certain sequences have special meaning.  Each of these
  1136. sequences begins with a backslash (`'), known as the _escape
  1137. character_.  *MySQL* recognizes the following escape sequences:
  1138. `'
  1139.      An ASCII 0 (`NUL') character.
  1140. `n'
  1141.      A newline character.
  1142. `t'
  1143.      A tab character.
  1144. `r'
  1145.      A carriage return character.
  1146. `b'
  1147.      A backspace character.
  1148. `''
  1149.      A single quote (`'') character.
  1150. `"'
  1151.      A double quote (`"') character.
  1152. `\'
  1153.      A backslash (`') character.
  1154. `%'
  1155.      A `%' character. This is used to search for literal instances of
  1156.      `%' in contexts where `%' would otherwise be interpreted as a
  1157.      wild-card character. *Note String comparison functions::.
  1158. `_'
  1159.      A `_' character. This is used to search for literal instances of
  1160.      `_' in contexts where `_' would otherwise be interpreted as a
  1161.      wild-card character. *Note String comparison functions::.
  1162. Note that if you use `%' or `_' in some string contexts, these will
  1163. return the strings `%' and `_' and not `%' and `_'.
  1164. There are several ways to include quotes within a string:
  1165.    * A `'' inside a string quoted with `'' may be written as `'''.
  1166.    * A `"' inside a string quoted with `"' may be written as `""'.
  1167.    * You can precede the quote character with an escape character (`').
  1168.    * A `'' inside a string quoted with `"' needs no special treatment
  1169.      and need not be doubled or escaped.  In the same way, `"' inside a
  1170.      string quoted with `'' needs no special treatment.
  1171. The `SELECT' statements shown below demonstrate how quoting and
  1172. escaping work:
  1173.      mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', ''hello';
  1174.      +-------+---------+-----------+--------+--------+
  1175.      | hello | "hello" | ""hello"" | hel'lo | 'hello |
  1176.      +-------+---------+-----------+--------+--------+
  1177.      
  1178.      mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", ""hello";
  1179.      +-------+---------+-----------+--------+--------+
  1180.      | hello | 'hello' | ''hello'' | hel"lo | "hello |
  1181.      +-------+---------+-----------+--------+--------+
  1182.      
  1183.      mysql> SELECT "ThisnIsnFournlines";
  1184.      +--------------------+
  1185.      | This
  1186.      Is
  1187.      Four
  1188.      lines |
  1189.      +--------------------+
  1190. If you want to insert binary data into a `BLOB' column, the following
  1191. characters must be represented by escape sequences:
  1192. `NUL'
  1193.      ASCII 0. You should represent this by `' (a backslash and an
  1194.      ASCII `0' character).
  1195. `'
  1196.      ASCII 92, backslash.  Represent this by `\'.
  1197. `''
  1198.      ASCII 39, single quote.  Represent this by `''.
  1199. `"'
  1200.      ASCII 34, double quote.  Represent this by `"'.
  1201. If you write C code, you can use the C API function
  1202. `mysql_escape_string()' to escape characters for the `INSERT'
  1203. statement.  *Note C API function overview::.  In Perl, you can use the
  1204. `quote' method of the `DBI' package to convert special characters to
  1205. the proper escape sequences.  *Note Perl `DBI' Class: Perl DBI Class.
  1206. You should use an escape function on any string that might contain any
  1207. of the special characters listed above!
  1208. Numbers
  1209. -------
  1210. Integers are represented as a sequence of digits. Floats use `.' as a
  1211. decimal separator.  Either type of number may be preceded by `-' to
  1212. indicate a negative value.
  1213. Examples of valid integers:
  1214.      1221
  1215.      0
  1216.      -32
  1217. Examples of valid floating-point numbers:
  1218.      294.42
  1219.      -32032.6809e+10
  1220.      148.00
  1221. An integer may be used in a floating-point context; it is interpreted
  1222. as the equivalent floating-point number.
  1223. Hexadecimal Values
  1224. ------------------
  1225. *MySQL* supports hexadecimal values.  In number context these act like
  1226. an integer (64-bit precision). In string context these act like a binary
  1227. string where each pair of hex digits is converted to a character:
  1228.      mysql> SELECT 0xa+0
  1229.             -> 10
  1230.      mysql> select 0x5061756c;
  1231.             -> Paul
  1232. Hexadecimal strings are often used by ODBC to give values for BLOB
  1233. columns.
  1234. `NULL' Values
  1235. -------------
  1236. The `NULL' value means "no data" and is different from values such as
  1237. `0' for numeric types or the empty string for string types.  *Note
  1238. Problems with `NULL': Problems with NULL.
  1239. `NULL' may be represented by `N' when using the text file import or
  1240. export formats (`LOAD DATA INFILE', `SELECT ... INTO OUTFILE').  *Note
  1241. `LOAD DATA': LOAD DATA.
  1242. Database, Table, Index, Column, and Alias Names
  1243. -----------------------------------------------
  1244. Database, table, index, column, and alias names all follow the same
  1245. rules in *MySQL*.
  1246. Note that the rules changed starting with *MySQL* Version 3.23.6 when we
  1247. introduced quoting of identifiers (database, table, and column names)
  1248. with ``'. `"' will also work to quote identifiers if you run in ANSI
  1249. mode. *Note ANSI mode::.
  1250. *Identifier**Max        *Allowed characters*
  1251.             length*     
  1252. Database    64          Any character that is allowed in a directory name
  1253.                         except `/'.
  1254. Table       64          Any character that is allowed in a file name,
  1255.                         except `/' or `.'.
  1256. Column      64          All characters.
  1257. Alias       255         All characters.
  1258. Note that in addition to the above, you can't have ASCII(0) or
  1259. ASCII(255) or the quoting character in an identifier.
  1260. Note that if the identifer is a restricted word or contains special
  1261. characters you must always quote it with ``' when you use it:
  1262.      SELECT * from `select` where `select`.id > 100;
  1263. In previous versions of *MySQL*, the name rules are as follows:
  1264.    * A name may consist of alphanumeric characters from the current
  1265.      character set and also `_' and `$'. The default character set is
  1266.      ISO-8859-1 Latin1; this may be changed with the
  1267.      `--default-character-set' option to `mysqld'.  *Note Character
  1268.      sets::.
  1269.    * A name may start with any character that is legal in a name.  In
  1270.      particular, a name may start with a number (this differs from many
  1271.      other database systems!).  However, a name cannot consist _only_
  1272.      of numbers.
  1273.    * You cannot use the `.' character in names because it is used to
  1274.      extend the format by which you can refer to columns (see
  1275.      immediately below).
  1276. It is recommended that you do not use names like `1e', because an
  1277. expression like `1e+1' is ambiguous. It may be interpreted as the
  1278. expression `1e + 1' or as the number `1e+1'.
  1279. In *MySQL* you can refer to a column using any of the following forms:
  1280. *Column reference*        *Meaning*
  1281. `col_name'                Column `col_name' from whichever table used in
  1282.                           the query contains a column of that name.
  1283. `tbl_name.col_name'       Column `col_name' from table `tbl_name' of the
  1284.                           current database.
  1285. `db_name.tbl_name.col_name'Column `col_name' from table `tbl_name' of the
  1286.                           database `db_name'.  This form is available in
  1287.                           *MySQL* Version 3.22 or later.
  1288. ``column_name`'           A column that is a keyword or contains special
  1289.                           characters.
  1290. You need not specify a `tbl_name' or `db_name.tbl_name' prefix for a
  1291. column reference in a statement unless the reference would be ambiguous.
  1292. For example, suppose tables `t1' and `t2' each contain a column `c',
  1293. and you retrieve `c' in a `SELECT' statement that uses both `t1' and
  1294. `t2'.  In this case, `c' is ambiguous because it is not unique among
  1295. the tables used in the statement, so you must indicate which table you
  1296. mean by writing `t1.c' or `t2.c'.  Similarly, if you are retrieving
  1297. from a table `t' in database `db1' and from a table `t' in database
  1298. `db2', you must refer to columns in those tables as `db1.t.col_name'
  1299. and `db2.t.col_name'.
  1300. The syntax `.tbl_name' means the table `tbl_name' in the current
  1301. database.  This syntax is accepted for ODBC compatibility, because some
  1302. ODBC programs prefix table names with a `.' character.
  1303. Case Sensitivity in Names
  1304. .........................
  1305. In *MySQL*, databases and tables correspond to directories and files
  1306. within those directories.  Consequently, the case sensitivity of the
  1307. underlying operating system determines the case sensitivity of database
  1308. and table names.  This means database and table names are case
  1309. sensitive in Unix and case insensitive in Windows. *Note Extensions to
  1310. ANSI::.
  1311. *NOTE:* Although database and table names are case insensitive for
  1312. Windows, you should not refer to a given database or table using
  1313. different cases within the same query.  The following query would not
  1314. work because it refers to a table both as `my_table' and as `MY_TABLE':
  1315.      mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
  1316. Column names are case insensitive in all cases.
  1317. Aliases on tables are case sensitive.  The following query would not
  1318. work because it refers to the alias both as `a' and as `A':
  1319.      mysql> SELECT col_name FROM tbl_name AS a
  1320.                 WHERE a.col_name = 1 OR A.col_name = 2;
  1321. Aliases on columns are case insensitive.
  1322. If you have a problem remembering the used cases for a table names,
  1323. adopt a consistent convention, such as always creating databases and
  1324. tables using lowercase names.
  1325. One way to avoid this problem is to start `mysqld' with `-O
  1326. lower_case_table_names=1'.
  1327. In this case *MySQL* will on Windows/NT convert all table names to
  1328. lower case on storage and lookup.  Note that you need to first convert
  1329. your old table names to lower case before starting `mysqld' with this
  1330. option.
  1331. User Variables
  1332. ==============
  1333. *MySQL* supports thread-specific variables with the `@variablename'
  1334. syntax.  A variable name may consist of alphanumeric characters from
  1335. the current character set and also `_', `$', and `.' . The default
  1336. character set is ISO-8859-1 Latin1; this may be changed with the
  1337. `--default-character-set' option to `mysqld'. *Note Character sets::.
  1338. Variables don't have to be initialized.  They contain `NULL' by default
  1339. and can store an integer, real, or string value.  All variables for a
  1340. thread are automatically freed when the thread exits.
  1341. You can set a variable with the `SET' syntax:
  1342.      SET @variable= { integer expression | real expression | string expression }
  1343.      [,@variable= ...].
  1344. You can also set a variable in an expression with the `@variable:=expr'
  1345. syntax:
  1346.      select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
  1347.      +----------------------+------+------+------+
  1348.      | @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
  1349.      +----------------------+------+------+------+
  1350.      |                    5 |    5 |    1 |    4 |
  1351.      +----------------------+------+------+------+
  1352. (We had to use the `:=' syntax here, because `=' was reserved for
  1353. comparisons.)
  1354. User variables may be used where expressions are allowed.  Note that
  1355. this does not currently include use in contexts where a number is
  1356. explicitly required, such as in the `LIMIT' clause of a `SELECT'
  1357. statement, or the `IGNORE number LINES' clause of a `LOAD DATA'
  1358. statement.
  1359. *NOTE:*  In a `SELECT' statement, each expression is only evaluated
  1360. when it's sent to the client.  This means that in the `HAVING', `GROUP
  1361. BY', or `ORDER BY' clause, you can't refer to an expression that
  1362. involves variables that are set in the `SELECT' part. For example, the
  1363. following statement will NOT work as expected:
  1364.      SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
  1365. The reason is that `@aa' will not contain the value of the current row,
  1366. but the value of `id' for the previous accepted row.
  1367. Column Types
  1368. ============
  1369. *MySQL* supports a number of column types, which may be grouped into
  1370. three categories: numeric types, date and time types, and string
  1371. (character) types.  This section first gives an overview of the types
  1372. available and summarizes the storage requirements for each column type,
  1373. then provides a more detailed description of the properties of the
  1374. types in each category.  The overview is intentionally brief.  The more
  1375. detailed descriptions should be consulted for additional information
  1376. about particular column types, such as the allowable formats in which
  1377. you can specify values.
  1378. The column types supported by *MySQL* are listed below.  The following
  1379. code letters are used in the descriptions:
  1380. `M'
  1381.      Indicates the maximum display size.  The maximum legal display
  1382.      size is 255.
  1383. `D'
  1384.      Applies to floating-point types and indicates the number of digits
  1385.      following the decimal point.  The maximum possible value is 30, but
  1386.      should be no greater than `M'-2.
  1387. Square brackets (`[' and `]') indicate parts of type specifiers that
  1388. are optional.
  1389. Note that if you specify `ZEROFILL' for a column, *MySQL* will
  1390. automatically add the `UNSIGNED' attribute to the column.
  1391. `TINYINT[(M)] [UNSIGNED] [ZEROFILL]'
  1392.      A very small integer. The signed range is `-128' to `127'. The
  1393.      unsigned range is `0' to `255'.
  1394. `SMALLINT[(M)] [UNSIGNED] [ZEROFILL]'
  1395.      A small integer. The signed range is `-32768' to `32767'. The
  1396.      unsigned range is `0' to `65535'.
  1397. `MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]'
  1398.      A medium-size integer. The signed range is `-8388608' to
  1399.      `8388607'. The unsigned range is `0' to `16777215'.
  1400. `INT[(M)] [UNSIGNED] [ZEROFILL]'
  1401.      A normal-size integer. The signed range is `-2147483648' to
  1402.      `2147483647'.  The unsigned range is `0' to `4294967295'.
  1403. `INTEGER[(M)] [UNSIGNED] [ZEROFILL]'
  1404.      This is a synonym for `INT'.
  1405. `BIGINT[(M)] [UNSIGNED] [ZEROFILL]'
  1406.      A large integer. The signed range is `-9223372036854775808' to
  1407.      `9223372036854775807'. The unsigned range is `0' to
  1408.      `18446744073709551615'.
  1409.      Some things you should be aware about `BIGINT' columns:
  1410.         * As all arithmetic is done using signed `BIGINT' or `DOUBLE'
  1411.           values, so you shouldn't use unsigned big integers larger than
  1412.           `9223372036854775807' (63 bits) except with bit functions! If
  1413.           you do that, some of the last digits in the result may be
  1414.           wrong because of rounding errors when converting the `BIGINT'
  1415.           to a `DOUBLE'.
  1416.         * You can always store an exact integer value in a `BIGINT'
  1417.           column by storing it as a string, as there is in this case
  1418.           there will be no intermediate double representation.
  1419.         * `-', `+', and `*' will use `BIGINT' arithmetic when both
  1420.           arguments are `INTEGER' values!  This means that if you
  1421.           multiply two big integers (or results from functions that
  1422.           return integers) you may get unexpected results when the
  1423.           result is larger than `9223372036854775807'.
  1424. `FLOAT(precision) [ZEROFILL]'
  1425.      A floating-point number. Cannot be unsigned.  `precision' can be
  1426.      `<=24' for a single-precision floating-point number and between 25
  1427.      and 53 for a double-precision floating-point number. These types
  1428.      are like the `FLOAT' and `DOUBLE' types described immediately
  1429.      below.  `FLOAT(X)' has the same range as the corresponding `FLOAT'
  1430.      and `DOUBLE' types, but the display size and number of decimals is
  1431.      undefined.
  1432.      In *MySQL* Version 3.23, this is a true floating-point value.  In
  1433.      earlier *MySQL* versions, `FLOAT(precision)' always has 2 decimals.
  1434.      Note that using `FLOAT' may give you some unexpected problems as
  1435.      all calculation in *MySQL* is done with double precision.  *Note
  1436.      No matching rows::.
  1437.      This syntax is provided for ODBC compatibility.
  1438. `FLOAT[(M,D)] [ZEROFILL]'
  1439.      A small (single-precision) floating-point number. Cannot be
  1440.      unsigned.  Allowable values are `-3.402823466E+38' to
  1441.      `-1.175494351E-38', `0', and `1.175494351E-38' to
  1442.      `3.402823466E+38'.  The M is the display width and D is the number
  1443.      of decimals.  `FLOAT' without an argument or with an argument of
  1444.      <= 24 stands for a single-precision floating-point number.
  1445. `DOUBLE[(M,D)] [ZEROFILL]'
  1446.      A normal-size (double-precision) floating-point number. Cannot be
  1447.      unsigned. Allowable values are `-1.7976931348623157E+308' to
  1448.      `-2.2250738585072014E-308', `0', and `2.2250738585072014E-308' to
  1449.      `1.7976931348623157E+308'.  The M is the display width and D is
  1450.      the number of decimals.  `DOUBLE' without an argument or
  1451.      `FLOAT(X)' where 25 <= X <= 53 stands for a double-precision
  1452.      floating-point number.
  1453. `DOUBLE PRECISION[(M,D)] [ZEROFILL]'
  1454. `REAL[(M,D)] [ZEROFILL]'
  1455.      These are synonyms for `DOUBLE'.
  1456. `DECIMAL[(M[,D])] [ZEROFILL]'
  1457.      An unpacked floating-point number.  Cannot be unsigned.  Behaves
  1458.      like a `CHAR' column: "unpacked" means the number is stored as a
  1459.      string, using one character for each digit of the value.  The
  1460.      decimal point and, for negative numbers, the `-' sign, are not
  1461.      counted in M (but space for these are reserved). If `D' is 0,
  1462.      values will have no decimal point or fractional part.  The maximum
  1463.      range of `DECIMAL' values is the same as for `DOUBLE', but the
  1464.      actual range for a given `DECIMAL' column may be constrained by
  1465.      the choice of `M' and `D'.
  1466.      If `D' is left out it's set to 0. If `M' is left out it's set to
  1467.      10.
  1468.      Note that in *MySQL* Version 3.22 the `M' argument had to includes
  1469.      the space needed for the sign and the decimal point.
  1470. `NUMERIC(M,D) [ZEROFILL]'
  1471.      This is a synonym for `DECIMAL'.
  1472. `DATE'
  1473.      A date.  The supported range is `'1000-01-01'' to `'9999-12-31''.
  1474.      *MySQL* displays `DATE' values in `'YYYY-MM-DD'' format, but
  1475.      allows you to assign values to `DATE' columns using either strings
  1476.      or numbers. *Note DATETIME::.
  1477. `DATETIME'
  1478.      A date and time combination.  The supported range is `'1000-01-01
  1479.      00:00:00'' to `'9999-12-31 23:59:59''.  *MySQL* displays
  1480.      `DATETIME' values in `'YYYY-MM-DD HH:MM:SS'' format, but allows you
  1481.      to assign values to `DATETIME' columns using either strings or
  1482.      numbers.  *Note DATETIME::.
  1483. `TIMESTAMP[(M)]'
  1484.      A timestamp.  The range is `'1970-01-01 00:00:00'' to sometime in
  1485.      the year `2037'.  *MySQL* displays `TIMESTAMP' values in
  1486.      `YYYYMMDDHHMMSS', `YYMMDDHHMMSS', `YYYYMMDD', or `YYMMDD' format,
  1487.      depending on whether `M' is `14' (or missing), `12', `8', or `6',
  1488.      but allows you to assign values to `TIMESTAMP' columns using
  1489.      either strings or numbers.  A `TIMESTAMP' column is useful for
  1490.      recording the date and time of an `INSERT' or `UPDATE' operation
  1491.      because it is automatically set to the date and time of the most
  1492.      recent operation if you don't give it a value yourself.  You can
  1493.      also set it to the current date and time by assigning it a `NULL'
  1494.      value.  *Note Date and time types::.
  1495.      A `TIMESTAMP' is always stored in 4 bytes.  The `M' argument only
  1496.      affects how the `TIMESTAMP' column is displayed.
  1497.      Note that `TIMESTAMP(X)' columns where X is 8 or 14 are reported to
  1498.      be numbers while other `TIMESTAMP(X)' columns are reported to be
  1499.      strings.  This is just to ensure that one can reliably dump and
  1500.      restore the table with these types!  *Note DATETIME::.
  1501. `TIME'
  1502.      A time.  The range is `'-838:59:59'' to `'838:59:59''.  *MySQL*
  1503.      displays `TIME' values in `'HH:MM:SS'' format, but allows you to
  1504.      assign values to `TIME' columns using either strings or numbers.
  1505.      *Note TIME::.
  1506. `YEAR[(2|4)]'
  1507.      A year in 2- or 4-digit format (default is 4-digit).  The
  1508.      allowable values are `1901' to `2155', `0000' in the 4-digit year
  1509.      format, and 1970-2069 if you use the 2-digit format (70-69).
  1510.      *MySQL* displays `YEAR' values in `YYYY' format, but allows you to
  1511.      assign values to `YEAR' columns using either strings or numbers.
  1512.      (The `YEAR' type is new in *MySQL* Version 3.22.). *Note YEAR::.
  1513. `[NATIONAL] CHAR(M) [BINARY]'
  1514.      A fixed-length string that is always right-padded with spaces to
  1515.      the specified length when stored. The range of `M' is 1 to 255
  1516.      characters.  Trailing spaces are removed when the value is
  1517.      retrieved. `CHAR' values are sorted and compared in
  1518.      case-insensitive fashion according to the default character set
  1519.      unless the `BINARY' keyword is given.
  1520.      `NATIONAL CHAR' (short form `NCHAR') is the ANSI SQL way to define
  1521.      that a CHAR column should use the default CHARACTER set.  This is
  1522.      the default in *MySQL*.
  1523.      `CHAR' is a shorthand for `CHARACTER'.
  1524.      *MySQL* allows you to create a column of type `CHAR(0)'. This is
  1525.      mainly useful when you have to be compliant with some old
  1526.      applications that depend on the existence of a column but that do
  1527.      not actually use the value.  This is also quite nice when you need
  1528.      a column that only can take 2 values: A `CHAR(0)', that is not
  1529.      defined as `NOT NULL', will only occupy one bit and can only take
  1530.      2 values: `NULL' or `""'. *Note CHAR::.
  1531. `[NATIONAL] VARCHAR(M) [BINARY]'
  1532.      A variable-length string.  *NOTE:* Trailing spaces are removed when
  1533.      the value is stored (this differs from the ANSI SQL
  1534.      specification). The range of `M' is 1 to 255 characters. `VARCHAR'
  1535.      values are sorted and compared in case-insensitive fashion unless
  1536.      the `BINARY' keyword is given. *Note Silent column changes::.
  1537.      `VARCHAR' is a shorthand for `CHARACTER VARYING'.  *Note CHAR::.
  1538. `TINYBLOB'
  1539. `TINYTEXT'
  1540.      A `BLOB' or `TEXT' column with a maximum length of 255 (2^8 - 1)
  1541.      characters. *Note Silent column changes::. *Note BLOB::.
  1542. `BLOB'
  1543. `TEXT'
  1544.      A `BLOB' or `TEXT' column with a maximum length of 65535 (2^16 - 1)
  1545.      characters. *Note Silent column changes::. *Note BLOB::.
  1546. `MEDIUMBLOB'
  1547. `MEDIUMTEXT'
  1548.      A `BLOB' or `TEXT' column with a maximum length of 16777215 (2^24
  1549.      - 1) characters. *Note Silent column changes::. *Note BLOB::.
  1550. `LONGBLOB'
  1551. `LONGTEXT'
  1552.      A `BLOB' or `TEXT' column with a maximum length of 4294967295
  1553.      (2^32 - 1) characters. *Note Silent column changes::.  Note that
  1554.      because the server/client protocol and MyISAM tables has currently
  1555.      a limit of 16M per communication packet / table row, you can't yet
  1556.      use this the whole range of this type. *Note BLOB::.
  1557. `ENUM('value1','value2',...)'
  1558.      An enumeration.  A string object that can have only one value,
  1559.      chosen from the list of values `'value1'', `'value2'', `...',
  1560.      `NULL' or the special `""' error value.  An `ENUM' can have a
  1561.      maximum of 65535 distinct values. *Note ENUM::.
  1562. `SET('value1','value2',...)'
  1563.      A set.  A string object that can have zero or more values, each of
  1564.      which must be chosen from the list of values `'value1'',
  1565.      `'value2'', `...' A `SET' can have a maximum of 64 members. *Note
  1566.      SET::.
  1567. Column Type Storage Requirements
  1568. --------------------------------
  1569. The storage requirements for each of the column types supported by
  1570. *MySQL* are listed below by category.
  1571. Storage requirements for numeric types
  1572. ......................................
  1573. *Column type*                        *Storage required*
  1574. `TINYINT'                            1 byte
  1575. `SMALLINT'                           2 bytes
  1576. `MEDIUMINT'                          3 bytes
  1577. `INT'                                4 bytes
  1578. `INTEGER'                            4 bytes
  1579. `BIGINT'                             8 bytes
  1580. `FLOAT(X)'                           4 if X <= 24 or 8 if 25 <= X <= 53
  1581. `FLOAT'                              4 bytes
  1582. `DOUBLE'                             8 bytes
  1583. `DOUBLE PRECISION'                   8 bytes
  1584. `REAL'                               8 bytes
  1585. `DECIMAL(M,D)'                       `M+2' bytes if D > 0, `M+1' bytes
  1586.                                      if D = 0 (`D'+2, if `M < D')
  1587. `NUMERIC(M,D)'                       `M+2' bytes if D > 0, `M+1' bytes
  1588.                                      if D = 0 (`D'+2, if `M < D')
  1589. Storage requirements for date and time types
  1590. ............................................
  1591. *Column type*                        *Storage required*
  1592. `DATE'                               3 bytes
  1593. `DATETIME'                           8 bytes
  1594. `TIMESTAMP'                          4 bytes
  1595. `TIME'                               3 bytes
  1596. `YEAR'                               1 byte
  1597. Storage requirements for string types
  1598. .....................................
  1599. *Column type*                        *Storage required*
  1600. `CHAR(M)'                            `M' bytes, `1 <= M <= 255'
  1601. `VARCHAR(M)'                         `L'+1 bytes, where `L <= M' and `1
  1602.                                      <= M <= 255'
  1603. `TINYBLOB', `TINYTEXT'               `L'+1 bytes, where `L' < 2^8
  1604. `BLOB', `TEXT'                       `L'+2 bytes, where `L' < 2^16
  1605. `MEDIUMBLOB', `MEDIUMTEXT'           `L'+3 bytes, where `L' < 2^24
  1606. `LONGBLOB', `LONGTEXT'               `L'+4 bytes, where `L' < 2^32
  1607. `ENUM('value1','value2',...)'        1 or 2 bytes, depending on the
  1608.                                      number of enumeration values (65535
  1609.                                      values maximum)
  1610. `SET('value1','value2',...)'         1, 2, 3, 4 or 8 bytes, depending on
  1611.                                      the number of set members (64
  1612.                                      members maximum)
  1613. `VARCHAR' and the `BLOB' and `TEXT' types are variable-length types,
  1614. for which the storage requirements depend on the actual length of
  1615. column values (represented by `L' in the preceding table), rather than
  1616. on the type's maximum possible size.  For example, a `VARCHAR(10)'
  1617. column can hold a string with a maximum length of 10 characters.  The
  1618. actual storage required is the length of the string (`L'), plus 1 byte
  1619. to record the length of the string.  For the string `'abcd'', `L' is 4
  1620. and the storage requirement is 5 bytes.
  1621. The `BLOB' and `TEXT' types require 1, 2, 3, or 4 bytes to record the
  1622. length of the column value, depending on the maximum possible length of
  1623. the type.  *Note BLOB::.
  1624. If a table includes any variable-length column types, the record format
  1625. will also be variable-length.  Note that when a table is created,
  1626. *MySQL* may, under certain conditions, change a column from a
  1627. variable-length type to a fixed-length type, or vice-versa.  *Note
  1628. Silent column changes::.
  1629. The size of an `ENUM' object is determined by the number of different
  1630. enumeration values.  One byte is used for enumerations with up to 255
  1631. possible values.  Two bytes are used for enumerations with up to 65535
  1632. values. *Note ENUM::.
  1633. The size of a `SET' object is determined by the number of different set
  1634. members.  If the set size is `N', the object occupies `(N+7)/8' bytes,
  1635. rounded up to 1, 2, 3, 4, or 8 bytes.  A `SET' can have a maximum of 64
  1636. members. *Note SET::.
  1637. Numeric Types
  1638. -------------
  1639. *MySQL* supports all of the ANSI/ISO SQL92 numeric types.  These types
  1640. include the exact numeric data types (`NUMERIC', `DECIMAL', `INTEGER',
  1641. and `SMALLINT'), as well as the approximate numeric data types
  1642. (`FLOAT', `REAL', and `DOUBLE PRECISION'). The keyword `INT' is a
  1643. synonym for `INTEGER', and the keyword `DEC' is a synonym for `DECIMAL'.
  1644. The `NUMERIC' and `DECIMAL' types are implemented as the same type by
  1645. *MySQL*, as permitted by the SQL92 standard.  They are used for values
  1646. for which it is important to preserve exact precision, for example with
  1647. monetary data.  When declaring a column of one of these types the
  1648. precision and scale can be (and usually is) specified; for example:
  1649.          salary DECIMAL(9,2)
  1650. In this example, `9' (`precision') represents the number of significant
  1651. decimal digits that will be stored for values, and `2' (`scale')
  1652. represents the number of digits that will be stored following the
  1653. decimal point.  In this case, therefore, the range of values that can
  1654. be stored in the `salary' column is from `-9999999.99' to `9999999.99'.
  1655. In ANSI/ISO SQL92, the syntax `DECIMAL(p)' is equivalent to
  1656. `DECIMAL(p,0)'.  Similarly, the syntax `DECIMAL' is equivalent to
  1657. `DECIMAL(p,0)', where the implementation is allowed to decide the value
  1658. of `p'.  *MySQL* does not currently support either of these variant
  1659. forms of the `DECIMAL'/`NUMERIC' data types.  This is not generally a
  1660. serious problem, as the principal benefits of these types derive from
  1661. the ability to control both precision and scale explicitly.
  1662. `DECIMAL' and `NUMERIC' values are stored as strings, rather than as
  1663. binary floating-point numbers, in order to preserve the decimal
  1664. precision of those values.  One character is used for each digit of the
  1665. value, the decimal point (if `scale' > 0), and the `-' sign (for
  1666. negative numbers).  If `scale' is 0, `DECIMAL' and `NUMERIC' values
  1667. contain no decimal point or fractional part.
  1668. The maximum range of `DECIMAL' and `NUMERIC' values is the same as for
  1669. `DOUBLE', but the actual range for a given `DECIMAL' or `NUMERIC'
  1670. column can be constrained by the `precision' or `scale' for a given
  1671. column.  When such a column is assigned a value with more digits
  1672. following the decimal point than are allowed by the specified `scale',
  1673. the value is rounded to that `scale'.  When a `DECIMAL' or `NUMERIC'
  1674. column is assigned a value whose magnitude exceeds the range implied by
  1675. the specified (or defaulted) `precision' and `scale', *MySQL* stores
  1676. the value representing the corresponding end point of that range.
  1677. As an extension to the ANSI/ISO SQL92 standard, *MySQL* also supports
  1678. the integral types `TINYINT', `MEDIUMINT', and `BIGINT' as listed in
  1679. the tables above.  Another extension is supported by *MySQL* for
  1680. optionally specifying the display width of an integral value in
  1681. parentheses following the base keyword for the type (for example,
  1682. `INT(4)').  This optional width specification is used to left-pad the
  1683. display of values whose width is less than the width specified for the
  1684. column, but does not constrain the range of values that can be stored
  1685. in the column, nor the number of digits that will be displayed for
  1686. values whose width exceeds that specified for the column.  When used in
  1687. conjunction with the optional extension attribute `ZEROFILL', the
  1688. default padding of spaces is replaced with zeroes.  For example, for a
  1689. column declared as `INT(5) ZEROFILL', a value of `4' is retrieved as
  1690. `00004'.  Note that if you store larger values than the display width
  1691. in an integer column, you may experience problems when *MySQL*
  1692. generates temporary tables for some complicated joins, as in these
  1693. cases *MySQL* trusts that the data did fit into the original column
  1694. width.
  1695. All integral types can have an optional (non-standard) attribute
  1696. `UNSIGNED'.  Unsigned values can be used when you want to allow only
  1697. positive numbers in a column and you need a little bigger numeric range
  1698. for the column.
  1699. The `FLOAT' type is used to represent approximate numeric data types.
  1700. The ANSI/ISO SQL92 standard allows an optional specification of the
  1701. precision (but not the range of the exponent) in bits following the
  1702. keyword `FLOAT' in parentheses.  The *MySQL* implementation also
  1703. supports this optional precision specification.  When the keyword
  1704. `FLOAT' is used for a column type without a precision specification,
  1705. *MySQL* uses four bytes to store the values.  A variant syntax is also
  1706. supported, with two numbers given in parentheses following the `FLOAT'
  1707. keyword.  With this option, the first number continues to represent the
  1708. storage requirements for the value in bytes, and the second number
  1709. specifies the number of digits to be stored and displayed following the
  1710. decimal point (as with `DECIMAL' and `NUMERIC').  When *MySQL* is asked
  1711. to store a number for such a column with more decimal digits following
  1712. the decimal point than specified for the column, the value is rounded
  1713. to eliminate the extra digits when the value is stored.
  1714. The `REAL' and `DOUBLE PRECISION' types do not accept precision
  1715. specifications.  As an extension to the ANSI/ISO SQL92 standard,
  1716. *MySQL* recognizes `DOUBLE' as a synonym for the `DOUBLE PRECISION'
  1717. type.  In contrast with the standard's requirement that the precision
  1718. for `REAL' be smaller than that used for `DOUBLE PRECISION', *MySQL*
  1719. implements both as 8-byte double-precision floating-point values (when
  1720. not running in "ANSI mode").  For maximum portability, code requiring
  1721. storage of approximate numeric data values should use `FLOAT' or
  1722. `DOUBLE PRECISION' with no specification of precision or number of
  1723. decimal points.
  1724. When asked to store a value in a numeric column that is outside the
  1725. column type's allowable range, *MySQL* clips the value to the
  1726. appropriate endpoint of the range and stores the resulting value
  1727. instead.
  1728. For example, the range of an `INT' column is `-2147483648' to
  1729. `2147483647'.  If you try to insert `-9999999999' into an `INT' column,
  1730. the value is clipped to the lower endpoint of the range, and
  1731. `-2147483648' is stored instead. Similarly, if you try to insert
  1732. `9999999999', `2147483647' is stored instead.
  1733. If the `INT' column is `UNSIGNED', the size of the column's range is
  1734. the same but its endpoints shift up to `0' and `4294967295'.  If you
  1735. try to store `-9999999999' and `9999999999', the values stored in the
  1736. column become `0' and `4294967296'.
  1737. Conversions that occur due to clipping are reported as "warnings" for
  1738. `ALTER TABLE', `LOAD DATA INFILE', `UPDATE', and multi-row `INSERT'
  1739. statements.
  1740. Date and Time Types
  1741. -------------------
  1742. The date and time types are `DATETIME', `DATE', `TIMESTAMP', `TIME',
  1743. and `YEAR'.  Each of these has a range of legal values, as well as a
  1744. "zero" value that is used when you specify a really illegal value.
  1745. Note that *MySQL* allows you to store certain 'not strictly' legal date
  1746. values, for example `1999-11-31'.  The reason for this is that we think
  1747. it's the responsibility of the application to handle date checking, not
  1748. the SQL servers.  To make the date checking 'fast', *MySQL* only checks
  1749. that the month is in the range of 0-12 and the day is in the range of
  1750. 0-31. The above ranges are defined this way because *MySQL* allows you
  1751. to store, in a `DATE' or `DATETIME' column, dates where the day or
  1752. month-day is zero.  This is extremely useful for applications that need
  1753. to store a birth-date for which you don't know the exact date. In this
  1754. case you simply store the date like `1999-00-00' or `1999-01-00'.  (You
  1755. cannot expect to get a correct value from functions like `DATE_SUB()'
  1756. or `DATE_ADD' for dates like these.)
  1757. Here are some general considerations to keep in mind when working with
  1758. date and time types:
  1759.    * *MySQL* retrieves values for a given date or time type in a
  1760.      standard format, but it attempts to interpret a variety of formats
  1761.      for values that you supply (for example, when you specify a value
  1762.      to be assigned to or compared to a date or time type).
  1763.      Nevertheless, only the formats described in the following sections
  1764.      are supported.  It is expected that you will supply legal values,
  1765.      and unpredictable results may occur if you use values in other
  1766.      formats.
  1767.    * Although *MySQL* tries to interpret values in several formats, it
  1768.      always expects the year part of date values to be leftmost.  Dates
  1769.      must be given in year-month-day order (for example, `'98-09-04''),
  1770.      rather than in the month-day-year or day-month-year orders
  1771.      commonly used elsewhere (for example, `'09-04-98'', `'04-09-98'').
  1772.    * *MySQL* automatically converts a date or time type value to a
  1773.      number if the value is used in a numeric context, and vice versa.
  1774.    * When *MySQL* encounters a value for a date or time type that is
  1775.      out of range or otherwise illegal for the type (see the start of
  1776.      this section), it converts the value to the "zero" value for that
  1777.      type.  (The exception is that out-of-range `TIME' values are
  1778.      clipped to the appropriate endpoint of the `TIME' range.)  The
  1779.      table below shows the format of the "zero" value for each type:
  1780.      *Column type*        *"Zero" value*
  1781.      `DATETIME'           `'0000-00-00 00:00:00''
  1782.      `DATE'               `'0000-00-00''
  1783.      `TIMESTAMP'          `00000000000000' (length depends on display
  1784.                           size)
  1785.      `TIME'               `'00:00:00''
  1786.      `YEAR'               `0000'
  1787.    * The "zero" values are special, but you can store or refer to them
  1788.      explicitly using the values shown in the table.  You can also do
  1789.      this using the values `'0'' or `0', which are easier to write.
  1790.    * "Zero" date or time values used through *MyODBC* are converted
  1791.      automatically to `NULL' in *MyODBC* Version 2.50.12 and above,
  1792.      because ODBC can't handle such values.
  1793. Y2K Issues and Date Types
  1794. .........................
  1795. *MySQL* itself is Y2K-safe (*note Year 2000 compliance::), but input
  1796. values presented to *MySQL* may not be.  Any input containing 2-digit
  1797. year values is ambiguous, because the century is unknown.  Such values
  1798. must be interpreted into 4-digit form because *MySQL* stores years
  1799. internally using four digits.
  1800. For `DATETIME', `DATE', `TIMESTAMP', and `YEAR' types, *MySQL*
  1801. interprets dates with ambiguous year values using the following rules:
  1802.    * Year values in the range `00-69' are converted to `2000-2069'.
  1803.    * Year values in the range `70-99' are converted to `1970-1999'.
  1804. Remember that these rules provide only reasonable guesses as to what
  1805. your data mean.  If the heuristics used by *MySQL* don't produce the
  1806. correct values, you should provide unambiguous input containing 4-digit
  1807. year values.
  1808. `ORDER BY' will sort 2-digit `YEAR/DATE/DATETIME' types properly.
  1809. Note also that some functions like `MIN()' and `MAX()' will convert a
  1810. `TIMESTAMP/DATE' to a number. This means that a timestamp with a
  1811. 2-digit year will not work properly with these functions.  The fix in
  1812. this case is to convert the `TIMESTAMP/DATE' to 4-digit year format or
  1813. use something like `MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS))'.
  1814. The `DATETIME', `DATE', and `TIMESTAMP' Types
  1815. .............................................
  1816. The `DATETIME', `DATE', and `TIMESTAMP' types are related.  This
  1817. section describes their characteristics, how they are similar, and how
  1818. they differ.
  1819. The `DATETIME' type is used when you need values that contain both date
  1820. and time information.  *MySQL* retrieves and displays `DATETIME' values
  1821. in `'YYYY-MM-DD HH:MM:SS'' format.  The supported range is `'1000-01-01
  1822. 00:00:00'' to `'9999-12-31 23:59:59''.  ("Supported" means that
  1823. although earlier values might work, there is no guarantee that they
  1824. will.)
  1825. The `DATE' type is used when you need only a date value, without a time
  1826. part.  *MySQL* retrieves and displays `DATE' values in `'YYYY-MM-DD''
  1827. format.  The supported range is `'1000-01-01'' to `'9999-12-31''.
  1828. The `TIMESTAMP' column type provides a type that you can use to
  1829. automatically mark `INSERT' or `UPDATE' operations with the current
  1830. date and time.  If you have multiple `TIMESTAMP' columns, only the first
  1831. one is updated automatically.
  1832. Automatic updating of the first `TIMESTAMP' column occurs under any of
  1833. the following conditions:
  1834.    * The column is not specified explicitly in an `INSERT' or `LOAD
  1835.      DATA INFILE' statement.
  1836.    * The column is not specified explicitly in an `UPDATE' statement
  1837.      and some other column changes value.  (Note that an `UPDATE' that
  1838.      sets a column to the value it already has will not cause the
  1839.      `TIMESTAMP' column to be updated, because if you set a column to
  1840.      its current value, *MySQL* ignores the update for efficiency.)
  1841.    * You explicitly set the `TIMESTAMP' column to `NULL'.
  1842. `TIMESTAMP' columns other than the first may also be set to the current
  1843. date and time.  Just set the column to `NULL' or to `NOW()'.
  1844. You can set any `TIMESTAMP' column to a value different than the current
  1845. date and time by setting it explicitly to the desired value.  This is
  1846. true even for the first `TIMESTAMP' column.  You can use this property
  1847. if, for example, you want a `TIMESTAMP' to be set to the current date
  1848. and time when you create a row, but not to be changed whenever the row
  1849. is updated later:
  1850.    * Let *MySQL* set the column when the row is created.  This will
  1851.      initialize it to the current date and time.
  1852.    * When you perform subsequent updates to other columns in the row,
  1853.      set the `TIMESTAMP' column explicitly to its current value.
  1854. On the other hand, you may find it just as easy to use a `DATETIME'
  1855. column that you initialize to `NOW()' when the row is created and leave
  1856. alone for subsequent updates.
  1857. `TIMESTAMP' values may range from the beginning of 1970 to sometime in
  1858. the year 2037, with a resolution of one second.  Values are displayed as
  1859. numbers.
  1860. The format in which *MySQL* retrieves and displays `TIMESTAMP' values
  1861. depends on the display size, as illustrated by the table below.  The
  1862. `full' `TIMESTAMP' format is 14 digits, but `TIMESTAMP' columns may be
  1863. created with shorter display sizes:
  1864. *Column type*          *Display format*
  1865. `TIMESTAMP(14)'        `YYYYMMDDHHMMSS'
  1866. `TIMESTAMP(12)'        `YYMMDDHHMMSS'
  1867. `TIMESTAMP(10)'        `YYMMDDHHMM'
  1868. `TIMESTAMP(8)'         `YYYYMMDD'
  1869. `TIMESTAMP(6)'         `YYMMDD'
  1870. `TIMESTAMP(4)'         `YYMM'
  1871. `TIMESTAMP(2)'         `YY'
  1872. All `TIMESTAMP' columns have the same storage size, regardless of
  1873. display size.  The most common display sizes are 6, 8, 12, and 14.  You
  1874. can specify an arbitrary display size at table creation time, but
  1875. values of 0 or greater than 14 are coerced to 14.  Odd-valued sizes in
  1876. the range from 1 to 13 are coerced to the next higher even number.
  1877. You can specify `DATETIME', `DATE', and `TIMESTAMP' values using any of
  1878. a common set of formats:
  1879.    * As a string in either `'YYYY-MM-DD HH:MM:SS'' or `'YY-MM-DD
  1880.      HH:MM:SS'' format.  A "relaxed" syntax is allowed--any punctuation
  1881.      character may be used as the delimiter between date parts or time
  1882.      parts.  For example, `'98-12-31 11:30:45'', `'98.12.31 11+30+45'',
  1883.      `'98/12/31 11*30*45'', and `'98@12@31 11^30^45'' are equivalent.
  1884.    * As a string in either `'YYYY-MM-DD'' or `'YY-MM-DD'' format.  A
  1885.      "relaxed" syntax is allowed here, too.  For example, `'98-12-31'',
  1886.      `'98.12.31'', `'98/12/31'', and `'98@12@31'' are equivalent.
  1887.    * As a string with no delimiters in either `'YYYYMMDDHHMMSS'' or
  1888.      `'YYMMDDHHMMSS'' format, provided that the string makes sense as a
  1889.      date.  For example, `'19970523091528'' and `'970523091528'' are
  1890.      interpreted as `'1997-05-23 09:15:28'', but `'971122129015'' is
  1891.      illegal (it has a nonsensical minute part) and becomes `'0000-00-00
  1892.      00:00:00''.
  1893.    * As a string with no delimiters in either `'YYYYMMDD'' or `'YYMMDD''
  1894.      format, provided that the string makes sense as a date.  For
  1895.      example, `'19970523'' and `'970523'' are interpreted as
  1896.      `'1997-05-23'', but `'971332'' is illegal (it has nonsensical month
  1897.      and day parts) and becomes `'0000-00-00''.
  1898.    * As a number in either `YYYYMMDDHHMMSS' or `YYMMDDHHMMSS' format,
  1899.      provided that the number makes sense as a date.  For example,
  1900.      `19830905132800' and `830905132800' are interpreted as
  1901.      `'1983-09-05 13:28:00''.
  1902.    * As a number in either `YYYYMMDD' or `YYMMDD' format, provided that
  1903.      the number makes sense as a date.  For example, `19830905' and
  1904.      `830905' are interpreted as `'1983-09-05''.
  1905.    * As the result of a function that returns a value that is acceptable
  1906.      in a `DATETIME', `DATE', or `TIMESTAMP' context, such as `NOW()'
  1907.      or `CURRENT_DATE'.
  1908. Illegal `DATETIME', `DATE', or `TIMESTAMP' values are converted to the
  1909. "zero" value of the appropriate type (`'0000-00-00 00:00:00'',
  1910. `'0000-00-00'', or `00000000000000').
  1911. For values specified as strings that include date part delimiters, it
  1912. is not necessary to specify two digits for month or day values that are
  1913. less than `10'.  `'1979-6-9'' is the same as `'1979-06-09''.  Similarly,
  1914. for values specified as strings that include time part delimiters, it
  1915. is not necessary to specify two digits for hour, month, or second
  1916. values that are less than `10'.  `'1979-10-30 1:2:3'' is the same as
  1917. `'1979-10-30 01:02:03''.
  1918. Values specified as numbers should be 6, 8, 12, or 14 digits long.  If
  1919. the number is 8 or 14 digits long, it is assumed to be in `YYYYMMDD' or
  1920. `YYYYMMDDHHMMSS' format and that the year is given by the first 4
  1921. digits.  If the number is 6 or 12 digits long, it is assumed to be in
  1922. `YYMMDD' or `YYMMDDHHMMSS' format and that the year is given by the
  1923. first 2 digits.  Numbers that are not one of these lengths are
  1924. interpreted as though padded with leading zeros to the closest length.
  1925. Values specified as non-delimited strings are interpreted using their
  1926. length as given.  If the string is 8 or 14 characters long, the year is
  1927. assumed to be given by the first 4 characters.  Otherwise the year is
  1928. assumed to be given by the first 2 characters.  The string is
  1929. interpreted from left to right to find year, month, day, hour, minute,
  1930. and second values, for as many parts as are present in the string.
  1931. This means you should not use strings that have fewer than 6
  1932. characters.  For example, if you specify `'9903'', thinking that will
  1933. represent March, 1999, you will find that *MySQL* inserts a "zero" date
  1934. into your table.  This is because the year and month values are `99'
  1935. and `03', but the day part is missing (zero), so the value is not a
  1936. legal date.
  1937. `TIMESTAMP' columns store legal values using the full precision with
  1938. which the value was specified, regardless of the display size.  This has
  1939. several implications:
  1940.    * Always specify year, month, and day, even if your column types are
  1941.      `TIMESTAMP(4)' or `TIMESTAMP(2)'.  Otherwise, the value will not
  1942.      be a legal date and `0' will be stored.
  1943.    * If you use `ALTER TABLE' to widen a narrow `TIMESTAMP' column,
  1944.      information will be displayed that previously was "hidden".
  1945.    * Similarly, narrowing a `TIMESTAMP' column does not cause
  1946.      information to be lost, except in the sense that less information
  1947.      is shown when the values are displayed.
  1948.    * Although `TIMESTAMP' values are stored to full precision, the only
  1949.      function that operates directly on the underlying stored value is
  1950.      `UNIX_TIMESTAMP()'.  Other functions operate on the formatted
  1951.      retrieved value.  This means you cannot use functions such as
  1952.      `HOUR()' or `SECOND()' unless the relevant part of the `TIMESTAMP'
  1953.      value is included in the formatted value.  For example, the `HH'
  1954.      part of a `TIMESTAMP' column is not displayed unless the display
  1955.      size is at least 10, so trying to use `HOUR()' on shorter
  1956.      `TIMESTAMP' values produces a meaningless result.
  1957. You can to some extent assign values of one date type to an object of a
  1958. different date type.  However, there may be some alteration of the
  1959. value or loss of information:
  1960.    * If you assign a `DATE' value to a `DATETIME' or `TIMESTAMP'
  1961.      object, the time part of the resulting value is set to
  1962.      `'00:00:00'', because the `DATE' value contains no time
  1963.      information.
  1964.    * If you assign a `DATETIME' or `TIMESTAMP' value to a `DATE'
  1965.      object, the time part of the resulting value is deleted, because
  1966.      the `DATE' type stores no time information.
  1967.    * Remember that although `DATETIME', `DATE', and `TIMESTAMP' values
  1968.      all can be specified using the same set of formats, the types do
  1969.      not all have the same range of values.  For example, `TIMESTAMP'
  1970.      values cannot be earlier than `1970' or later than `2037'.  This
  1971.      means that a date such as `'1968-01-01'', while legal as a
  1972.      `DATETIME' or `DATE' value, is not a valid `TIMESTAMP' value and
  1973.      will be converted to `0' if assigned to such an object.
  1974. Be aware of certain pitfalls when specifying date values:
  1975.    * The relaxed format allowed for values specified as strings can be
  1976.      deceiving.  For example, a value such as `'10:11:12'' might look
  1977.      like a time value because of the `:' delimiter, but if used in a
  1978.      date context will be interpreted as the year `'2010-11-12''.  The
  1979.      value `'10:45:15'' will be converted to `'0000-00-00'' because
  1980.      `'45'' is not a legal month.
  1981.    * Year values specified as two digits are ambiguous, because the
  1982.      century is unknown.  *MySQL* interprets 2-digit year values using
  1983.      the following rules:
  1984.         - Year values in the range `00-69' are converted to `2000-2069'.
  1985.         - Year year values in the range `70-99' are converted to
  1986.           `1970-1999'.
  1987. The `TIME' Type
  1988. ...............
  1989. *MySQL* retrieves and displays `TIME' values in `'HH:MM:SS'' format (or
  1990. `'HHH:MM:SS'' format for large hours values).  `TIME' values may range
  1991. from `'-838:59:59'' to `'838:59:59''.  The reason the hours part may be
  1992. so large is that the `TIME' type may be used not only to represent a
  1993. time of day (which must be less than 24 hours), but also elapsed time
  1994. or a time interval between two events (which may be much greater than
  1995. 24 hours, or even negative).
  1996. You can specify `TIME' values in a variety of formats:
  1997.    * As a string in `'D HH:MM:SS.fraction'' format.  (Note that *MySQL*
  1998.      doesn't yet store the fraction for the time column).  One can also
  1999.      use one of the following "relaxed" syntax:
  2000.      `HH:MM:SS.fraction', `HH:MM:SS', `HH:MM', `D HH:MM:SS', `D HH:MM',
  2001.      `D HH' or `SS'.  Here `D' is days between 0-33.
  2002.    * As a string with no delimiters in `'HHMMSS'' format, provided that
  2003.      it makes sense as a time.  For example, `'101112'' is understood as
  2004.      `'10:11:12'', but `'109712'' is illegal (it has a nonsensical
  2005.      minute part) and becomes `'00:00:00''.
  2006.    * As a number in `HHMMSS' format, provided that it makes sense as a
  2007.      time.  For example, `101112' is understood as `'10:11:12''.  The
  2008.      following alternative formats are also understood: `SS',
  2009.      `MMSS',`HHMMSS', `HHMMSS.fraction'.  Note that *MySQL* doesn't yet
  2010.      store the fraction part.
  2011.    * As the result of a function that returns a value that is acceptable
  2012.      in a `TIME' context, such as `CURRENT_TIME'.
  2013. For `TIME' values specified as strings that include a time part
  2014. delimiter, it is not necessary to specify two digits for hours,
  2015. minutes, or seconds values that are less than `10'.  `'8:3:2'' is the
  2016. same as `'08:03:02''.
  2017. Be careful about assigning "short" `TIME' values to a `TIME' column.
  2018. Without semicolon, *MySQL* interprets values using the assumption that
  2019. the rightmost digits represent seconds. (*MySQL* interprets `TIME'
  2020. values as elapsed time rather than as time of day.) For example, you
  2021. might think of `'1112'' and `1112' as meaning `'11:12:00'' (12 minutes
  2022. after 11 o'clock), but *MySQL* interprets them as `'00:11:12'' (11
  2023. minutes, 12 seconds).  Similarly, `'12'' and `12' are interpreted as
  2024. `'00:00:12''.  `TIME' values with semicolon, instead, are always
  2025. treated as time of the day. That is `'11:12'' will mean `'11:12:00'',
  2026. not `'00:11:12''.
  2027. Values that lie outside the `TIME' range but are otherwise legal are
  2028. clipped to the appropriate endpoint of the range.  For example,
  2029. `'-850:00:00'' and `'850:00:00'' are converted to `'-838:59:59'' and
  2030. `'838:59:59''.
  2031. Illegal `TIME' values are converted to `'00:00:00''.  Note that because
  2032. `'00:00:00'' is itself a legal `TIME' value, there is no way to tell,
  2033. from a value of `'00:00:00'' stored in a table, whether the original
  2034. value was specified as `'00:00:00'' or whether it was illegal.
  2035. The `YEAR' Type
  2036. ...............
  2037. The `YEAR' type is a 1-byte type used for representing years.
  2038. *MySQL* retrieves and displays `YEAR' values in `YYYY' format.  The
  2039. range is `1901' to `2155'.
  2040. You can specify `YEAR' values in a variety of formats:
  2041.    * As a four-digit string in the range `'1901'' to `'2155''.
  2042.    * As a four-digit number in the range `1901' to `2155'.
  2043.    * As a two-digit string in the range `'00'' to `'99''.  Values in the
  2044.      ranges `'00'' to `'69'' and `'70'' to `'99'' are converted to
  2045.      `YEAR' values in the ranges `2000' to `2069' and `1970' to `1999'.
  2046.    * As a two-digit number in the range `1' to `99'.  Values in the
  2047.      ranges `1' to `69' and `70' to `99' are converted to `YEAR' values
  2048.      in the ranges `2001' to `2069' and `1970' to `1999'.  Note that
  2049.      the range for two-digit numbers is slightly different than the
  2050.      range for two-digit strings, because you cannot specify zero
  2051.      directly as a number and have it be interpreted as `2000'.  You
  2052.      _must_ specify it as a string `'0'' or `'00'' or it will be
  2053.      interpreted as `0000'.
  2054.    * As the result of a function that returns a value that is acceptable
  2055.      in a `YEAR' context, such as `NOW()'.
  2056. Illegal `YEAR' values are converted to `0000'.
  2057. String Types
  2058. ------------
  2059. The string types are `CHAR', `VARCHAR', `BLOB', `TEXT', `ENUM', and
  2060. `SET'.
  2061. The `CHAR' and `VARCHAR' Types
  2062. ..............................
  2063. The `CHAR' and `VARCHAR' types are similar, but differ in the way they
  2064. are stored and retrieved.
  2065. The length of a `CHAR' column is fixed to the length that you declare
  2066. when you create the table.  The length can be any value between 1 and
  2067. 255.  (As of *MySQL* Version 3.23, the length of `CHAR' may be 0 to
  2068. 255.)  When `CHAR' values are stored, they are right-padded with spaces
  2069. to the specified length.  When `CHAR' values are retrieved, trailing
  2070. spaces are removed.
  2071. Values in `VARCHAR' columns are variable-length strings.  You can
  2072. declare a `VARCHAR' column to be any length between 1 and 255, just as
  2073. for `CHAR' columns.  However, in contrast to `CHAR', `VARCHAR' values
  2074. are stored using only as many characters as are needed, plus one byte
  2075. to record the length.  Values are not padded; instead, trailing spaces
  2076. are removed when values are stored.  (This space removal differs from
  2077. the ANSI SQL specification.)
  2078. If you assign a value to a `CHAR' or `VARCHAR' column that exceeds the
  2079. column's maximum length, the value is truncated to fit.
  2080. The table below illustrates the differences between the two types of
  2081. columns by showing the result of storing various string values into
  2082. `CHAR(4)' and `VARCHAR(4)' columns:
  2083. *Value*        `CHAR(4)'   *Storage       `VARCHAR(4)'   *Storage required*
  2084.                            required*                     
  2085. `'''           `'    ''    4 bytes        `'''           1 byte
  2086. `'ab''         `'ab  ''    4 bytes        `'ab''         3 bytes
  2087. `'abcd''       `'abcd''    4 bytes        `'abcd''       5 bytes
  2088. `'abcdefgh''   `'abcd''    4 bytes        `'abcd''       5 bytes
  2089. The values retrieved from the `CHAR(4)' and `VARCHAR(4)' columns will
  2090. be the same in each case, because trailing spaces are removed from
  2091. `CHAR' columns upon retrieval.
  2092. Values in `CHAR' and `VARCHAR' columns are sorted and compared in
  2093. case-insensitive fashion, unless the `BINARY' attribute was specified
  2094. when the table was created.  The `BINARY' attribute means that column
  2095. values are sorted and compared in case-sensitive fashion according to
  2096. the ASCII order of the machine where the *MySQL* server is running.
  2097. `BINARY' doesn't affect how the column is stored or retrieved.
  2098. The `BINARY' attribute is sticky.  This means that if a column marked
  2099. `BINARY' is used in an expression, the whole expression is compared as a
  2100. `BINARY' value.
  2101. *MySQL* may silently change the type of a `CHAR' or `VARCHAR' column at
  2102. table creation time.  *Note Silent column changes::.
  2103. The `BLOB' and `TEXT' Types
  2104. ...........................
  2105. A `BLOB' is a binary large object that can hold a variable amount of
  2106. data.  The four `BLOB' types `TINYBLOB', `BLOB', `MEDIUMBLOB', and
  2107. `LONGBLOB' differ only in the maximum length of the values they can
  2108. hold.  *Note Storage requirements::.
  2109. The four `TEXT' types `TINYTEXT', `TEXT', `MEDIUMTEXT', and `LONGTEXT'
  2110. correspond to the four `BLOB' types and have the same maximum lengths
  2111. and storage requirements.  The only difference between `BLOB' and
  2112. `TEXT' types is that sorting and comparison is performed in
  2113. case-sensitive fashion for `BLOB' values and case-insensitive fashion
  2114. for `TEXT' values.  In other words, a `TEXT' is a case-insensitive
  2115. `BLOB'.
  2116. If you assign a value to a `BLOB' or `TEXT' column that exceeds the
  2117. column type's maximum length, the value is truncated to fit.
  2118. In most respects, you can regard a `TEXT' column as a `VARCHAR' column
  2119. that can be as big as you like.  Similarly, you can regard a `BLOB'
  2120. column as a `VARCHAR BINARY' column.  The differences are:
  2121.    * You can have indexes on `BLOB' and `TEXT' columns with *MySQL*
  2122.      Version 3.23.2 and newer. Older versions of *MySQL* did not
  2123.      support this.
  2124.    * There is no trailing-space removal for `BLOB' and `TEXT' columns
  2125.      when values are stored, as there is for `VARCHAR' columns.
  2126.    * `BLOB' and `TEXT' columns cannot have `DEFAULT' values.
  2127. *MyODBC* defines `BLOB' values as `LONGVARBINARY' and `TEXT' values as
  2128. `LONGVARCHAR'.
  2129. Because `BLOB' and `TEXT' values may be extremely long, you may run up
  2130. against some constraints when using them:
  2131.    * If you want to use `GROUP BY' or `ORDER BY' on a `BLOB' or `TEXT'
  2132.      column, you must convert the column value into a fixed-length
  2133.      object. The standard way to do this is with the `SUBSTRING'
  2134.      function.  For example:
  2135.           mysql> select comment from tbl_name,substring(comment,20) as substr
  2136.                  ORDER BY substr;
  2137.      If you don't do this, only the first `max_sort_length' bytes of the
  2138.      column are used when sorting.  The default value of
  2139.      `max_sort_length' is 1024; this value can be changed using the
  2140.      `-O' option when starting the `mysqld' server. You can group on an
  2141.      expression involving `BLOB' or `TEXT' values by specifying the
  2142.      column position or by using an alias:
  2143.           mysql> select id,substring(blob_col,1,100) from tbl_name
  2144.                      GROUP BY 2;
  2145.           mysql> select id,substring(blob_col,1,100) as b from tbl_name
  2146.                      GROUP BY b;
  2147.    * The maximum size of a `BLOB' or `TEXT' object is determined by its
  2148.      type, but the largest value you can actually transmit between the
  2149.      client and server is determined by the amount of available memory
  2150.      and the size of the communications buffers.  You can change the
  2151.      message buffer size, but you must do so on both the server and
  2152.      client ends. *Note Server parameters::.
  2153. Note that each `BLOB' or `TEXT' value is represented internally by a
  2154. separately allocated object. This is in contrast to all other column
  2155. types, for which storage is allocated once per column when the table is
  2156. opened.
  2157. The `ENUM' Type
  2158. ...............
  2159. An `ENUM' is a string object whose value normally is chosen from a list
  2160. of allowed values that are enumerated explicitly in the column
  2161. specification at table creation time.
  2162. The value may also be the empty string (`""') or `NULL' under certain
  2163. circumstances:
  2164.    * If you insert an invalid value into an `ENUM' (that is, a string
  2165.      not present in the list of allowed values), the empty string is
  2166.      inserted instead as a special error value.
  2167.    * If an `ENUM' is declared `NULL', `NULL' is also a legal value for
  2168.      the column, and the default value is `NULL'.  If an `ENUM' is
  2169.      declared `NOT NULL', the default value is the first element of the
  2170.      list of allowed values.
  2171. Each enumeration value has an index:
  2172.    * Values from the list of allowable elements in the column
  2173.      specification are numbered beginning with 1.
  2174.    * The index value of the empty string error value is 0.  This means
  2175.      that you can use the following `SELECT' statement to find rows
  2176.      into which invalid `ENUM' values were assigned:
  2177.           mysql> SELECT * FROM tbl_name WHERE enum_col=0;
  2178.    * The index of the `NULL' value is `NULL'.
  2179. For example, a column specified as `ENUM("one", "two", "three")' can
  2180. have any of the values shown below.  The index of each value is also
  2181. shown:
  2182. *Value*        *Index*
  2183. `NULL'         `NULL'
  2184. `""'           0
  2185. `"one"'        1
  2186. `"two"'        2
  2187. `"three"'      3
  2188. An enumeration can have a maximum of 65535 elements.
  2189. Lettercase is irrelevant when you assign values to an `ENUM' column.
  2190. However, values retrieved from the column later have lettercase
  2191. matching the values that were used to specify the allowable values at
  2192. table creation time.
  2193. If you retrieve an `ENUM' in a numeric context, the column value's
  2194. index is returned.  For example, you can retrieve numeric values from
  2195. an `ENUM' column like this:
  2196.      mysql> SELECT enum_col+0 FROM tbl_name;
  2197. If you store a number into an `ENUM', the number is treated as an
  2198. index, and the value stored is the enumeration member with that index.
  2199. (However, this will not work with `LOAD DATA', which treats all input
  2200. as strings.)
  2201. `ENUM' values are sorted according to the order in which the enumeration
  2202. members were listed in the column specification.  (In other words,
  2203. `ENUM' values are sorted according to their index numbers.)  For
  2204. example, `"a"' sorts before `"b"' for `ENUM("a", "b")', but `"b"' sorts
  2205. before `"a"' for `ENUM("b", "a")'.  The empty string sorts before
  2206. non-empty strings, and `NULL' values sort before all other enumeration
  2207. values.
  2208. If you want to get all possible values for an `ENUM' column, you should
  2209. use: `SHOW COLUMNS FROM table_name LIKE enum_column_name' and parse the
  2210. `ENUM' definition in the second column.
  2211. The `SET' Type
  2212. ..............
  2213. A `SET' is a string object that can have zero or more values, each of
  2214. which must be chosen from a list of allowed values specified when the
  2215. table is created.  `SET' column values that consist of multiple set
  2216. members are specified with members separated by commas (`,').  A
  2217. consequence of this is that `SET' member values cannot themselves
  2218. contain commas.
  2219. For example, a column specified as `SET("one", "two") NOT NULL' can have
  2220. any of these values:
  2221.      ""
  2222.      "one"
  2223.      "two"
  2224.      "one,two"
  2225. A `SET' can have a maximum of 64 different members.
  2226. *MySQL* stores `SET' values numerically, with the low-order bit of the
  2227. stored value corresponding to the first set member.  If you retrieve a
  2228. `SET' value in a numeric context, the value retrieved has bits set
  2229. corresponding to the set members that make up the column value.  For
  2230. example, you can retrieve numeric values from a `SET' column like this:
  2231.      mysql> SELECT set_col+0 FROM tbl_name;
  2232. If a number is stored into a `SET' column, the bits that are set in the
  2233. binary representation of the number determine the set members in the
  2234. column value.  Suppose a column is specified as `SET("a","b","c","d")'.
  2235. Then the members have the following bit values:
  2236. `SET'          *Decimal       *Binary value*
  2237. *member*       value*         
  2238. `a'            `1'            `0001'
  2239. `b'            `2'            `0010'
  2240. `c'            `4'            `0100'
  2241. `d'            `8'            `1000'
  2242. If you assign a value of `9' to this column, that is `1001' in binary,
  2243. so the first and fourth `SET' value members `"a"' and `"d"' are
  2244. selected and the resulting value is `"a,d"'.
  2245. For a value containing more than one `SET' element, it does not matter
  2246. what order the elements are listed in when you insert the value.  It
  2247. also does not matter how many times a given element is listed in the
  2248. value.  When the value is retrieved later, each element in the value
  2249. will appear once, with elements listed according to the order in which
  2250. they were specified at table creation time.  For example, if a column
  2251. is specified as `SET("a","b","c","d")', then `"a,d"', `"d,a"', and
  2252. `"d,a,a,d,d"' will all appear as `"a,d"' when retrieved.
  2253. `SET' values are sorted numerically.  `NULL' values sort before
  2254. non-`NULL' `SET' values.
  2255. Normally, you perform a `SELECT' on a `SET' column using the `LIKE'
  2256. operator or the `FIND_IN_SET()' function:
  2257.      mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
  2258.      mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
  2259. But the following will also work:
  2260.      mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
  2261.      mysql> SELECT * FROM tbl_name WHERE set_col & 1;