MySQL Reference Manual

757
MySQL Reference Manual Copyright c 1997-2001 MySQL AB

Transcript of MySQL Reference Manual

  • 1. MySQL Reference Manual Copyright c 1997-2001 MySQL AB

2. i Table of Contents 1 General Information About MySQL. . . . . . . . . 1 1.1 About This Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.1 Conventions Used in This Manual. . . . . . . . . . . . . . . . 2 1.2 What Is MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 History of MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.2 The Main Features of MySQL . . . . . . . . . . . . . . . . . . . 5 1.2.3 How Stable Is MySQL? . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.4 How Big Can MySQL Tables Be? . . . . . . . . . . . . . . . . 8 1.2.5 Year 2000 Compliance . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3 What Is MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3.1 The Business Model and Services of MySQL AB. . 12 1.3.1.1 Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3.1.2 Training and Certication . . . . . . . . . . . . . 12 1.3.1.3 Consulting . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1.4 Commercial Licenses . . . . . . . . . . . . . . . . . . 13 1.3.1.5 Partnering. . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1.6 Advertising . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.2 Contact Information . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 MySQL Support and Licensing . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4.1 Support Oered by MySQL AB. . . . . . . . . . . . . . . . . 15 1.4.2 Copyrights and Licenses Used by MySQL. . . . . . . . 16 1.4.3 MySQL Server Licenses . . . . . . . . . . . . . . . . . . . . . . . . 17 1.4.3.1 Using the MySQL Server Under a Commercial License . . . . . . . . . . . . . . . . . . . . . . . 17 1.4.3.2 Using the MySQL Server for Free Under GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.4.4 MySQL AB Logos and Trademarks . . . . . . . . . . . . . 18 1.4.4.1 The Original MySQL Logo. . . . . . . . . . . . . 19 1.4.4.2 MySQL Logos that may be Used Without Written Permission . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4.3 When do you need a Written Permission to use MySQL Logos? . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4.4 MySQL AB Partnership Logos . . . . . . . . . 20 1.4.4.5 Using the word MySQL in Printed Text or Presentations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4.4.6 Using the word MySQL in Company and Product Names . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.5 MySQL 4.0 In A Nutshell. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.5.1 Stepwise Rollout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.5.2 Ready for Immediate Development Use. . . . . . . . . . 21 1.5.3 Embedded MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.5.4 Other Features Available From MySQL 4.0.0 . . . . 21 1.5.5 Future MySQL 4.0 Features . . . . . . . . . . . . . . . . . . . . 22 3. ii 1.5.6 MySQL 4.1, The Following Development Release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.6 MySQL Information Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.6.1 MySQL Portals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.6.2 MySQL Mailing Lists . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.6.2.1 The MySQL Mailing Lists . . . . . . . . . . . . . 23 1.6.2.2 Asking Questions or Reporting Bugs. . . . 26 1.6.2.3 How to Report Bugs or Problems . . . . . . 26 1.6.2.4 Guidelines for Answering Questions on the Mailing List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 1.7 How Standards-compatible Is MySQL?. . . . . . . . . . . . . . . . . . . 31 1.7.1 What Standards Does MySQL Follow? . . . . . . . . . . 31 1.7.2 Running MySQL in ANSI Mode . . . . . . . . . . . . . . . . 32 1.7.3 MySQL Extensions to ANSI SQL92 . . . . . . . . . . . . . 32 1.7.4 MySQL Dierences Compared to ANSI SQL92. . . 34 1.7.4.1 Sub-SELECTs. . . . . . . . . . . . . . . . . . . . . . . . . . 35 1.7.4.2 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . 35 1.7.4.3 Transactions and Atomic Operations . . . 36 1.7.4.4 Stored Procedures and Triggers . . . . . . . . 38 1.7.4.5 Foreign Keys . . . . . . . . . . . . . . . . . . . . . . . . . 38 1.7.4.6 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 1.7.4.7 -- as the Start of a Comment. . . . . . . . . 40 1.7.5 Known Errors and Design Deciencies in MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 1.8 MySQL and The Future (The TODO) . . . . . . . . . . . . . . . . . . . 43 1.8.1 Things That Should be in 4.0. . . . . . . . . . . . . . . . . . . 44 1.8.2 Things That Must be Done in the Real Near Future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 1.8.3 Things That Have to be Done Sometime . . . . . . . . 48 1.8.4 Things we dont Have any Plans to do . . . . . . . . . . 50 2 MySQL Installation. . . . . . . . . . . . . . . . . . . . . . . 51 2.1 Quick Standard Installation of MySQL. . . . . . . . . . . . . . . . . . . 51 2.1.1 Installing MySQL on Linux. . . . . . . . . . . . . . . . . . . . . 51 2.1.2 Installing MySQL on Windows . . . . . . . . . . . . . . . . . 52 2.1.2.1 Installing the Binaries . . . . . . . . . . . . . . . . . 53 2.1.2.2 Preparing the Windows MySQL Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.1.2.3 Starting the Server for the First Time . . 54 2.2 General Installation Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.2.1 How to Get MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.2.2 Operating Systems Supported by MySQL . . . . . . . 58 2.2.3 Which MySQL Version to Use . . . . . . . . . . . . . . . . . . 60 2.2.4 Installation Layouts. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 2.2.5 How and When Updates Are Released. . . . . . . . . . . 63 2.2.6 MySQL Binaries Compiled by MySQL AB. . . . . . . 64 2.2.7 Installing a MySQL Binary Distribution . . . . . . . . . 65 2.3 Installing a MySQL Source Distribution. . . . . . . . . . . . . . . . . . 68 4. iii 2.3.1 Quick Installation Overview . . . . . . . . . . . . . . . . . . . . 69 2.3.2 Applying Patches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 2.3.3 Typical configure Options . . . . . . . . . . . . . . . . . . . . 71 2.3.4 Installing from the Development Source Tree. . . . . 74 2.3.5 Problems Compiling? . . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.3.6 MIT-pthreads Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 2.3.7 Windows Source Distribution . . . . . . . . . . . . . . . . . . . 78 2.4 Post-installation Setup and Testing . . . . . . . . . . . . . . . . . . . . . . 79 2.4.1 Problems Running mysql_install_db . . . . . . . . . . 82 2.4.2 Problems Starting the MySQL Server . . . . . . . . . . . 84 2.4.3 Starting and Stopping MySQL Automatically. . . . 86 2.5 Upgrading/Downgrading MySQL. . . . . . . . . . . . . . . . . . . . . . . . 87 2.5.1 Upgrading From Version 3.23 to Version 4.0 . . . . . 88 2.5.2 Upgrading From Version 3.22 to Version 3.23 . . . . 88 2.5.3 Upgrading from Version 3.21 to Version 3.22 . . . . . 90 2.5.4 Upgrading from Version 3.20 to Version 3.21 . . . . . 90 2.5.5 Upgrading to Another Architecture . . . . . . . . . . . . . 91 2.6 Operating System Specic Notes . . . . . . . . . . . . . . . . . . . . . . . . 92 2.6.1 Linux Notes (All Linux Versions) . . . . . . . . . . . . . . . 92 2.6.1.1 Linux Notes for Binary Distributions . . . 96 2.6.1.2 Linux x86 Notes . . . . . . . . . . . . . . . . . . . . . . 97 2.6.1.3 Linux SPARC Notes . . . . . . . . . . . . . . . . . . 98 2.6.1.4 Linux Alpha Notes . . . . . . . . . . . . . . . . . . . . 98 2.6.1.5 Linux PowerPC Notes . . . . . . . . . . . . . . . . . 98 2.6.1.6 Linux MIPS Notes . . . . . . . . . . . . . . . . . . . . 99 2.6.1.7 Linux IA64 Notes . . . . . . . . . . . . . . . . . . . . . 99 2.6.2 Windows Notes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 2.6.2.1 Starting MySQL on Windows 95 or Windows 98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 2.6.2.2 Starting MySQL on Windows NT or Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 2.6.2.3 Running MySQL on Windows. . . . . . . . . 101 2.6.2.4 Connecting to a Remote MySQL from Windows with SSH . . . . . . . . . . . . . . . . . . . . . . 102 2.6.2.5 Splitting Data Across Dierent Disks on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 2.6.2.6 Compiling MySQL Clients on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 2.6.2.7 MySQL-Windows Compared to Unix MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 2.6.3 Solaris Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 2.6.3.1 Solaris 2.7/2.8 Notes . . . . . . . . . . . . . . . . . 108 2.6.3.2 Solaris x86 Notes . . . . . . . . . . . . . . . . . . . . 109 2.6.4 BSD Notes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 2.6.4.1 FreeBSD Notes . . . . . . . . . . . . . . . . . . . . . . 109 2.6.4.2 NetBSD notes . . . . . . . . . . . . . . . . . . . . . . . 110 2.6.4.3 OpenBSD Notes . . . . . . . . . . . . . . . . . . . . . 111 2.6.4.4 OpenBSD 2.5 Notes . . . . . . . . . . . . . . . . . . 111 5. iv 2.6.4.5 OpenBSD 2.8 Notes . . . . . . . . . . . . . . . . . . 111 2.6.4.6 BSD/OS Notes . . . . . . . . . . . . . . . . . . . . . . 111 2.6.4.7 BSD/OS Version 2.x Notes . . . . . . . . . . . 111 2.6.4.8 BSD/OS Version 3.x Notes . . . . . . . . . . . 112 2.6.4.9 BSD/OS Version 4.x Notes . . . . . . . . . . . 112 2.6.5 Mac OS X Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 2.6.5.1 Mac OS X Public Beta . . . . . . . . . . . . . . . 113 2.6.5.2 Mac OS X Server . . . . . . . . . . . . . . . . . . . . 113 2.6.6 Other Unix Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 2.6.6.1 HP-UX Notes for Binary Distributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 2.6.6.2 HP-UX Version 10.20 Notes. . . . . . . . . . . 114 2.6.6.3 HP-UX Version 11.x Notes. . . . . . . . . . . . 114 2.6.6.4 IBM-AIX notes . . . . . . . . . . . . . . . . . . . . . . 116 2.6.6.5 SunOS 4 Notes . . . . . . . . . . . . . . . . . . . . . . 117 2.6.6.6 Alpha-DEC-UNIX Notes (Tru64). . . . . . 118 2.6.6.7 Alpha-DEC-OSF1 Notes. . . . . . . . . . . . . . 119 2.6.6.8 SGI Irix Notes . . . . . . . . . . . . . . . . . . . . . . . 120 2.6.6.9 SCO Notes . . . . . . . . . . . . . . . . . . . . . . . . . . 121 2.6.6.10 SCO Unixware Version 7.0 Notes. . . . . 123 2.6.7 OS/2 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 2.6.8 BeOS Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 2.6.9 Novell Netware Notes . . . . . . . . . . . . . . . . . . . . . . . . . 124 2.7 Perl Installation Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 2.7.1 Installing Perl on Unix . . . . . . . . . . . . . . . . . . . . . . . . 124 2.7.2 Installing ActiveState Perl on Windows . . . . . . . . 125 2.7.3 Installing the MySQL Perl Distribution on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 2.7.4 Problems Using the Perl DBI/DBD Interface . . . . . 126 3 Introduction to MySQL: A MySQL Tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 3.1 Connecting to and Disconnecting from the Server. . . . . . . . 128 3.2 Entering Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 3.3 Creating and Using a Database. . . . . . . . . . . . . . . . . . . . . . . . . 132 3.3.1 Creating and Selecting a Database . . . . . . . . . . . . . 133 3.3.2 Creating a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 3.3.3 Loading Data into a Table . . . . . . . . . . . . . . . . . . . . 135 3.3.4 Retrieving Information from a Table . . . . . . . . . . . 136 3.3.4.1 Selecting All Data . . . . . . . . . . . . . . . . . . . 136 3.3.4.2 Selecting Particular Rows. . . . . . . . . . . . . 137 3.3.4.3 Selecting Particular Columns . . . . . . . . . 138 3.3.4.4 Sorting Rows . . . . . . . . . . . . . . . . . . . . . . . . 139 3.3.4.5 Date Calculations . . . . . . . . . . . . . . . . . . . . 141 3.3.4.6 Working with NULL Values . . . . . . . . . . . . 144 3.3.4.7 Pattern Matching . . . . . . . . . . . . . . . . . . . . 144 3.3.4.8 Counting Rows . . . . . . . . . . . . . . . . . . . . . . 147 3.3.4.9 Using More Than one Table . . . . . . . . . . 149 6. v 3.4 Getting Information About Databases and Tables . . . . . . . 150 3.5 Examples of Common Queries. . . . . . . . . . . . . . . . . . . . . . . . . . 151 3.5.1 The Maximum Value for a Column . . . . . . . . . . . . 152 3.5.2 The Row Holding the Maximum of a Certain Column . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 3.5.3 Maximum of Column per Group . . . . . . . . . . . . . . . 153 3.5.4 The Rows Holding the Group-wise Maximum of a Certain Field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 3.5.5 Using user variables. . . . . . . . . . . . . . . . . . . . . . . . . . . 154 3.5.6 Using Foreign Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 3.5.7 Searching on Two Keys . . . . . . . . . . . . . . . . . . . . . . . 156 3.5.8 Calculating visits per day . . . . . . . . . . . . . . . . . . . . . 157 3.5.9 Using AUTO INCREMENT. . . . . . . . . . . . . . . . . . . 157 3.6 Using mysql in Batch Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 3.7 Queries from Twin Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 3.7.1 Find all Non-distributed Twins . . . . . . . . . . . . . . . . 160 3.7.2 Show a Table on Twin Pair Status . . . . . . . . . . . . . 162 3.8 Using MySQL with Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 4 MySQL Database Administration. . . . . . . . . 164 4.1 Conguring MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.1.1 mysqld Command-line Options . . . . . . . . . . . . . . . . 164 4.1.2 my.cnf Option Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.1.3 Installing Many Servers on the Same Machine . . 171 4.1.4 Running Multiple MySQL Servers on the Same Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 4.2 General Security Issues and the MySQL Access Privilege System. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 4.2.1 General Security Guidelines . . . . . . . . . . . . . . . . . . . 173 4.2.2 How to Make MySQL Secure Against Crackers. . 176 4.2.3 Startup Options for mysqld Concerning Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.2.4 What the Privilege System Does . . . . . . . . . . . . . . . 178 4.2.5 How the Privilege System Works. . . . . . . . . . . . . . . 178 4.2.6 Privileges Provided by MySQL . . . . . . . . . . . . . . . . 181 4.2.7 Connecting to the MySQL Server . . . . . . . . . . . . . . 183 4.2.8 Access Control, Stage 1: Connection Verication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 4.2.9 Access Control, Stage 2: Request Verication . . . 187 4.2.10 Causes of Access denied Errors . . . . . . . . . . . . . . 189 4.3 MySQL User Account Management. . . . . . . . . . . . . . . . . . . . . 193 4.3.1 GRANT and REVOKE Syntax . . . . . . . . . . . . . . . . . . . . . 193 4.3.2 MySQL User Names and Passwords. . . . . . . . . . . . 196 4.3.3 When Privilege Changes Take Eect . . . . . . . . . . . 197 4.3.4 Setting Up the Initial MySQL Privileges. . . . . . . . 198 4.3.5 Adding New Users to MySQL . . . . . . . . . . . . . . . . . 199 4.3.6 Setting Up Passwords . . . . . . . . . . . . . . . . . . . . . . . . . 202 4.3.7 Keeping Your Password Secure . . . . . . . . . . . . . . . . 203 7. vi 4.3.8 Using Secure Connections . . . . . . . . . . . . . . . . . . . . . 204 4.3.8.1 Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 4.3.8.2 Requirements . . . . . . . . . . . . . . . . . . . . . . . . 205 4.3.8.3 GRANT options . . . . . . . . . . . . . . . . . . . . . 205 4.4 Disaster Prevention and Recovery . . . . . . . . . . . . . . . . . . . . . . 206 4.4.1 Database Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 4.4.2 BACKUP TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 207 4.4.3 RESTORE TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . 208 4.4.4 CHECK TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . 208 4.4.5 REPAIR TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 210 4.4.6 Using myisamchk for Table Maintenance and Crash Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 4.4.6.1 myisamchk Invocation Syntax . . . . . . . . . 211 4.4.6.2 General Options for myisamchk . . . . . . . 212 4.4.6.3 Check Options for myisamchk . . . . . . . . . 213 4.4.6.4 Repair Options for myisamchk . . . . . . . . 214 4.4.6.5 Other Options for myisamchk . . . . . . . . . 215 4.4.6.6 myisamchk Memory Usage . . . . . . . . . . . . 215 4.4.6.7 Using myisamchk for Crash Recovery . . 216 4.4.6.8 How to Check Tables for Errors . . . . . . . 217 4.4.6.9 How to Repair Tables . . . . . . . . . . . . . . . . 218 4.4.6.10 Table Optimisation . . . . . . . . . . . . . . . . . 220 4.4.7 Setting Up a Table Maintenance Regimen . . . . . . 220 4.4.8 Getting Information About a Table . . . . . . . . . . . . 221 4.5 Database Administration Language Reference . . . . . . . . . . . 226 4.5.1 OPTIMIZE TABLE Syntax. . . . . . . . . . . . . . . . . . . . . . . 226 4.5.2 ANALYZE TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . 227 4.5.3 FLUSH Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 4.5.4 KILL Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 4.5.5 SHOW Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 4.5.5.1 Retrieving information about Database, Tables, Columns, and Indexes. . . . . . . . . . . . . 229 4.5.5.2 SHOW TABLE STATUS . . . . . . . . . . . . . . . . . . 230 4.5.5.3 SHOW STATUS. . . . . . . . . . . . . . . . . . . . . . . . . 231 4.5.5.4 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . 234 4.5.5.5 SHOW LOGS . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 4.5.5.6 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . 242 4.5.5.7 SHOW GRANTS. . . . . . . . . . . . . . . . . . . . . . . . . 242 4.5.5.8 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . 243 4.6 MySQL Localisation and International Usage. . . . . . . . . . . . 243 4.6.1 The Character Set Used for Data and Sorting. . . 243 4.6.1.1 German character set . . . . . . . . . . . . . . . . 244 4.6.2 Non-English Error Messages . . . . . . . . . . . . . . . . . . . 244 4.6.3 Adding a New Character Set . . . . . . . . . . . . . . . . . . 245 4.6.4 The character denition arrays . . . . . . . . . . . . . . . . 246 4.6.5 String Collating Support . . . . . . . . . . . . . . . . . . . . . . 247 4.6.6 Multi-byte Character Support . . . . . . . . . . . . . . . . . 247 4.6.7 Problems With Character Sets. . . . . . . . . . . . . . . . . 247 8. vii 4.7 MySQL Server-Side Scripts and Utilities . . . . . . . . . . . . . . . . 248 4.7.1 Overview of the Server-Side Scripts and Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 4.7.2 safe mysqld, the wrapper around mysqld . . . . . . . 250 4.7.3 mysqld multi, program for managing multiple MySQL servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 4.7.4 myisampack, The MySQL Compressed Read-only Table Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 4.7.5 mysqld-max, An extended mysqld server . . . . . . . 260 4.8 MySQL Client-Side Scripts and Utilities . . . . . . . . . . . . . . . . 262 4.8.1 Overview of the Client-Side Scripts and Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 4.8.2 The Command-line Tool . . . . . . . . . . . . . . . . . . . . . . 263 4.8.3 mysqladmin, Administrating a MySQL Server . . 269 4.8.4 Using mysqlcheck for Table Maintenance and Crash Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 4.8.5 mysqldump, Dumping Table Structure and Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 4.8.6 mysqlhotcopy, Copying MySQL Databases and Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 4.8.7 mysqlimport, Importing Data from Text Files. . . 277 4.8.8 Showing Databases, Tables, and Columns . . . . . . 279 4.8.9 perror, Explaining Error Codes . . . . . . . . . . . . . . . . 280 4.8.10 How to Run SQL Commands from a Text File. . 280 4.9 The MySQL Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 4.9.1 The Error Log. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 4.9.2 The General Query Log . . . . . . . . . . . . . . . . . . . . . . . 281 4.9.3 The Update Log. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 4.9.4 The Binary Update Log. . . . . . . . . . . . . . . . . . . . . . . 282 4.9.5 The Slow Query Log . . . . . . . . . . . . . . . . . . . . . . . . . . 284 4.9.6 Log File Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . 284 4.10 Replication in MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 4.10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 4.10.2 Replication Implementation Overview . . . . . . . . . 285 4.10.3 How To Set Up Replication . . . . . . . . . . . . . . . . . . 286 4.10.4 Replication Features and Known Problems . . . . 287 4.10.5 Replication Options in my.cnf . . . . . . . . . . . . . . . . 289 4.10.6 SQL Commands Related to Replication . . . . . . . 292 4.10.7 Replication FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 4.10.8 Troubleshooting Replication . . . . . . . . . . . . . . . . . . 297 9. viii 5 MySQL Optimisation . . . . . . . . . . . . . . . . . . . . 300 5.1 Optimisation Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 5.1.1 MySQL Design Limitations/Tradeos . . . . . . . . . . 300 5.1.2 Portability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 5.1.3 What Have We Used MySQL For? . . . . . . . . . . . . . 302 5.1.4 The MySQL Benchmark Suite . . . . . . . . . . . . . . . . . 303 5.1.5 Using Your Own Benchmarks. . . . . . . . . . . . . . . . . . 304 5.2 Optimising SELECTs and Other Queries . . . . . . . . . . . . . . . . . 305 5.2.1 EXPLAIN Syntax (Get Information About a SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 5.2.2 Estimating Query Performance . . . . . . . . . . . . . . . . 310 5.2.3 Speed of SELECT Queries . . . . . . . . . . . . . . . . . . . . . . 311 5.2.4 How MySQL Optimises WHERE Clauses . . . . . . . . . 311 5.2.5 How MySQL Optimises DISTINCT. . . . . . . . . . . . . . 313 5.2.6 How MySQL Optimises LEFT JOIN and RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 5.2.7 How MySQL Optimises LIMIT . . . . . . . . . . . . . . . . . 314 5.2.8 Speed of INSERT Queries . . . . . . . . . . . . . . . . . . . . . . 314 5.2.9 Speed of UPDATE Queries . . . . . . . . . . . . . . . . . . . . . . 316 5.2.10 Speed of DELETE Queries . . . . . . . . . . . . . . . . . . . . . 316 5.2.11 Other Optimisation Tips . . . . . . . . . . . . . . . . . . . . . 317 5.3 Locking Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 5.3.1 How MySQL Locks Tables . . . . . . . . . . . . . . . . . . . . 319 5.3.2 Table Locking Issues . . . . . . . . . . . . . . . . . . . . . . . . . . 320 5.4 Optimising Database Structure. . . . . . . . . . . . . . . . . . . . . . . . . 321 5.4.1 Design Choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 5.4.2 Get Your Data as Small as Possible . . . . . . . . . . . . 322 5.4.3 How MySQL Uses Indexes . . . . . . . . . . . . . . . . . . . . 323 5.4.4 Column Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 5.4.5 Multiple-Column Indexes. . . . . . . . . . . . . . . . . . . . . . 325 5.4.6 How MySQL Opens and Closes Tables . . . . . . . . . 326 5.4.7 Drawbacks to Creating Large Numbers of Tables in the Same Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 5.4.8 Why So Many Open tables? . . . . . . . . . . . . . . . . . . . 328 5.5 Optimising the MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . 328 5.5.1 System/Compile Time and Startup Parameter Tuning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 5.5.2 Tuning Server Parameters . . . . . . . . . . . . . . . . . . . . . 329 5.5.3 How Compiling and Linking Aects the Speed of MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 5.5.4 How MySQL Uses Memory. . . . . . . . . . . . . . . . . . . . 332 5.5.5 How MySQL uses DNS . . . . . . . . . . . . . . . . . . . . . . . 333 5.5.6 SET Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 5.6 Disk Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 5.6.1 Using Symbolic Links . . . . . . . . . . . . . . . . . . . . . . . . . 337 5.6.1.1 Using Symbolic Links for Databases . . . 337 5.6.1.2 Using Symbolic Links for Tables . . . . . . 338 10. ix 6 MySQL Language Reference . . . . . . . . . . . . . 340 6.1 Language Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 6.1.1 Literals: How to Write Strings and Numbers. . . . 340 6.1.1.1 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 6.1.1.2 Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 6.1.1.3 Hexadecimal Values . . . . . . . . . . . . . . . . . . 342 6.1.1.4 NULL Values . . . . . . . . . . . . . . . . . . . . . . . . . 342 6.1.2 Database, Table, Index, Column, and Alias Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 6.1.3 Case Sensitivity in Names . . . . . . . . . . . . . . . . . . . . . 344 6.1.4 User Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 6.1.5 Comment Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 6.1.6 Is MySQL Picky About Reserved Words?. . . . . . . 346 6.2 Column Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 6.2.1 Numeric Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 6.2.2 Date and Time Types. . . . . . . . . . . . . . . . . . . . . . . . . 353 6.2.2.1 Y2K Issues and Date Types. . . . . . . . . . . 354 6.2.2.2 The DATETIME, DATE, and TIMESTAMP Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 6.2.2.3 The TIME Type . . . . . . . . . . . . . . . . . . . . . . 358 6.2.2.4 The YEAR Type . . . . . . . . . . . . . . . . . . . . . . 359 6.2.3 String Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 6.2.3.1 The CHAR and VARCHAR Types. . . . . . . . . 360 6.2.3.2 The BLOB and TEXT Types . . . . . . . . . . . . 360 6.2.3.3 The ENUM Type . . . . . . . . . . . . . . . . . . . . . . 362 6.2.3.4 The SET Type . . . . . . . . . . . . . . . . . . . . . . . 363 6.2.4 Choosing the Right Type for a Column. . . . . . . . . 364 6.2.5 Using Column Types from Other Database Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 6.2.6 Column Type Storage Requirements . . . . . . . . . . . 365 6.3 Functions for Use in SELECT and WHERE Clauses . . . . . . . . . 366 6.3.1 Non-Type-Specic Operators and Functions . . . . 367 6.3.1.1 Parenthesis . . . . . . . . . . . . . . . . . . . . . . . . . . 367 6.3.1.2 Comparison Operators . . . . . . . . . . . . . . . 367 6.3.1.3 Logical Operators . . . . . . . . . . . . . . . . . . . . 370 6.3.1.4 Control Flow Functions. . . . . . . . . . . . . . . 371 6.3.2 String Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 6.3.2.1 String Comparison Functions . . . . . . . . . 379 6.3.2.2 Case Sensitivity. . . . . . . . . . . . . . . . . . . . . . 381 6.3.3 Numeric Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 6.3.3.1 Arithmetic Operations . . . . . . . . . . . . . . . 381 6.3.3.2 Mathematical Functions . . . . . . . . . . . . . . 382 6.3.4 Date and Time Functions . . . . . . . . . . . . . . . . . . . . . 387 6.3.5 Other Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 6.3.5.1 Bit Functions . . . . . . . . . . . . . . . . . . . . . . . . 395 6.3.5.2 Miscellaneous Functions . . . . . . . . . . . . . . 395 6.3.6 Functions for Use with GROUP BY Clauses . . . . . . . 399 6.4 Data Manipulation: SELECT, INSERT, UPDATE, DELETE . . . . 401 11. x 6.4.1 SELECT Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 6.4.1.1 JOIN Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 404 6.4.1.2 UNION Syntax. . . . . . . . . . . . . . . . . . . . . . . . 406 6.4.2 HANDLER Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 6.4.3 INSERT Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 6.4.3.1 INSERT ... SELECT Syntax . . . . . . . . . . . 409 6.4.4 INSERT DELAYED Syntax. . . . . . . . . . . . . . . . . . . . . . . 409 6.4.5 UPDATE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 6.4.6 DELETE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 6.4.7 TRUNCATE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 6.4.8 REPLACE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 6.4.9 LOAD DATA INFILE Syntax . . . . . . . . . . . . . . . . . . . . . 414 6.5 Data Denition: CREATE, DROP, ALTER . . . . . . . . . . . . . . . . . . 419 6.5.1 CREATE DATABASE Syntax. . . . . . . . . . . . . . . . . . . . . . 420 6.5.2 DROP DATABASE Syntax . . . . . . . . . . . . . . . . . . . . . . . . 420 6.5.3 CREATE TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 420 6.5.3.1 Silent Column Specication Changes . . 427 6.5.4 ALTER TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . 428 6.5.5 RENAME TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 431 6.5.6 DROP TABLE Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 6.5.7 CREATE INDEX Syntax . . . . . . . . . . . . . . . . . . . . . . . . . 432 6.5.8 DROP INDEX Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 6.6 Basic MySQL User Utility Commands . . . . . . . . . . . . . . . . . . 433 6.6.1 USE Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 6.6.2 DESCRIBE Syntax (Get Information About Columns) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 6.7 MySQL Transactional and Locking Commands . . . . . . . . . . 434 6.7.1 BEGIN/COMMIT/ROLLBACK Syntax. . . . . . . . . . . . . . . 434 6.7.2 LOCK TABLES/UNLOCK TABLES Syntax . . . . . . . . . . . 435 6.7.3 SET TRANSACTION Syntax. . . . . . . . . . . . . . . . . . . . . . 437 6.8 MySQL Full-text Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 6.8.1 Fulltext restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 6.8.2 Fine-tuning MySQL Full-text Search . . . . . . . . . . . 439 6.8.3 New Features of Full-text Search in MySQL 4.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 6.8.4 Full-text Search TODO . . . . . . . . . . . . . . . . . . . . . . . 440 12. xi 7 MySQL Table Types . . . . . . . . . . . . . . . . . . . . . 441 7.1 MyISAM Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 7.1.1 Space Needed for Keys . . . . . . . . . . . . . . . . . . . . . . . . 444 7.1.2 MyISAM Table Formats . . . . . . . . . . . . . . . . . . . . . . 444 7.1.2.1 Static (Fixed-length) Table Characteristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 7.1.2.2 Dynamic Table Characteristics . . . . . . . . 445 7.1.2.3 Compressed Table Characteristics . . . . . 446 7.1.3 MyISAM table problems.. . . . . . . . . . . . . . . . . . . . . . 447 7.1.3.1 Corrupted MyISAM tables. . . . . . . . . . . . 447 7.1.3.2 Clients is using or hasnt closed the table properly. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 7.2 MERGE Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 7.3 ISAM Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 7.4 HEAP Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 7.5 InnoDB Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 7.5.1 InnoDB Tables Overview. . . . . . . . . . . . . . . . . . . . . . 452 7.5.2 InnoDB Startup Options . . . . . . . . . . . . . . . . . . . . . . 453 7.5.3 Creating InnoDB Tablespace . . . . . . . . . . . . . . . . . . 456 7.5.3.1 If Something Goes Wrong in Database Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457 7.5.4 Creating InnoDB Tables . . . . . . . . . . . . . . . . . . . . . . 457 7.5.4.1 Converting MyISAM Tables to InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 7.5.4.2 Foreign Key Constraints . . . . . . . . . . . . . . 458 7.5.5 Adding and Removing InnoDB Data and Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 7.5.6 Backing up and Recovering an InnoDB Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 7.5.6.1 Checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . 461 7.5.7 Moving an InnoDB Database to Another Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 7.5.8 InnoDB Transaction Model. . . . . . . . . . . . . . . . . . . . 461 7.5.8.1 Consistent Read . . . . . . . . . . . . . . . . . . . . . 462 7.5.8.2 Locking Reads . . . . . . . . . . . . . . . . . . . . . . . 462 7.5.8.3 Next-key Locking: Avoiding the Phantom Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463 7.5.8.4 Locks Set by Dierent SQL Statements in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 7.5.8.5 Deadlock Detection and Rollback. . . . . . 464 7.5.8.6 An Example of How the Consistent Read Works in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . 465 7.5.9 Performance Tuning Tips . . . . . . . . . . . . . . . . . . . . . 466 7.5.9.1 The InnoDB Monitor. . . . . . . . . . . . . . . . . 467 7.5.10 Implementation of Multiversioning . . . . . . . . . . . . 469 7.5.11 Table and Index Structures. . . . . . . . . . . . . . . . . . . 470 7.5.11.1 Physical Structure of an Index . . . . . . . 470 7.5.11.2 Insert Buering . . . . . . . . . . . . . . . . . . . . . 471 13. xii 7.5.11.3 Adaptive Hash Indexes . . . . . . . . . . . . . . 471 7.5.11.4 Physical Record Structure . . . . . . . . . . . 471 7.5.11.5 How an Auto-increment Column Works in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 7.5.12 File Space Management and Disk i/o. . . . . . . . . . 472 7.5.12.1 Disk i/o . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 7.5.12.2 File Space Management . . . . . . . . . . . . . 473 7.5.12.3 Defragmenting a Table . . . . . . . . . . . . . . 474 7.5.13 Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 7.5.14 Restrictions on InnoDB Tables . . . . . . . . . . . . . . . 475 7.5.15 InnoDB Contact Information . . . . . . . . . . . . . . . . . 475 7.6 BDB or Berkeley DB Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 7.6.1 Overview of BDB Tables . . . . . . . . . . . . . . . . . . . . . . 476 7.6.2 Installing BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 7.6.3 BDB startup options. . . . . . . . . . . . . . . . . . . . . . . . . . 477 7.6.4 Characteristics of BDB tables: . . . . . . . . . . . . . . . . . . 477 7.6.5 Things we need to x for BDB in the near future: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 7.6.6 Operating systems supported by BDB. . . . . . . . . . 479 7.6.7 Errors That May Occur When Using BDB Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 8 MySQL APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 8.1 MySQL PHP API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 8.1.1 Common Problems with MySQL and PHP . . . . . 481 8.2 MySQL Perl API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 8.2.1 DBI with DBD::mysql . . . . . . . . . . . . . . . . . . . . . . . . . 481 8.2.2 The DBI Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 8.2.3 More DBI/DBD Information . . . . . . . . . . . . . . . . . . . . 487 8.3 MySQL ODBC Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 8.3.1 How To Install MyODBC . . . . . . . . . . . . . . . . . . . . . 488 8.3.2 How to Fill in the Various Fields in the ODBC Administrator Program . . . . . . . . . . . . . . . . . . . . . . . . . 489 8.3.3 Connect parameters for MyODBC . . . . . . . . . . . . . 490 8.3.4 How to Report Problems with MyODBC . . . . . . . 491 8.3.5 Programs Known to Work with MyODBC . . . . . . 491 8.3.6 How to Get the Value of an AUTO_INCREMENT Column in ODBC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 8.3.7 Reporting Problems with MyODBC. . . . . . . . . . . . 496 8.4 MySQL C API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 8.4.1 C API Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 8.4.2 C API Function Overview . . . . . . . . . . . . . . . . . . . . . 500 8.4.3 C API Function Descriptions . . . . . . . . . . . . . . . . . . 504 8.4.3.1 mysql_affected_rows() . . . . . . . . . . . . . 505 8.4.3.2 mysql_close() . . . . . . . . . . . . . . . . . . . . . . 505 8.4.3.3 mysql_connect(). . . . . . . . . . . . . . . . . . . . 506 8.4.3.4 mysql_change_user() . . . . . . . . . . . . . . . 506 8.4.3.5 mysql_character_set_name(). . . . . . . . 507 14. xiii 8.4.3.6 mysql_create_db(). . . . . . . . . . . . . . . . . . 508 8.4.3.7 mysql_data_seek(). . . . . . . . . . . . . . . . . . 509 8.4.3.8 mysql_debug() . . . . . . . . . . . . . . . . . . . . . . 509 8.4.3.9 mysql_drop_db(). . . . . . . . . . . . . . . . . . . . 509 8.4.3.10 mysql_dump_debug_info() . . . . . . . . . . 510 8.4.3.11 mysql_eof() . . . . . . . . . . . . . . . . . . . . . . . 511 8.4.3.12 mysql_errno() . . . . . . . . . . . . . . . . . . . . . 512 8.4.3.13 mysql_error() . . . . . . . . . . . . . . . . . . . . . 512 8.4.3.14 mysql_escape_string() . . . . . . . . . . . . 513 8.4.3.15 mysql_fetch_field() . . . . . . . . . . . . . . 513 8.4.3.16 mysql_fetch_fields() . . . . . . . . . . . . . 514 8.4.3.17 mysql_fetch_field_direct(). . . . . . . 515 8.4.3.18 mysql_fetch_lengths() . . . . . . . . . . . . 515 8.4.3.19 mysql_fetch_row() . . . . . . . . . . . . . . . . 516 8.4.3.20 mysql_field_count() . . . . . . . . . . . . . . 517 8.4.3.21 mysql_field_seek() . . . . . . . . . . . . . . . 519 8.4.3.22 mysql_field_tell() . . . . . . . . . . . . . . . 519 8.4.3.23 mysql_free_result() . . . . . . . . . . . . . . 519 8.4.3.24 mysql_get_client_info() . . . . . . . . . . 520 8.4.3.25 mysql_get_host_info() . . . . . . . . . . . . 520 8.4.3.26 mysql_get_proto_info() . . . . . . . . . . . 521 8.4.3.27 mysql_get_server_info() . . . . . . . . . . 521 8.4.3.28 mysql_info() . . . . . . . . . . . . . . . . . . . . . . 521 8.4.3.29 mysql_init() . . . . . . . . . . . . . . . . . . . . . . 522 8.4.3.30 mysql_insert_id() . . . . . . . . . . . . . . . . 522 8.4.3.31 mysql_kill() . . . . . . . . . . . . . . . . . . . . . . 523 8.4.3.32 mysql_list_dbs(). . . . . . . . . . . . . . . . . . 524 8.4.3.33 mysql_list_fields() . . . . . . . . . . . . . . 524 8.4.3.34 mysql_list_processes() . . . . . . . . . . . 525 8.4.3.35 mysql_list_tables() . . . . . . . . . . . . . . 525 8.4.3.36 mysql_num_fields() . . . . . . . . . . . . . . . 526 8.4.3.37 mysql_num_rows(). . . . . . . . . . . . . . . . . . 527 8.4.3.38 mysql_options(). . . . . . . . . . . . . . . . . . . 528 8.4.3.39 mysql_ping() . . . . . . . . . . . . . . . . . . . . . . 530 8.4.3.40 mysql_query() . . . . . . . . . . . . . . . . . . . . . 530 8.4.3.41 mysql_real_connect() . . . . . . . . . . . . . 531 8.4.3.42 mysql_real_escape_string(). . . . . . . 533 8.4.3.43 mysql_real_query() . . . . . . . . . . . . . . . 534 8.4.3.44 mysql_reload() . . . . . . . . . . . . . . . . . . . . 535 8.4.3.45 mysql_row_seek(). . . . . . . . . . . . . . . . . . 536 8.4.3.46 mysql_row_tell(). . . . . . . . . . . . . . . . . . 536 8.4.3.47 mysql_select_db() . . . . . . . . . . . . . . . . 537 8.4.3.48 mysql_shutdown(). . . . . . . . . . . . . . . . . . 537 8.4.3.49 mysql_stat() . . . . . . . . . . . . . . . . . . . . . . 538 8.4.3.50 mysql_store_result() . . . . . . . . . . . . . 538 8.4.3.51 mysql_thread_id() . . . . . . . . . . . . . . . . 539 8.4.3.52 mysql_use_result() . . . . . . . . . . . . . . . 540 8.4.4 C Threaded Function Descriptions . . . . . . . . . . . . . 541 15. xiv 8.4.4.1 my_init() . . . . . . . . . . . . . . . . . . . . . . . . . . 541 8.4.4.2 mysql_thread_init() . . . . . . . . . . . . . . . 541 8.4.4.3 mysql_thread_end() . . . . . . . . . . . . . . . . 542 8.4.5 C Embedded Server Function Descriptions. . . . . . 542 8.4.5.1 mysql_server_init() . . . . . . . . . . . . . . . 542 8.4.5.2 mysql_server_end() . . . . . . . . . . . . . . . . 543 8.4.6 Common questions and problems when using the C API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 8.4.6.1 Why Is It that After mysql_query() Returns Success, mysql_store_result() Sometimes Returns NULL? . . . . . . . . . . . . . . . . 544 8.4.6.2 What Results Can I Get From a Query? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 8.4.6.3 How Can I Get the Unique ID for the Last Inserted Row? . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 8.4.6.4 Problems Linking with the C API . . . . . 545 8.4.7 Building Client Programs . . . . . . . . . . . . . . . . . . . . . 545 8.4.8 How to Make a Threaded Client . . . . . . . . . . . . . . . 545 8.4.9 libmysqld, the Embedded MySQL Server Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 8.4.9.1 Overview of the Embedded MySQL Server Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 8.4.9.2 Compiling Programs with libmysqld . . 547 8.4.9.3 Restrictions when using the Embedded MySQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . 548 8.4.9.4 Using Option Files with the Embedded Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 8.4.9.5 Things left to do in Embedded Server (TODO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 8.4.9.6 A Simple Embedded Server Example . . 549 8.4.9.7 Licensing the Embedded Server . . . . . . . 552 8.5 MySQL C++ APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 8.5.1 Borland C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 8.6 MySQL Java Connectivity (JDBC) . . . . . . . . . . . . . . . . . . . . . 553 8.7 MySQL Python APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 8.8 MySQL Tcl APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 8.9 MySQL Eiel wrapper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 16. xv 9 Extending MySQL. . . . . . . . . . . . . . . . . . . . . . . 554 9.1 MySQL Internals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554 9.1.1 MySQL Threads. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554 9.1.2 MySQL Test Suite. . . . . . . . . . . . . . . . . . . . . . . . . . . . 554 9.1.2.1 Running the MySQL Test Suite . . . . . . . 555 9.1.2.2 Extending the MySQL Test Suite . . . . . 555 9.1.2.3 Reporting Bugs in the MySQL Test Suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 9.2 Adding New Functions to MySQL . . . . . . . . . . . . . . . . . . . . . . 557 9.2.1 CREATE FUNCTION/DROP FUNCTION Syntax. . . . . . . 558 9.2.2 Adding a New User-denable Function . . . . . . . . . 558 9.2.2.1 UDF Calling Sequences. . . . . . . . . . . . . . . 559 9.2.2.2 Argument Processing. . . . . . . . . . . . . . . . . 561 9.2.2.3 Return Values and Error Handling . . . . 562 9.2.2.4 Compiling and Installing User-denable Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 9.2.3 Adding a New Native Function . . . . . . . . . . . . . . . . 564 9.3 Adding New Procedures to MySQL. . . . . . . . . . . . . . . . . . . . . 565 9.3.1 Procedure Analyse. . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 9.3.2 Writing a Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . 566 Appendix A Problems and Common Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 A.1 How to Determine What Is Causing Problems . . . . . . . . . . 567 A.2 Common Errors When Using MySQL . . . . . . . . . . . . . . . . . . 568 A.2.1 Access denied Error. . . . . . . . . . . . . . . . . . . . . . . . . 568 A.2.2 MySQL server has gone away Error. . . . . . . . . . . . 568 A.2.3 Cant connect to [local] MySQL server error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 A.2.4 Host ... is blocked Error. . . . . . . . . . . . . . . . . 570 A.2.5 Too many connections Error . . . . . . . . . . . . . . . . . 571 A.2.6 Some non-transactional changed tables couldnt be rolled back Error . . . . . . . . . . . . . . . . . 571 A.2.7 Out of memory Error . . . . . . . . . . . . . . . . . . . . . . . . . 572 A.2.8 Packet too large Error . . . . . . . . . . . . . . . . . . . . . . 572 A.2.9 Communication Errors / Aborted Connection . . 573 A.2.10 The table is full Error . . . . . . . . . . . . . . . . . . . . 573 A.2.11 Cant create/write to file Error . . . . . . . . . . 574 A.2.12 Commands out of sync Error in Client . . . . . . . . 574 A.2.13 Ignoring user Error. . . . . . . . . . . . . . . . . . . . . . . . 574 A.2.14 Table xxx doesnt exist Error . . . . . . . . . . . 575 A.2.15 Cant initialize character set xxx error . . 575 A.2.16 File Not Found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 A.3 Installation Related Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 A.3.1 Problems When Linking with the MySQL Client Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 A.3.2 How to Run MySQL As a Normal User . . . . . . . . 577 A.3.3 Problems with File Permissions . . . . . . . . . . . . . . . 578 17. xvi A.4 Administration Related Issues . . . . . . . . . . . . . . . . . . . . . . . . . 579 A.4.1 What To Do If MySQL Keeps Crashing. . . . . . . . 579 A.4.2 How to Reset a Forgotten Password . . . . . . . . . . . 581 A.4.3 How MySQL Handles a Full Disk. . . . . . . . . . . . . . 582 A.4.4 Where MySQL Stores Temporary Files . . . . . . . . 582 A.4.5 How to Protect or change the MySQL socket le /tmp/mysql.sock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 A.4.6 Time Zone Problems . . . . . . . . . . . . . . . . . . . . . . . . . 583 A.5 Query Related Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 A.5.1 Case Sensitivity in Searches. . . . . . . . . . . . . . . . . . . 583 A.5.2 Problems Using DATE Columns . . . . . . . . . . . . . . . . 584 A.5.3 Problems with NULL Values . . . . . . . . . . . . . . . . . . . 585 A.5.4 Problems with alias . . . . . . . . . . . . . . . . . . . . . . . . . 586 A.5.5 Deleting Rows from Related Tables. . . . . . . . . . . . 586 A.5.6 Solving Problems with No Matching Rows . . . . . 586 A.6 Table Denition Related Issues . . . . . . . . . . . . . . . . . . . . . . . . 587 A.6.1 Problems with ALTER TABLE. . . . . . . . . . . . . . . . . . . 587 A.6.2 How To Change the Order of Columns in a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 A.6.3 TEMPORARY TABLE problems . . . . . . . . . . . . . 588 Appendix B Contributed Programs. . . . . . . . . 589 B.1 APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 B.2 Clients. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 B.3 Web Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 B.4 Performance Benchmarking Tools . . . . . . . . . . . . . . . . . . . . . . 596 B.5 Authentication Tools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 B.6 Converters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 B.7 Using MySQL with Other Products . . . . . . . . . . . . . . . . . . . . 599 B.8 Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 B.9 RPMs for Common Tools (Most Are for RedHat 6.1) . . . . 600 B.10 Useful Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 B.11 Windows Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 B.12 Uncategorised . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 Appendix C Credits . . . . . . . . . . . . . . . . . . . . . . . 602 C.1 Developers at MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 C.2 Contributors to MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 C.3 Supporters to MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 18. xvii Appendix D MySQL change history . . . . . . . . 610 D.1 Changes in release 4.0.x (Development; Alpha). . . . . . . . . . 610 D.1.1 Changes in release 4.0.1 . . . . . . . . . . . . . . . . . . . . . . 610 D.1.2 Changes in release 4.0.0 . . . . . . . . . . . . . . . . . . . . . . 610 D.2 Changes in release 3.23.x (Stable). . . . . . . . . . . . . . . . . . . . . . 612 D.2.1 Changes in release 3.23.45 . . . . . . . . . . . . . . . . . . . . 612 D.2.2 Changes in release 3.23.44 . . . . . . . . . . . . . . . . . . . . 612 D.2.3 Changes in release 3.23.43 . . . . . . . . . . . . . . . . . . . . 614 D.2.4 Changes in release 3.23.42 . . . . . . . . . . . . . . . . . . . . 614 D.2.5 Changes in release 3.23.41 . . . . . . . . . . . . . . . . . . . . 615 D.2.6 Changes in release 3.23.40 . . . . . . . . . . . . . . . . . . . . 615 D.2.7 Changes in release 3.23.39 . . . . . . . . . . . . . . . . . . . . 616 D.2.8 Changes in release 3.23.38 . . . . . . . . . . . . . . . . . . . . 617 D.2.9 Changes in release 3.23.37 . . . . . . . . . . . . . . . . . . . . 617 D.2.10 Changes in release 3.23.36 . . . . . . . . . . . . . . . . . . . 618 D.2.11 Changes in release 3.23.35 . . . . . . . . . . . . . . . . . . . 619 D.2.12 Changes in release 3.23.34a . . . . . . . . . . . . . . . . . . 619 D.2.13 Changes in release 3.23.34 . . . . . . . . . . . . . . . . . . . 619 D.2.14 Changes in release 3.23.33 . . . . . . . . . . . . . . . . . . . 620 D.2.15 Changes in release 3.23.32 . . . . . . . . . . . . . . . . . . . 621 D.2.16 Changes in release 3.23.31 . . . . . . . . . . . . . . . . . . . 622 D.2.17 Changes in release 3.23.30 . . . . . . . . . . . . . . . . . . . 622 D.2.18 Changes in release 3.23.29 . . . . . . . . . . . . . . . . . . . 623 D.2.19 Changes in release 3.23.28 . . . . . . . . . . . . . . . . . . . 625 D.2.20 Changes in release 3.23.27 . . . . . . . . . . . . . . . . . . . 626 D.2.21 Changes in release 3.23.26 . . . . . . . . . . . . . . . . . . . 627 D.2.22 Changes in release 3.23.25 . . . . . . . . . . . . . . . . . . . 628 D.2.23 Changes in release 3.23.24 . . . . . . . . . . . . . . . . . . . 629 D.2.24 Changes in release 3.23.23 . . . . . . . . . . . . . . . . . . . 629 D.2.25 Changes in release 3.23.22 . . . . . . . . . . . . . . . . . . . 631 D.2.26 Changes in release 3.23.21 . . . . . . . . . . . . . . . . . . . 631 D.2.27 Changes in release 3.23.20 . . . . . . . . . . . . . . . . . . . 632 D.2.28 Changes in release 3.23.19 . . . . . . . . . . . . . . . . . . . 632 D.2.29 Changes in release 3.23.18 . . . . . . . . . . . . . . . . . . . 632 D.2.30 Changes in release 3.23.17 . . . . . . . . . . . . . . . . . . . 633 D.2.31 Changes in release 3.23.16 . . . . . . . . . . . . . . . . . . . 633 D.2.32 Changes in release 3.23.15 . . . . . . . . . . . . . . . . . . . 634 D.2.33 Changes in release 3.23.14 . . . . . . . . . . . . . . . . . . . 635 D.2.34 Changes in release 3.23.13 . . . . . . . . . . . . . . . . . . . 635 D.2.35 Changes in release 3.23.12 . . . . . . . . . . . . . . . . . . . 636 D.2.36 Changes in release 3.23.11 . . . . . . . . . . . . . . . . . . . 636 D.2.37 Changes in release 3.23.10 . . . . . . . . . . . . . . . . . . . 637 D.2.38 Changes in release 3.23.9 . . . . . . . . . . . . . . . . . . . . 637 D.2.39 Changes in release 3.23.8 . . . . . . . . . . . . . . . . . . . . 638 D.2.40 Changes in release 3.23.7 . . . . . . . . . . . . . . . . . . . . 639 D.2.41 Changes in release 3.23.6 . . . . . . . . . . . . . . . . . . . . 639 D.2.42 Changes in release 3.23.5 . . . . . . . . . . . . . . . . . . . . 640 D.2.43 Changes in release 3.23.4 . . . . . . . . . . . . . . . . . . . . 641 19. xviii D.2.44 Changes in release 3.23.3 . . . . . . . . . . . . . . . . . . . . 641 D.2.45 Changes in release 3.23.2 . . . . . . . . . . . . . . . . . . . . 642 D.2.46 Changes in release 3.23.1 . . . . . . . . . . . . . . . . . . . . 643 D.2.47 Changes in release 3.23.0 . . . . . . . . . . . . . . . . . . . . 643 D.3 Changes in release 3.22.x (Older; Still supported) . . . . . . . 645 D.3.1 Changes in release 3.22.35 . . . . . . . . . . . . . . . . . . . . 645 D.3.2 Changes in release 3.22.34 . . . . . . . . . . . . . . . . . . . . 645 D.3.3 Changes in release 3.22.33 . . . . . . . . . . . . . . . . . . . . 645 D.3.4 Changes in release 3.22.32 . . . . . . . . . . . . . . . . . . . . 645 D.3.5 Changes in release 3.22.31 . . . . . . . . . . . . . . . . . . . . 646 D.3.6 Changes in release 3.22.30 . . . . . . . . . . . . . . . . . . . . 646 D.3.7 Changes in release 3.22.29 . . . . . . . . . . . . . . . . . . . . 646 D.3.8 Changes in release 3.22.28 . . . . . . . . . . . . . . . . . . . . 646 D.3.9 Changes in release 3.22.27 . . . . . . . . . . . . . . . . . . . . 647 D.3.10 Changes in release 3.22.26 . . . . . . . . . . . . . . . . . . . 647 D.3.11 Changes in release 3.22.25 . . . . . . . . . . . . . . . . . . . 647 D.3.12 Changes in release 3.22.24 . . . . . . . . . . . . . . . . . . . 647 D.3.13 Changes in release 3.22.23 . . . . . . . . . . . . . . . . . . . 648 D.3.14 Changes in release 3.22.22 . . . . . . . . . . . . . . . . . . . 648 D.3.15 Changes in release 3.22.21 . . . . . . . . . . . . . . . . . . . 648 D.3.16 Changes in release 3.22.20 . . . . . . . . . . . . . . . . . . . 649 D.3.17 Changes in release 3.22.19 . . . . . . . . . . . . . . . . . . . 649 D.3.18 Changes in release 3.22.18 . . . . . . . . . . . . . . . . . . . 649 D.3.19 Changes in release 3.22.17 . . . . . . . . . . . . . . . . . . . 649 D.3.20 Changes in release 3.22.16 . . . . . . . . . . . . . . . . . . . 649 D.3.21 Changes in release 3.22.15 . . . . . . . . . . . . . . . . . . . 650 D.3.22 Changes in release 3.22.14 . . . . . . . . . . . . . . . . . . . 650 D.3.23 Changes in release 3.22.13 . . . . . . . . . . . . . . . . . . . 650 D.3.24 Changes in release 3.22.12 . . . . . . . . . . . . . . . . . . . 651 D.3.25 Changes in release 3.22.11 . . . . . . . . . . . . . . . . . . . 651 D.3.26 Changes in release 3.22.10 . . . . . . . . . . . . . . . . . . . 652 D.3.27 Changes in release 3.22.9 . . . . . . . . . . . . . . . . . . . . 652 D.3.28 Changes in release 3.22.8 . . . . . . . . . . . . . . . . . . . . 653 D.3.29 Changes in release 3.22.7 . . . . . . . . . . . . . . . . . . . . 653 D.3.30 Changes in release 3.22.6 . . . . . . . . . . . . . . . . . . . . 654 D.3.31 Changes in release 3.22.5 . . . . . . . . . . . . . . . . . . . . 654 D.3.32 Changes in release 3.22.4 . . . . . . . . . . . . . . . . . . . . 656 D.3.33 Changes in release 3.22.3 . . . . . . . . . . . . . . . . . . . . 657 D.3.34 Changes in release 3.22.2 . . . . . . . . . . . . . . . . . . . . 657 D.3.35 Changes in release 3.22.1 . . . . . . . . . . . . . . . . . . . . 657 D.3.36 Changes in release 3.22.0 . . . . . . . . . . . . . . . . . . . . 658 D.4 Changes in release 3.21.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659 D.4.1 Changes in release 3.21.33 . . . . . . . . . . . . . . . . . . . . 659 D.4.2 Changes in release 3.21.32 . . . . . . . . . . . . . . . . . . . . 660 D.4.3 Changes in release 3.21.31 . . . . . . . . . . . . . . . . . . . . 660 D.4.4 Changes in release 3.21.30 . . . . . . . . . . . . . . . . . . . . 660 D.4.5 Changes in release 3.21.29 . . . . . . . . . . . . . . . . . . . . 661 D.4.6 Changes in release 3.21.28 . . . . . . . . . . . . . . . . . . . . 661 20. xix D.4.7 Changes in release 3.21.27 . . . . . . . . . . . . . . . . . . . . 661 D.4.8 Changes in release 3.21.26 . . . . . . . . . . . . . . . . . . . . 662 D.4.9 Changes in release 3.21.25 . . . . . . . . . . . . . . . . . . . . 662 D.4.10 Changes in release 3.21.24 . . . . . . . . . . . . . . . . . . . 662 D.4.11 Changes in release 3.21.23 . . . . . . . . . . . . . . . . . . . 663 D.4.12 Changes in release 3.21.22 . . . . . . . . . . . . . . . . . . . 663 D.4.13 Changes in release 3.21.21a . . . . . . . . . . . . . . . . . . 664 D.4.14 Changes in release 3.21.21 . . . . . . . . . . . . . . . . . . . 664 D.4.15 Changes in release 3.21.20 . . . . . . . . . . . . . . . . . . . 664 D.4.16 Changes in release 3.21.19 . . . . . . . . . . . . . . . . . . . 665 D.4.17 Changes in release 3.21.18 . . . . . . . . . . . . . . . . . . . 665 D.4.18 Changes in release 3.21.17 . . . . . . . . . . . . . . . . . . . 665 D.4.19 Changes in release 3.21.16 . . . . . . . . . . . . . . . . . . . 666 D.4.20 Changes in release 3.21.15 . . . . . . . . . . . . . . . . . . . 666 D.4.21 Changes in release 3.21.14b . . . . . . . . . . . . . . . . . . 667 D.4.22 Changes in release 3.21.14a . . . . . . . . . . . . . . . . . . 667 D.4.23 Changes in release 3.21.13 . . . . . . . . . . . . . . . . . . . 667 D.4.24 Changes in release 3.21.12 . . . . . . . . . . . . . . . . . . . 668 D.4.25 Changes in release 3.21.11 . . . . . . . . . . . . . . . . . . . 669 D.4.26 Changes in release 3.21.10 . . . . . . . . . . . . . . . . . . . 669 D.4.27 Changes in release 3.21.9 . . . . . . . . . . . . . . . . . . . . 669 D.4.28 Changes in release 3.21.8 . . . . . . . . . . . . . . . . . . . . 670 D.4.29 Changes in release 3.21.7 . . . . . . . . . . . . . . . . . . . . 670 D.4.30 Changes in release 3.21.6 . . . . . . . . . . . . . . . . . . . . 671 D.4.31 Changes in release 3.21.5 . . . . . . . . . . . . . . . . . . . . 671 D.4.32 Changes in release 3.21.4 . . . . . . . . . . . . . . . . . . . . 671 D.4.33 Changes in release 3.21.3 . . . . . . . . . . . . . . . . . . . . 671 D.4.34 Changes in release 3.21.2 . . . . . . . . . . . . . . . . . . . . 672 D.4.35 Changes in release 3.21.0 . . . . . . . . . . . . . . . . . . . . 673 D.5 Changes in release 3.20.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674 D.5.1 Changes in release 3.20.18 . . . . . . . . . . . . . . . . . . . . 674 D.5.2 Changes in release 3.20.17 . . . . . . . . . . . . . . . . . . . . 675 D.5.3 Changes in release 3.20.16 . . . . . . . . . . . . . . . . . . . . 675 D.5.4 Changes in release 3.20.15 . . . . . . . . . . . . . . . . . . . . 676 D.5.5 Changes in release 3.20.14 . . . . . . . . . . . . . . . . . . . . 676 D.5.6 Changes in release 3.20.13 . . . . . . . . . . . . . . . . . . . . 677 D.5.7 Changes in release 3.20.11 . . . . . . . . . . . . . . . . . . . . 677 D.5.8 Changes in release 3.20.10 . . . . . . . . . . . . . . . . . . . . 677 D.5.9 Changes in release 3.20.9 . . . . . . . . . . . . . . . . . . . . . 678 D.5.10 Changes in release 3.20.8 . . . . . . . . . . . . . . . . . . . . 678 D.5.11 Changes in release 3.20.7 . . . . . . . . . . . . . . . . . . . . 678 D.5.12 Changes in release 3.20.6 . . . . . . . . . . . . . . . . . . . . 679 D.5.13 Changes in release 3.20.3 . . . . . . . . . . . . . . . . . . . . 680 D.5.14 Changes in release 3.20.0 . . . . . . . . . . . . . . . . . . . . 680 D.6 Changes in release 3.19.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 D.6.1 Changes in release 3.19.5 . . . . . . . . . . . . . . . . . . . . . 681 D.6.2 Changes in release 3.19.4 . . . . . . . . . . . . . . . . . . . . . 681 D.6.3 Changes in release 3.19.3 . . . . . . . . . . . . . . . . . . . . . 682 21. xx Appendix E Comments on Porting to Other Systems. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 E.1 Debugging a MySQL server. . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 E.1.1 Compiling MYSQL for debugging . . . . . . . . . . . . . 684 E.1.2 Creating trace les . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 E.1.3 Debugging mysqld under gdb . . . . . . . . . . . . . . . . . 686 E.1.4 Using a stack trace . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 E.1.5 Using log les to nd cause of errors in mysqld. . 688 E.1.6 Making a test case when you experience table corruption. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688 E.2 Debugging a MySQL client . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 E.3 The DBUG package. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 E.4 Locking methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 E.5 Comments about RTS threads . . . . . . . . . . . . . . . . . . . . . . . . . 692 E.6 Dierences between dierent thread packages . . . . . . . . . . . 694 Appendix F Environment Variables. . . . . . . . . 695 Appendix G Description of MySQL regular expression syntax. . . . . . . . . . . . . . . . . . . . . . . 696 Appendix H GNU GENERAL PUBLIC LICENSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699 H.1 Preamble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699 H.2 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION . . . . . . . . . . . . . . . 700 H.3 How to Apply These Terms to Your New Programs . . . . . 704 Appendix I GNU LESSER GENERAL PUBLIC LICENSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705 I.1 Preamble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705 I.2 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION . . . . . . . . . . . . . . . 706 I.3 How to Apply These Terms to Your New Libraries . . . . . . . 713 SQL command, type and function index . . . . . . 714 Concept Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723 22. Chapter 1: General Information About MySQL 1 1 General Information About MySQL MySQL (TM) is a very fast, multi-threaded, multi-user, and robust SQL (Structured Query Language) database server. MySQL is intended for mission-critical, heavy load production systems as well as for embedding into mass-deployed software. MySQL is a trademark of MySQL AB. MySQL has Dual licensing, you can use MySQL free of charge under the GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/). You can also purchase commercial MySQL licenses from MySQL AB if you do not wish to be bound by the terms of the GPL. See Section 1.4 [Licensing and Support], page 15. The MySQL web site (http://www.mysql.com/) provides the latest information about MySQL. The following list describes some useful sections of the manual: For information about the company behind MySQL, see Section 1.3 [What is MySQL AB], page 11. For a discussion of MySQLs capabilities, see Section 1.2.2 [Features], page 5. For installation instructions, see Chapter 2 [Installing], page 51. For tips on porting MySQL to new architectures or operating systems, see Appendix E [Porting], page 683. For information about upgrading from a Version 3.23 release, see Section 2.5.1 [Upgrading-from-3.23], page 88. For information about upgrading from a Version 3.22 release, see Section 2.5.2 [Upgrading-from-3.22], page 88. For a tutorial introduction to MySQL, see Chapter 3 [Tutorial], page 128. For examples of SQL and benchmarking information, see the benchmarking directory (sql-bench in the distribution). For a history of new features and bug xes, see Appendix D [News], page 610. For a list of currently known bugs and misfeatures, see Section 1.7.5 [Bugs], page 40. For future plans, see Section 1.8 [TODO], page 43. For a list of all the contributors to this project, see Appendix C [Credits], page 602. IMPORTANT: Reports of errors (often called bugs), as well as questions and comments, should be sent to the mailing list at [email protected]. See Section 1.6.2.3 [Bug reports], page 26. The mysqlbug script should be used to generate bug reports. For source distributions, the mysqlbug script can be found in the scripts directory. For binary distributions, mysqlbug can be found in the bin directory. If you have found a sensitive security bug in MySQL, you should send an e-mail to [email protected]. 23. 2 MySQL Technical Reference for Version 4.0.1-alpha 1.1 About This Manual This is the MySQL reference manual; it documents MySQL Version 4.0.1-alpha. Being a reference manual, it does not provide general instruction on SQL or relational database concepts. As MySQL is work in progress, the manual gets updated frequently. The most recent version of this manual is available at http://www.mysql.com/documentation/ in many dierent formats, currently there are Texinfo, plain text, Info, HTML, PostScript, and PDF versions. The primary document is the Texinfo le. The HTML version is produced automatically using a modied version of texi2html. The plain text and Info versions are produced with makeinfo. The Postscript version is produced using texi2dvi and dvips. The PDF version is produced with pdftex. If you have a hard time nding information in the manual, you can try our searchable PHP version at http://www.mysql.com/doc/. If you have any suggestions concerning additions or corrections to this manual, please send them to the manual team at [email protected]. This manual is written and maintained by David Axmark, Michael (Monty) Widenius, Jeremy Cole, Arjen Lentz, and Paul DuBois. For other contributors, see Appendix C [Credits], page 602. The copyright (2001) to this manual is owned by the Swedish company MySQL AB. See Section 1.4.2 [Copyright], page 16. 1.1.1 Conventions Used in This Manual This manual uses certain typographical conventions: constant Constant-width font is used for command names and options; SQL statements; database, table and column names; C and Perl code; and environment variables. Example: To see how mysqladmin works, invoke it with the --help option. filename Constant-width font with surrounding quotes is used for lenames and path- names. Example: The distribution is installed under the /usr/local/ direc- tory. c Constant-width font with surrounding quotes is also used to indicate character sequences. Example: To specify a wild card, use the % character. italic Italic font is used for emphasis, like this. boldface Boldface font is used for access privilege names (for example, do not grant the process privilege lightly) and occasionally to convey especially strong empha- sis. When commands are shown that are meant to be executed by a particular program, the program is indicated by a prompt shown before the command. For example, shell> indi- cates a command that you execute from your login shell, and mysql> indicates a command that you execute from the mysql client program: 24. Chapter 1: General Information About MySQL 3 shell> type a shell command here mysql> type a mysql command here Shell commands are shown using Bourne shell syntax. If you are using a csh-style shell, you may need to issue commands slightly dierently. For example, the sequence to set an environment variable and run a command looks like this in Bourne shell syntax: shell> VARNAME=value some_command For csh, you would execute the sequence like this: shell> setenv VARNAME value shell> some_command Often database, table, and column names must be substituted into commands. To indicate that such substitution is necessary, this manual uses db_name, tbl_name and col_name. For example, you might see a statement like this: mysql> SELECT col_name FROM db_name.tbl_name; This means that if you were to enter a similar statement, you would supply your own database, table, and column names, perhaps like this: mysql> SELECT author_name FROM biblio_db.author_list; SQL statements may be written in uppercase or lowercase. When this manual shows a SQL statement, uppercase is used for particular keywords if those keywords are under discussion (to emphasize them) and lowercase is used for the rest of the statement. For example, you might see the following in a discussion of the SELECT statement: mysql> SELECT count(*) FROM tbl_name; On the other hand, in a discussion of the COUNT() function, the same statement would be written like this: mysql> select COUNT(*) from tbl_name; If no particular emphasis is intended, all keywords are written uniformly in uppercase. In syntax descriptions, square brackets ([ and ]) are used to indicate optional words or clauses: DROP TABLE [IF EXISTS] tbl_name When a syntax element consists of a number of alternatives, the alternatives are separated by vertical bars (|). When one member from a set of choices may be chosen, the alternatives are listed within square brackets ([ and ]): TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) When one member from a set of choices must be chosen, the alternatives are listed within braces ({ and }): {DESCRIBE | DESC} tbl_name {col_name | wild} 1.2 What Is MySQL MySQL, the most popular Open Source SQL database, is developed and provided by MySQL AB. MySQL AB is a commercial company that builds its business providing services around the MySQL database. See Section 1.3 [What is MySQL AB], page 11. The MySQL web site (http://www.mysql.com/) provides the latest information about MySQL and MySQL AB. 25. 4 MySQL Technical Reference for Version 4.0.1-alpha MySQL is a database management system. A database is a structured collection of data. It may be anything from a sim- ple shopping list to a picture gallery or the vast amounts of information in a corporate network. To add, access, and process data stored in a computer database, you need a database management system such as MySQL. Since com- puters are very good at handling large amounts of data, database management plays a central role in computing, as stand-alone utilities, or as parts of other applications. MySQL is a relational database management system. A relational database stores data in separate tables rather than putting all the data in one big storeroom. This adds speed and exibility. The tables are linked by dened relations making it possible to combine data from several tables on request. The SQL part of MySQL stands for "Structured Query Language" - the most common standardised language used to access databases. MySQL is Open Source Software. Open Source means that it is possible for anyone to use and modify. Any- body can download MySQL from the Internet and use it without paying anything. Anybody so inclined can study the source code and change it to t their needs. MySQL uses the GPL (GNU General Public License) http://www.gnu.org/licenses/, to dene what you may and may not do with the software in dierent situations. If you feel uncomfortable with the GPL or need to embed MySQL into a commercial application you can buy a commercially licensed version from us. See Section 1.4.3 [MySQL server licenses], page 17. Why use MySQL? MySQL is very fast, reliable, and easy to use. If that is what you are looking for, you should give it a try. MySQL also has a practical set of features developed in close cooperation with our users. You can nd a performance comparison of MySQL to some other database managers on our benchmark page. See Section 5.1.4 [MySQL Benchmarks], page 303. MySQL was originally developed to handle large databases much faster than ex- isting solutions and has been successfully used in highly demanding production environments for several years. Though under constant development, MySQL today oers a rich and useful set of functions. The connectivity, speed, and security make MySQL highly suited for accessing databases on the Internet. The technical features of MySQL For advanced technical information, see Chapter 6 [Reference], page 340. MySQL is a client/server system that consists of a multi-threaded SQL server that supports dierent backends, several dierent client programs and libraries, administrative tools, and several programming interfaces. We also provide MySQL as a multi-threaded library which you can link into your application to get a smaller, faster, easier to manage product. MySQL has a lot of contributed software available. It is very likely that you will nd that your favorite application or language already supports MySQL. 26. Chapter 1: General Information About MySQL 5 The ocial way to pronounce MySQL is My Ess Que Ell (not my sequel), but we dont mind if you pronounce it as my sequel or in some other localised way. 1.2.1 History of MySQL We once started out with the intention of using mSQL to connect to our tables using our own fast low-level (ISAM) routines. However, after some testing we came to the conclusion that mSQL was not fast enough nor exible enough for our needs. This resulted in a new SQL interface to our database but with almost the same API interface as mSQL. This API was chosen to ease porting of third-party code. The derivation of the name MySQL is not perfectly clear. Our base directory and a large number of our libraries and tools have had the prex my for well over 10 years. However, Montys daughter (some years younger) is also named My. Which of the two gave its name to MySQL is still a mystery, even for us. 1.2.2 The Main Features of MySQL The following list describes some of the important characteristics of MySQL. See Section 1.5 [MySQL 4.0 In A Nutshell], page 20. Internals and Portability Written in C and C++. Tested with a broad range of dierent compilers. No memory leaks. MySQL has been tested with Purify, a commercial memory leakage detector. Works on many dierent platforms. See Section 2.2.2 [Which OS], page 58. Uses GNU Automake, Autoconf, and Libtool for portability. APIs for C, C++, Eiel, Java, Perl, PHP, Python and Tcl. See Chapter 8 [Clients], page 481. Fully multi-threaded using kernel threads. This means it can easily use multiple CPUs if available. Very fast B-tree disk tables with index compression. A very fast thread-based memory allocation system. Very fast joins using an optimised one-sweep multi-join. In-memory hash tables which are used as temporary tables. SQL functions are implemented through a highly optimised class library and should be as fast as possible! Usually there isnt any memory allocation at all after query initialisation. Column Types Many column types: signed/unsigned integers 1, 2, 3, 4, and 8 bytes long, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, and ENUM types. See Section 6.2 [Column types], page 347. 27. 6 MySQL Technical Reference for Version 4.0.1-alpha Fixed-length and variable-length records. All columns have default values. You can use INSERT to insert a subset of a tables columns; those columns that are not explicitly given values are set to their default values. Commands and Functions Full operator and function support in the SELECT and WHERE parts of queries. For example: mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name WHERE income/dependents > 10000 AND age > 30; Full support for SQL GROUP BY and ORDER BY clauses. Support for group functions (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX() and MIN()). Support for LEFT OUTER JOIN and RIGHT OUTER JOIN with ANSI SQL and ODBC syntax. Aliases on tables and columns are allowed as in the SQL92 standard. DELETE, INSERT, REPLACE, and UPDATE return the number of rows that were changed (aected). It is possible to return the number of rows matched instead by setting a ag when connecting to the server. The MySQL-specic SHOW command can be used to retrieve information about databases, tables, and indexes. The EXPLAIN command can be used to determine how the optimiser resolves a query. Function names do not clash with table or column names. For example, ABS is a valid column name. The only restriction is that for a function call, no spaces are allowed between the function name and the ( that follows it. See Section 6.1.6 [Reserved words], page 346. You can mix tables from dierent databases in the same query (as of Ver- sion 3.22). Security A privilege and password system that is very exible and secure, and allows host-based verication. Passwords are secure because all password trac is encrypted when you connect to a server. Scalability and Limits Handles large databases. We are using MySQL with some databases that contain 50,000,000 records and we know of users that uses MySQL with 60,000 tables and about 5,000,000,000 rows. Up to 32 indexes per table are allowed. Each index may consist of 1 to 16 columns or parts of columns. The maximum index width is 500 bytes (this may be changed when compiling MySQL). An index may use a prex of a CHAR or VARCHAR eld. Connectivity Clients may connect to the MySQL server using TCP/IP Sockets, Unix Sockets (Unix), or Named Pipes (NT). 28. Chapter 1: General Information About MySQL 7 ODBC (Open-DataBase-Connectivity) support for Win32 (with source). All ODBC 2.5 functions and many others. For example, you can use MS Access to connect to your MySQL server. See Section 8.3 [ODBC], page 488. Localisation The server can provide error messages to clients in many languages. See Section 4.6.2 [Languages], page 244. Full support for several dierent character sets, including ISO-8859-1 (Latin1), german, big5, ujis, and more. For example, the Scandinavian characters , and are allowed in table and column names. All data is saved in the chosen character set. All comparisons for normal string columns are case insensitive. Sorting is done according to the chosen character set (the Swedish way by default). It is possible to change this when the MySQL server is started up. To see an example of very advanced sorting, look at the Czech sorting code. MySQL supports many dierent character sets that can be specied at compile and run time. Clients and Tools Includes myisamchk, a very fast utility for table checking, optimisation, and repair. All of the functionality of myisamchk is also available through the SQL interface as well. See Chapter 4 [MySQL Database Administration], page 164. All MySQL programs can be invoked with the --help or -? options to obtain online assistance. 1.2.3 How Stable Is MySQL? This section addresses the questions How stable is MySQL? and Can I depend on MySQL in this project? We will try to clarify these issues and answer some important questions that concern many potential users. The information in this section is based on data gathered from the mailing list, which is very active in identifying problems as well as reporting types of use. Original code stems back from the early 80s, providing a stable code base, and the ISAM table format remains backwards compatible. At TcX, the predecessor of MySQL AB, MySQL has worked in projects since mid-1996, without any problems. When MySQL was released to a wider public, we noticed that there were some pieces of untested code that were quickly found by the new users who made dierent types of queries from us. Each new release has had fewer portability problems (even though each new release has had many new features). Each release of MySQL has been usable. There have only been problems when users try code from the gray zones. Naturally, new users dont know what the gray zones are; this section attempts to indicate those that are currently known. The descriptions mostly deal with Version 3.23 of MySQL. All known and reported bugs are xed in the latest 29. 8 MySQL Technical Reference for Version 4.0.1-alpha version, with the exception of those listed in the bugs section, which are things that are design-related. See Section 1.7.5 [Bugs], page 40. MySQL design is multi-layered with independent modules. Some of the newer modules are listed below with an indication of how well-tested each of them is: Replication Gamma Large server clusters using replication are in production use, with good results. Work on enhanced replication features is continuing in MySQL 4.0. InnoDB tables Gamma While the InnoDB transactional table handler is a fairly recent addition to MySQL, it appears to work well and is already being used in some large, heavy load production systems. BDB tables Gamma The Berkeley DB code is very stable, but we are still improving the BDB trans- actional table handler interface in MySQL, so it will take some time before this is as well tested as the other table types. FULLTEXT Beta Full text search works but is not yet widely used. Important enhancements are being implemented for MySQL 4.0. MyODBC 2.50 (uses ODBC SDK 2.5) Gamma Increasingly in wide use. Some issues brought up appear to be application related and independent of the ODBC driver or underlying database server. Automatic recovery of MyISAM tables Gamma This status only regards the new code in the MyISAM table handler that checks if the table was closed properly on open and executes an automatic check/repair of the table if it wasnt. Bulk-insert Alpha New feature in MyISAM tables in MySQL 4.0 for faster insert of many rows. Locking Gamma This is very system-dependent. On some systems there are big problems using standard OS locking (fcntl()). In these cases, you should run mysqld with the --skip-locking ag. Problems are known to occur on some Linux systems, and on SunOS when using NFS-mounted le systems. MySQL AB provides high-quality support for paying customers, but the MySQL mailing list usually provides answers to common questions. Bugs are usually xed right away with a patch; for serious bugs, there is almost always a new release. 1.2.4 How Big Can MySQL Tables Be? MySQL Version 3.22 has a 4G limit on table size. With the new MyISAM table type in MySQL Version 3.23, the maximum table size is pushed up to 8 million terabytes (2 ^ 63 bytes). 30. Chapter 1: General Information About MySQL 9 Note, however, that operating systems have their own le size limits. Here are some exam- ples: Operating System File Size Limit Linux-Intel 32 bit 2G, 4G or more, depends on Linux version Linux-Alpha 8T (?) Solaris 2.5.1 2G (possible 4G with patch) Solaris 2.6 4G Solaris 2.7 Intel 4G Solaris 2.7 ULTRA-SPARC 8T (?) On Linux 2.2 you can get bigger tables than 2G by using the LFS patch for the ext2 le system. On Linux 2.4 there exists also patches for ReiserFS to get support for big les. This means that the table size for MySQL is normally limited by the operating system. By default, MySQL tables have a maximum size of about 4G. You can check the maximum table size for a table with the SHOW TABLE STATUS command or with the myisamchk -dv table_name. See Section 4.5.5 [SHOW], page 229. If you need bigger tables than 4G (and your operating system supports this), you should set the AVG_ROW_LENGTH and MAX_ROWS parameter when you create your table. See Sec- tion 6.5.3 [CREATE TABLE], page 420. You can also set these later with ALTER TABLE. See Section 6.5.4 [ALTER TABLE], page 428. If your big table is going to be read-only, you could use myisampack to merge and compress many tables to one. myisampack usually compresses a table by at least 50%, so you can have, in eect, much bigger tables. See Section 4.7.4 [myisampack], page 254. You can go around the operating system le limit for MyISAM data les by using the RAID option. See Section 6.5.3 [CREATE TABLE], page 420. Another solution can be the included MERGE library, which allows you to handle a collec- tion of identical tables as one. See Section 7.2 [MERGE], page 448. 1.2.5 Year 2000 Compliance MySQL itself has no problems with Year 2000 (Y2K) compliance: MySQL uses Unix time functions and has no problems with dates until 2069; all 2-digit years are regarded to be in the range 1970 to 2069, which means that if you store 01 in a year column, MySQL treats it as 2001. All MySQL date functions are stored in one le sql/time.cc and coded very carefully to be year 2000-safe. In MySQL Version 3.22 and later, the new YEAR column type can store years 0 and 1901 to 2155 in 1 byte and display them using 2 or 4 digits. You may run into problems with applications that use MySQL in a way that is not Y2K- safe. For example, many old applications store or manipulate years using 2-digit values (which are ambiguous) rather than 4-digit values. This problem may be compounded by applications that use values such as 00 or 99 as missing value indicators. 31. 10 MySQL Technical Reference for Version 4.0.1-alpha Unfortunately, these problems may be dicult to x, because dierent applications may be written by dierent programmers, each of whom may use a dierent set of conventions and date-handling functions. Here is a simple demonstration illustrating that MySQL doesnt have any problems with dates until the year 2030: mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO y2k VALUES -> ("1998-12-31","1998-12-31 23:59:59",19981231235959), -> ("1999-01-01","1999-01-01 00:00:00",19990101000000), -> ("1999-09-09","1999-09-09 23:59:59",19990909235959), -> ("2000-01-01","2000-01-01 00:00:00",20000101000000), -> ("2000-02-28","2000-02-28 00:00:00",20000228000000), -> ("2000-02-29","2000-02-29 00:00:00",20000229000000), -> ("2000-03-01","2000-03-01 00:00:00",20000301000000), -> ("2000-12-31","2000-12-31 23:59:59",20001231235959), -> ("2001-01-01","2001-01-01 00:00:00",20010101000000), -> ("2004-12-31","2004-12-31 23:59:59",20041231235959), -> ("2005-01-01","2005-01-01 00:00:00",20050101000000), -> ("2030-01-01","2030-01-01 00:00:00",20300101000000), -> ("2050-01-01","2050-01-01 00:00:00",20500101000000); Query OK, 13 rows affected (0.01 sec) Records: 13 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec) 32. Chapter 1: General Information About MySQL 11 This shows that the DATE and DATETIME types will not give any problems with future dates (they handle dates until the year 9999). The TIMESTAMP type, which is used to store the current time, has a range up to only 2030- 01-01. TIMESTAMP has a range of 1970 to 2030 on 32-bit machines (signed value). On 64-bit machines it handles times up to 2106 (unsigned value). Even though MySQL is Y2K-compliant, it is your responsibility to provide unambiguous input. See Section 6.2.2.1 [Y2K issues], page 355 for MySQLs rules for dealing with am- biguous date input data (data co