##  : mysql 3.21 Reference Manual PostScript Ŵ  ###
5, 6, 9, 10, 11, 12, 13, 15, 17, 18  : (taejun@hitel.net)
18  C-API κ  : ǿ (golmong@cre.co.kr) 
̸ : taejun@hitel.net, taejun@taejun.pe.kr
 : http://taejun.pe.kr (Mysql  ڷᰡ  ֽϴ)
                            -           -
5. mysql ǥ ȣȯ                                        
     5.1 mysql ANSI SQL92 Ȯκ                       
     5.2 MYSQL                                 
          5.2.1 Sub-selects                                    
          5.2.2 SELECT INTO TABLE                        
          5.2.3 Ʈ(Transactions)                         
          5.2.4  ν Ʈ                         
          5.2.5 ܷŰ(Foreign Keys)                          
               5.2.5.1 ܷŰ  ʴ              
          5.2.6                                              
          5.2.7 `--'  ּ                             
     5.3 Mysql  ִ ǥ ΰ?                
     5.4 BLOB  TEXT Ÿ                          
     5.5 COMMIT-ROLLBACK  ġ  ?  
6. Mysql   ý                                    
     6.1  ý̶ ΰ?                            
     6.2 mysql  ϱ                               
          6.2.1 йȣ                            
     6.3 mysql ϴ                              
     6.4  ý ۵                                 
     6.5  ,                                           
     6.6  , 2ܰ : û                           
     6.7                                    
     6.8 ʱ mysql Ѽ                                 
     6.9 mysql ο   ߰ϱ                 
     6.10 йȣ                                    
     6.11  ź                             
     6.12 ũĿ Ͽ mysql ϰ ϴ        
7. MySQL language reference.                                
     7.1 Literals: how to write strings and numbers           
          7.1.1 Strings                                       
          7.1.2 Numbers                                      
          7.1.3 Hexadecimal values                            
          7.1.4 NULL values                                  
          7.1.5 Database, table, index, column and alias names 
               7.1.5.1 Case sensitivity in names               
     7.2 Column types                                        
          7.2.1 Column type storage requirements              
          7.2.2 Numeric types                                
          7.2.3 Date and time types                           
          7.2.4 String types                                   
          7.2.5 Numeric types                                
          7.2.6 Date and time types                           
               7.2.6.1 Y2K issues and date types              
               7.2.6.2 The DATETIME, DATE 
                                    and TIMESTAMP types  
               7.2.6.3 The TIME type                         
               7.2.6.4 The YEAR type                        
          7.2.7 String types                                  
               7.2.7.1 The CHAR and VARCHAR types       
               7.2.7.2 The BLOB and TEXT types            
               7.2.7.3 The ENUM type                       
               7.2.7.4 The SET type                         
          7.2.8 Choosing the right type for a column          
          7.2.9 Column indexes                               
          7.2.10 Multiple-column indexes                       
          7.2.11 Using column types from other database engines 
     7.3 Functions for use in SELECT and WHERE clauses     
          7.3.1 Grouping functions                              
          7.3.2 Normal arithmetic operations                     
          7.3.3 Bit functions                                    
          7.3.4 Logical operations                               
          7.3.5 Comparison operators                            
          7.3.6 String comparison functions                      
          7.3.7 Cast operators                                  
          7.3.8 Control flow functions                           
          7.3.9 Mathematical functions                          
          7.3.10 String functions                                
          7.3.11 Date and time functions                        
          7.3.12 Miscellaneous functions                         
          7.3.13 Functions for use with GROUP BY clauses      
     7.4 CREATE DATABASE syntax                          
     7.5 DROP DATABASE syntax                             
     7.6 CREATE TABLE syntax                              
          7.6.1 Silent column specification changes               
     7.7 ALTER TABLE syntax                                
     7.8 OPTIMIZE TABLE syntax                             
     7.9 DROP TABLE syntax                                 
     7.10 DELETE syntax                                      
     7.11 SELECT syntax                                      
     7.12 JOIN syntax                                          
     7.13 INSERT syntax                                      
     7.14 REPLACE syntax                                     
     7.15 LOAD DATA INFILE syntax                         
     7.16 UPDATE syntax                                     
     7.17 USE syntax                                         
     7.18 FLUSH syntax (clearing caches)                      
     7.19 KILL syntax                                        
     7.20 SHOW syntax (Get information about tables, columns,...) 
     7.21 EXPLAIN syntax (Get information about a SELECT)      
     7.22 DESCRIBE syntax (Get information about columns)       
     7.23 LOCK TABLES/UNLOCK TABLES syntax              
     7.24 SET OPTION syntax                                  
     7.25 GRANT and REVOKE syntax                         
     7.26 CREATE INDEX syntax                               
     7.27 DROP INDEX syntax                                 
     7.28 Comment syntax                                      
     7.29 CREATE FUNCTION/DROP FUNCTION syntax        
     7.30 Is MySQL picky about reserved words?                
8 MySQL Tutorial                                              
     1.  ϱ/                                
     2.  ϱ(Entering Queries)                              
     3.  ̽  ϱ                           
          3.1 ͺ̽  ϱ                      
          3.2 ̺                                      
          3.3 ̺ ڷḦ ־ .                        
          3.4 ̺κ  ˻ .                  
               3.4.1   ˻.                     
               3.4.2 ־ ǿ ´ Ư ุ ˻ . 
               3.4.3 Ư  ϱ                         
               3.4.4  ϱ                                
               3.4.5 ¥ MySQL ¥ ٷ 
                                      Լ  ش. 
               3.4.6 null   NULL Ư ̴.     
               3.4.7  ġ                                  
               3.4.8                                    
          3.5 ̺  ϱ                            
          3.6 ġ (ϰ ó ) ϱ              
9. mysql  (functions)                                   
     9.1 mysql ϴ                               
          9.1.1 Ϳ  ϴ                 
          9.1.2 ο ڼ ߰                             
          9.1.3 ƼƮ                             
     9.2 Ʈ α                                         
     9.3 mysql ̺ ִ ũ                               
10. mysql ִ                                  
     10.1  ũ                                        
     10.2    < ȭ>                    
     10.3 ӵ   ġ /ũ            
     10.4 How MySQL uses indexes                            
     10.5 WHERE  ȭϱ                           
     10.6 ̺  ݴ                                
          10.6.1 ͺ̽   ̺ 鶧 
     10.7  ̺                                  
     10.8 ͺ̽ ̺ ɺ ũ              
     10.9 ̺  Ŵ                                   
     10.10 ̺  ۰ 迭ϴ                     
     10.11 INSERT  ӵ  ġ κ            
     10.12 DELETE  ӵ  ġ κ           
     10.13 mysql ִ ӵ                      
     10.14 ο ˰ ٸ  ΰ?                     
11. mysql ġũ Ʈ                                      
12. mysql ƿƼ                                             
     12.1 پ mysql α                          
     12.2 ؽƮ Ͽ  Է(?)ϱ             
     12.3 mysql  б  ̺                  
13. ̺   ļ  isamchk ϱ          
     13.1 isamchk ɾ                               
     13.2 isamchk                                
     13.3 ̺                                 
     13.4 ̺                                     
     13.5 ļ  isamchk ϱ.                        
          13.5.1   ̺                   
          13.5.2 ̺                                 
          13.5.3 ̺ ȭ                                  
14 Adding new functions                                       
     14.1 Adding a new user-definable function                 
          14.1.1 UDF calling sequences                         
          14.1.2 Argument processing                           
          14.1.3 Return values and error handling               
          14.1.4 Compiling and installing user-definable functions
     14.2 Adding a new native function                        
15. mysql ODBC                                            
     15.1 MyODBC  ϴ ü                        
     15.2 MyODBC  ִ                           
     15.3 MyODBC   ۵ϴ α                     
     15.4 ODBC  α                        
     15.5 ODBC AUTO_INCREMENT ÷      
17. Ϲ  ذ                                      
     17.1. ͺ̽ (?)                              
     17.2 ͺ̽                                      
     17.3  ӽſ  mysqld  ϱ          
18 MySQL client tools                                          
     18.1 MySQL C API                                        
     18.2 C API datatypes                                      
     18.3 C API function overview                              
     18.4 C API function descriptions                            
          18.4.1 mysql_affected_rows()                           
          18.4.2 mysql_close()                                   
          18.4.3 mysql_connect()                                
          18.4.4 mysql_create_db()                               
          18.4.5 mysql_data_seek()                              
          18.4.6 mysql_debug()                                  
          18.4.7 mysql_drop_db()                                
          18.4.8 mysql_dump_debug_info()                       
          18.4.9 mysql_eof()                                     
          18.4.10 mysql_errno()                                  
          18.4.11 mysql_error()                                  
          18.4.12 mysql_escape_string()                          
          18.4.13 mysql_fetch_field()                             
          18.4.14 mysql_fetch_fields()                            
          18.4.15 mysql_fetch_field_direct()                      
          18.4.16 mysql_fetch_lengths()                          
          18.4.17 mysql_fetch_row()                             
          18.4.18 mysql_field_seek()                             
          18.4.19 mysql_field_tell()                             
          18.4.20 mysql_free_result()                             
          18.4.21 mysql_get_client_info()                         
          18.4.22 mysql_get_host_info()                          
          18.4.23 mysql_get_proto_info()                         
          18.4.24 mysql_get_server_info()                        
          18.4.25 mysql_info()                                   
          18.4.26 mysql_init()                                   
          18.4.27 mysql_insert_id()                              
          18.4.28 mysql_kill()                                   
          18.4.29 mysql_list_dbs()                               
          18.4.30 mysql_list_fields()                            
          18.4.31 mysql_list_processes()                          
          18.4.32 mysql_list_tables()                             
          18.4.33 mysql_num_fields()                            
          18.4.34 mysql_num_rows()                             
          18.4.35 mysql_ping()                                  
          18.4.36 mysql_query()                                 
          18.4.37 mysql_real_connect()                           
          18.4.38 mysql_real_query()                             
          18.4.39 mysql_reload()                                 
          18.4.40 mysql_row_seek()                              
          18.4.41 mysql_row_tell()                               
          18.4.42 mysql_select_db()                              
          18.4.43 mysql_shutdown()                             
          18.4.44 mysql_stat()                                   
          18.4.45 mysql_store_result()                            
          18.4.46 mysql_thread_id()                              
          18.4.47 mysql_use_result()                             
          18.4.49 What results can I get from a query?          
          18.4.50 How can I get the unique ID 
                               for the last inserted row?        
          18.4.51 Problems linking with the C API               
          18.4.52 How to make a thread-safe client              
19. Ÿ DB                                                
     19.1 Mysql/mSQL                                     
          19.1.1 mSQL  Mysql ٲٱ                     
          19.1.2 mSQL  Mysql  Ŭ̾Ʈ/ 
                                             
          19.1.3  How mSQL 2.0 SQL syntax differs from Mysql 
     19.2 PostgreSQL Mysql                            
=======================================================================
                            -           -
5. mysql ǥ ȣȯ
5.1 mysql ANSI SQL92 Ȯκ
 mysql ٸ sql ͺ̽ ã   Ȯ κ ִ. 
̷ κ ϴ  ؾ Ѵ. ֳĸ  mysql   
尡 ٸ  SQL      ֱ ̴.   쿡
 /*! ... */   ּ  MYSQL Ȯ ̿  ð 
ڵ带   ִ.  :
SELECT /*! STRAIGHT_JOIN */ col_name from table1,table2 WHERE ...
MYSQL Ȯ κ  :
- ʵŸ MEDIUMINT, SET, ENUM ,  ٸ BLOB  TEXT Ÿ.
- ʵӼ AUTO_INCREMENT, BINARY, UNSIGNED and ZEROFILL.
-  ڿ  ⺻ ҹڸ     
ڼ(⺻ ISO-8859-1 Latin1)    ȴ.  ̰
   ÷ BINARY  Ӽ ؾ ϸ ̷  쿡 
mysql  ȣƮ ϴ ASCII   ڿ Ѵ. 
- MYSQL ͺ̽ 丮  ̺ ̸ 
. ̰ ΰ ϰ ִ:
         ̸ ҹڸ ϴ  (κ  н ý. 
        ~) ýۿ MYSQL  ͺ
 ̸     ̺ ̸ ҹڸ Ѵ. ̺ ̸ 
µ    ٸ   ҹڷ .
         ̺ , ̸ٲٱ, ű, , 縦   ǥ 
ý     ִ.   ̺ ̸  ٲٷ 
ϴ  ̺ `.ISD', `.ISM' and `.frm'  ̸ ٲٸ ȴ.
- SQL db_name.tbl_name  ̿Ͽ ٸ ͺ̽ ̺
   ִ. Ϻ SQL     ̰ User 
space θ. MYSQL   TABLESPACES  ʴ´ :
create  table  ralph.my_table...IN my_tablespace.
- ġ() ÷ LIKE   ִ.
- SELECT INTO OUTFILE  STRAIGHT_JOIN    ִ. 
7.11 [SELECT] .
-EXPLIAN SELECT ̺   Ǿ    
ش.
- Use of index  names, indexes on  a subpart of a  field, and use  of 
INDEX or KEY in a CREATE TABLE statement. 7.6 [CREATE TABLE] .
- ALTER TABLE CHANGE col_name,  DROP col_name Ǵ DROP INDEX   
Ѵ. 7.7 [ALTER TABLE] .
- ALTER TABLE  IGNORE .
- ALTER TABLE   ADD, ALTER, DROP or CHANGE 
- IF EXISTS Ű带 ̿ DROP TABLE .
-  ̺ ̻ DROP TABLE .
- LOAD DATA INFILE . κ     Ŭ LOAD  DATA 
INFILE ȣȯȴ. 7.15 [LOAD DATA INFILE] .
(**    Ѳ Է   INSERT  ϴ  
 ӵ . **)
- OPTIMIZE TABLE  .
- ڿ '''  ƴ϶ '"' Ǵ '''    ִ.
- escape `\'  .
- SET OPTION . 7.24 [SET OPTION] .
- GROUP BY κп  ÷  ʿ䰡 . ̷   
 ǰ ƴ Ư  ǿ  Ų. 7.3.12  [GROUP 
BY Functions] .
(** ANSI SQL  Թ ̿Ͽ GROUP  BY    
ϰ ϴ  ÷ GROUP BY  ־ Ѵ. ̷ Ǵ 
 ʿ    ִµ MYSQL ̷   
. 7.3.12 Ѵ **)
- ٸ SQL ȯ ߴ ڸ  MYSQL   ɿ  ˸
ƽ Ѵ.       ANSI SQL  ODBC   
Ѵ.
- MYSQL C α     OR  AND ǹϴ  || 
 &&  νѴ. MYSQL ||   OR   ̸ &&  AND   
̴. ̷ ̹  MYSQL string  concatenation
(ڿ , ?)  ANSI SQL ۷ ||   ʴ
.  CONCAT() Ѵ. CONCAT()   ڰ ־ MYSQL 
 || ۷  ȯϱ .
MySQL understands the || and && operators to mean logical OR and AND, 
as in the C programming language. In MySQL, || and OR are   synonyms, 
as are && and AND. Because of this nice syntax, MySQL doesn't support 
the ANSI  SQL operator  || for  string concatenation;  use  CONCAT() 
instead. Since CONCAT() takes any  number of arguments, it's easy  to 
convert use of the || operator to MySQL. 
-  ϵ SQL  CODE STRAIGHT_JOIN MYSQL  Ű 
 ϱ  ̷ Ű带 /* */ ּȿ    ִ. 
  '!'  Ѵ. ̷   MYSQL ּ ٸ  
MYSQL    ؼ ٸ  SQL  ̷ Ȯ 
 ʰ dzʶ  ִ.  :
SELECT /*! STRAIGHT_JOIN */ * from table1,table2 WHERE ...
-  ̳  :
           CREATE   DATABASE   or   DROP  DATABASE.   7.4   [CREATE    
              DATABASE] .
         MOD() ſ % . % C αӸ  ϸ  
        PostgresSQL ȣȯ  Ѵ.
         ÷  =, <>, <= ,<,  >=,>, <<, >>, AND, OR, LIKE  
        .
         LAST_INSERT_ID(). 18.4.49 [mysql_insert_id()] .
         REGEXP or NOT REGEXP.
         ϳ ϳ ̻ ڸ  CONCAT()  CHAR(). MYSQL
         ̷   ڸ   ִ.
           BIT_COUNT(),   ELT(),   FROM_DAYS(),   FORMAT(),   IF(),    
           PASSWORD(),    ENCRYPT(),     PERIOD_ADD(),    PERIOD_DIFF(),      
           TO_DAYS(), or WEE-DEC-OSF1, KDAY(). 
         꽺Ʈ ִ  TRIM()  .(Use of TRIM() to trim 
        substrings) ANSI SQL    Ÿ Ѵ.
        
          ǿ STD(), BIT_OR() and BIT_AND() 
         DELET + INSERT  REPLACE . 7.14 [REPLACE] .
         FLUSH flush_option .
5.2 MYSQL  
  ɵ   MYSQL ִ.   켱
 Ȯ϶ MYSQL TODO  .
(http://www.mysql.com/Manual_split/manual_Todo.html). 
̰  ֽ  TODO ̴. η F [TODO] .
5.2.1 Sub-selects
 Mysql ۵ ʴ´:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
Mysql  INSERT ... SELECT ... and REPLACE ... SELECT  ... 
 Ѵ.  -select  3.23.0 Ƹ   
 ̴.  ״  IN()    ִ.
5.2.2 SELECT INTO TABLE
Mysql   SELECT ...  INTO TABLE  ....    ʴ´. , 
Mysql  SELECT ... INTO OUTFILE ...,   ϸ ⺻δ 
ϴ.
5.2.3 Ʈ(Transactions)
Ʈ  ʴ´.  Mysql  atomic(ڼ?)  ۷̼ 
  ̸ atomic ۷̼ rollback  Ʈǰ  
. atomic ۷̼ ϸ insert/select/    
    嵵  浹   ֵ ش.   
ƿ Ϲ ѹ(rollback)  ʿ.   LOCK TABLES   
UNLOCK TABLES   ̿Ͽ ٸ  尡  浹ϴ    
ִ. 7.23 [Lock Tables] .
5.2.4  ν Ʈ
 ν  ϵǰ   ִ SQL  Ʈ̴. 
̷  Ǹ Ŭ̾Ʈ ü Ǹ ٽ  ʿ䰡   
  ν    ִ. ̷   Ǵ  ѹ 
ؼǰ  Ŭ̾Ʈ ְƾ ϴ Ͱ پǷ 
 ȴ.     ̺귯 μ   
踦 ų  ִ. (??? You  can also raise the conceptual  level 
by having libraries of functions in the server.) 
ƮŴ Ư ̺Ʈ      ν̴.   
 Ʈ ̺ ڵ尡 ǰ  Ʈ    
ϴ ̺   ִ  ν ġ  ִ.
δ  ν   ƮŴ ƴϴ.  ƮŴ 
ʿ  쿡   ־ Ϲ ӵ .
  ν ϰ     Mysql ߰   
η F .(The TODO)
(**  Ʈ ó Ʈ  ͺ̽ ӵ 
ŵϴ. Mysql ̷ ӵ   ĥ  ִ κ  Ͽ 
 ӵ  . ̷ κ ڱⰡ ϴ ͺ̽
  ߿Ѱ Ǵ  ƾ  Դϴ.   DBMS
 ȸ   ʴ 찡 .    
 , ȸ   Ѵ. Ƿ  ڰ 
̽   纻 غϸ,   ϸ ۾ ٽ ؾ 
. ƮŰ   ڷ Ἲ ϱ   ʿ  ̴. 
**)
5.2.5 ܷŰ(Foreign Keys)
SQL  ܷŰ ̺     κ  
Ἲ Ȯ  Ѵ. SELECT   ̺  ڷḦ 
 ϸ ̺ ؼ ó  ִ.
SELECT * from table1,table2 where table1.id = table2.id
7.12 [JOIN] .
Mysql ܷŰ(FOREIGN KEY)  ٸ SQL ǰ CREATE  TABLE 
 ȣȯ  Ѵ: ܷŰ ƹ͵  ʴ´. ON DELETE 
...    FOREIGN KEY  κ   Ѵ. 
 ODBC  ø̼ ̰ ڵ WHERE      
̴.  ̰ κ  ()ϰ Ѿ .  ܷŰ 
δ  üũ(constraint check)   ̷  üũ 
Ͱ ̺ Ȯ    ʿϴ. Mysql  Ϻ 
ø̼ǿ ܷŰ ϴ  ʿ ϱ (  
ϵ ϵ ) ϴ  ̴.
Mysql ܷŰ  ̺ ڵ带   ø̼ǿ 
 DELETE  ߰Ͽ ON  DELETE ...  Ǵ   ν 
 ذ ִ.  ̷ ϴ  ܷŰ  ϴ Ͱ 
 (  쿡  ) ϱⰡ  .
 Ͼȿ  츮 ܷŰ   Ȯ  ̴.   ּ 
mysqldump ODBC  ǰ ˻  ֵ  ̴.
5.2.5.1 ܷŰ  ʴ 
ܷŰ    ؾ     ִ:
- Foreign key Ȳ ſ ϰ . ֳϸ,  foreing key
 ǰ databaseܾ ϰ, foreign key ϴ   "ڿ
" File (data file ű, ϰ, ϴ  ...) 
Ѵ.
(** ش :  ̻ѵ ܷŰ   Ἲ Ģ 
      ϰ ȴ. ̰ ϰ ִ ϴ. **)
- INSERT  UPDATE  ӵ    ģ.  ̷   
 ùٸ  ùٸ ̺ ڵ带 ϱ  κ 
 ܷŰ üũ  ʿ .
-   ü ͺ̽  ۿ ϱ   ̺
 Ʈ   ſ  ̺  ؾ Ѵ.   
  ڵ带 ϰ Ŀ ٸ ̺  ڵ带 
  ξ . 
- Table  , (backup̳ ο sourceκ)  record
 ٽ ϴ  Table   .
- Foreign key Ѵٸ, table dump(backup)ϰ (  dump ڷ
) restoreϴ  ־  Ϸ  ϰ Ѿ Ѵ.
-  table ǰ ְ ϴ, ( Table ȣ
ϰ  ȴٸ)   ܼ  createδ     Ұ  circular 
definition(ȯ)  Ѵ.
(: A Table B ڷḦ ϴ foreign key  ְ, B
 C  foreign key, C A  foreign key  㵵 table 
ȴٸ     ѹ A,B,C table   . A,B,C  
 foreign key  ִ   ȴ.)
ܷŰ     . ODBC Ư ٸ Ŭ̾Ʈ 
α  ̺ Ǿ ִ   ְ  ̾
 µ ϸ ø̼ µ  ̴.
(:   foreign key ؼ ſ ̴. , ̰ 
foreign key Ϻ ϻ̴. ٵ client   Table DATA
 迡 ؼ Ծ  ؼ  Ű澲 ʰ  ϰ, 
 ڷ Ἲ(ռ[?]) Ѵٴ  ſ ߿ϴ.  Ư, 
Table 1~20 ƴ 100 Ѿٸ, client   Ű澲
 programingϴ ͵ , debugging  .   
table 踦  ȭѴٸ programmer foreign key  
ޱ ٴ   Table checkؾ Ǵ   Եȴ.  foreign 
key ǵǴ ֵ  table  Data ϴ    ʱ 
̴.   ǹ   ߳ û  óϴ   ־ 
foreign keyŭ 彺  . )
Mysql  ܷŰ Ǹ   ֵ ؼ  Ŭ̾Ʈ 
    ؼ  ϰ     ֵ 
 ̴.  '.frm'     ̰  ϰ  
. 
5.2.6 
Mysql 並  ʴ´.  TODO(  ) ִ.
MySQL doesn't support views, but this is on the TODO. 
5.2.7 `--'  ּ
Ϻ ٸ SQL ͺ̽ '--'  ּ Ѵ. mysql   
 '--' ϴ     Mysql '#'  ּ 
  Ѵ.  ڴ   C   Ÿ /*  this is  a 
comment */  mysql   ִ. 7.28 [Comment] .
Mysql '--'   ̴; '--'  ּ · ڵ
  Ǵ SQL ǿ   Ų.    
. 츮 ڵ payment  !payment!   Էϵ  ϰ 
ִ :
UPDATE tbl_name SET credit=credit-!payment!
payment       ̶ ϴ°?
1--1 մ SQḺ   '--' ּ  ǹϴ   
 ̴.
'--' ּ ϴ ؽƮ  SQL α ٸ   
 ؾ Ѵ:
shell> replace " --" " #" < text-file-with-funny-comments.sql \
        | mysql database
instead of the normal(  ???): 
shell> mysql database < text-file-with-funny-comments.sql
 Ϸ '--' ּ '#' ּ ٲ  ִ:
shell> replace " --" " #" -- text-file-with-funny-comments.sql
   :
shell> replace " #" " --" -- text-file-with-funny-comments.sql
(** Ϻ  SQL ϴ  --  ּ      Ƿ   
MYSQL # ּ Ѵٴ ̴ **)
5.3 Mysql  ִ ǥ ΰ?
Entry level SQL92. ODBC level 0-2. 
5.4 BLOB  TEXT Ÿ 
BLOB  TEXT ʵ忡 GROUP BY  ORDER BY ϱ ϸ   ʵ
     ü   Ѵ.   ̷ ϴ  ǥ   
SUBSTRING   ϴ ̴.  :
mysql> select comment from tbl_name order by SUBSTRING(comment,20);
̷        ù ° max_sort_lengths  (⺻
=1024) ȴ.
BLOB  TEXT  ⺻      NULL  ÷ 
.
BLOB and TEXT cannot have DEFAULT values and will also always be NULL 
columns. 
5.5 COMMIT-ROLLBACK  ġ  ?
Mysql COMMIT-ROLLBACK   ʴ´.   COMMIT-ROLLBACK 
ȿ ٷ ؼ Mysql   ϴ Ͱ   ٸ 
̺ 谡 ʿϴٴ ̴. Mysql  ̺ ڵ  Ŭ
 ߰    ũ   ִ  ʿϴ. 
̷  纸 mysql 2-4  .  Mysql κ 
ٸ SQL ͺ̽ ξ   . ( ּ 2-3  
) ̷  Mysql COMMIT-ROLLBACK  ̴.
а 츮 SQL    ۵  ַ ̴. 
κ 
COMMIT-ROLLBACK   ʿ  幰.   ̷ ϴ 
      ִ.
Ϲ Ʈ ʿ Ʈ LOCK TABLES  ڵ带 ©  
ִ.  ڵ带 Ʈ  Ŀ  ʿ䰡 .
츮 Ʈǰ Ŀ TODO  ־ 켱    ƴϴ. 
̷  Ѵٸ CREATE TABLE   ɼ  ̴.  ̰ 
ɼ  ̺ ۵ϸ  ̺    ̶ 
 ǹѴ.
츮 100%  ͺٴ    ͺ̽  ʿ
.
COMMIT-ROLLBACK  ϴ ӵ ջ ٸ 츮  װ
  ̴. а  ߿ϰ ؾ ϵ   ִ. 츮
  Ϳ 켱 ΰ ִ TODO .  ܰ 
   ̰ ٲ   켱   ִ.
   ROLLBACK  ̴. ѹ LOCK TABLES  ̿Ͽ 
  COMMIT   ִ. ѹ ϱ   Mysql 
Ʈ    ڵ带 ϰ ѹ ̳    
 ư  ֵ ٲپ Ѵ.   ̷    
 ʴ.( isamlog   ̷ 츦     ִ)   
ALTER/DROP/CREATE TABLE ѹ ϴ  ô ƴ.
ѹ  ϱ      ִ:
1. ϱ ϴ  ̺  . LOCK TABLES ...
2.  Ʈ(Test conditions)
3.    ȴٸ Ʈ Ѵ.
4. UNLOCK TABLES 
Ϲ  ѹ ̿  Ʈ ϴ ͺٴ  ̷ 
 ξ  .    밡  ƴϴ.  ̷ 
 ذ    Ȳ Ʈ  带 
 ̴. ̷     ȴ.   Ʈ 
δ   ̴.
  ۷̼ǿ ڵ带 Ʈϴ    ִ. 
 ũ ϸ ſ ȿ ø̼   ִ:
-   õǾ ִ ʵ带 
-  ȭ  ʵ带 Ʈ
 ,    Ʈ    ٲ   
Ʈ Ѵ.  
For example, when we are doing updates on some  customer information, 
we update only the customer data that have changed and test only that 
none of the changed  data, or data that  depend on the changed  data, 
have changed compared to the original row.
ȭ  Ʈ UPDATE  WHRE  Ͽ   ִ. 
ڵ尡 Ʈ ʾҴٸ Ŭ̾Ʈ      
:
" ٲ  Ϻΰ ٸ ڿ  ٲϴ". 
 츮 쿡  ڵ  ڵ带  Ͽ 
.  ڴ    ڵ带    ִ.
̷ ϸ "÷ ŷ" ϴ.  δ  . ֳ
ϸ   õǾ ִ  ÷ Ʈϱ  ̴. 
  Ʈ   ̴:
UPDATE tablename SET pay_back=pay_back+'relative change';
UPDATE customer
        SET
                customer_date='current_date',
                address='new address',
                phone='new phone',
                money_he_owes_us=money_he_owes_us+'new_money'
        WHERE
                customer_id=id   AND    address='old   address'   AND 
phone='old phone';
    ̷ ϸ   ſ ȿ̸    ٸ  Ŭ̾Ʈ 
pay_back   ̳ money_he_owes_us ÷   ٲپ   
۵Ѵ.
κ , ڴ ̺  (identifiers)  ϱ 
 ѹ ̺  ϰ ;Ѵ. ̰ AUTO_INCREMENT ÷
 SQL  LAST_INSERT_ID() , Ǵ mysql_insert_id()  C API  
Ͽ  ȿ   ִ. 18.4.49  [mysql_insert_id()] 
.
TcX  ̷  ذ  ֱ    low-level 
 ʿ  ʴ´.  쿡  ο-  ʿϴ. 
 ̷  ؼҼ̴. ο-  ϸ  ̺ ÷ 
÷   ִ.  :
UPDATE tbl_name SET row_flag=1 WHERE id=ID;
 row ߰ߵǰ row_flag  row ̹ 1  ƴ϶ 
  row ڷμ 1 ȯѴ.
MySQL returns 1 fro the number of affected rows if the row  was found  
and row_flag wasn't already 1 in the original row.
6. Mysql   ý
mysql   ǥ / ý  ִ. ̹ 
忡 ̰  ۵ϴ ϰ ִ.
6.1  ý̶ ΰ?
Mysql   ý  ֿ    ͺ̽ select,  insert, 
update, delete  ȣƮ  ̸  ̴.
߰ ɿ   ɰ LOAD DATA INFILE    
̼ǰ  mysql Ư  ϴ κ ԵǾ ִ.
Mysql   ϴ   ̸ н   ̸
(α ̸)̳   ̸  谡 ٴ  ! 
. κ mysql Ŭ̾Ʈ mysql  ̸  н 
 ̸ Ͽ Ϸ  ̴.  ̰   Ǹ 
ؼ̴. Ŭ̾Ʈ α -u   --user ɼ   ٸ 
̸ Ѵ. ̰ mysql  ̸ йȣ   
 ͺ̽ ȿ    ִٴ  ǹѴ.  
 Ͽ  Ϸ ϴ   ̸ йȣ 
Ǿ  ʴٸ ӿ  ̴.
н   ̸ Ϲ  8ڷ ѵǾ  ִ Ͱ  ٸ 
mysql  ̸ 16ڱ   ִ.
mysql йȣ н йȣ ƹ  .  н ӽſ 
α  ϴ йȣ ͺ̽    ϴ 
йȣ   .  mysql н α μ 
ϴ Ͱ ٸ ˰ йȣ ȣȭѴ.
6.2 mysql  ϱ
mysql Ŭ̾Ʈ α Ϲ  з(Ű )  
ϴ.:  ȣƮ,  ̸, йȣ.   mysql Ŭ
Ʈ     ִ. ( ڴ [ ]  ݴ´)
shell>; mysql [-h host_name] [-u user_name] [-pyour_pass]
-p ڿ  йȣ ̿  ٴ  .
-h, -u, -p ü  ִ δ 
--host=host_name, --user=user_name and --password=your_pass
 ִ.
mysql Ŀǵ ο  Ű   ⺻   
Ѵ. ⺻ ȣƮ ̸ localhost ̰ ⺻  ̸  н 
 ̸̴.(-p   йȣ  ʴ´)  
 н  ̸ joe    ϴ.:
shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql
ٸ mysql Ŭ̾Ʈ ϰ ۵Ѵ.
н ýۿ      ִ ⺻  ־ Ŭ
Ʈ α    ɼ  ʾƵ ȴ:
 Ȩ 丮 '.my.cnf'   [client] ǿ    
  ִ. Ͽ ̿    :
[client]
host=host_name
user=user_name
password=your_pass
4.14.4 [option files] .
  ȯ    Ͽ          ִ.  ȣƮ 
MYSQL_HOST    ִ. Mysql   ̸ USER, LOGNAME,  
 LOGIN   ִ. (̷  ̹ н α ̸ 
Ǿ    ̴.  Ƿ   ٲ ʴ°   )  йȣ 
MYSQL_PWD   ִ.( ̰  ʴ;   
 )
     Ǿٸ     
ϰ ȯ   ͺ 켱 .    
 ȯ  켱 .
6. 2. 1 йȣ  
ٸ ڰ ߰  ְ  йȣ ϴ    ʴ
. Ŭ̾Ʈ α   йȣ ϴ  Ʒ 
   赵  Ͽ:
  -pyour_pass Ǵ --password=your_pass ɼ .   
   ̴.  йȣ ý Ȳ  α(ps 
)       ֱ  ٸ   ڰ      
.(mysql Ŭ̾Ʈ Ϲ ʱȭǴ   ڸ 0 
.     ִ ª ƴ  ִ)
 -p Ǵ --password ɼ (йȣ    ). ̷ 
 Ŭ̾Ʈ α ̳ο йȣ :
shell> mysql -u user_name -p
Enter password: ********
Ŭ̾Ʈ йȣ ĥ  ̳ο '*' ڸ  ش. 
 ٸ ڰ йȣ   . ٸ ڰ    Ƿ 
 йȣ Էϴ   ξ  ϴ.    
 ȭ ũƮ Ŭ̾Ʈ α ϸ   
ʴ.
  Ͽ йȣ .   Ȩ 丮  '.my.cnf' 
 [client] ǿ йȣ   ִ.
[client]
password=your_pass
йȣ '.my.cnf' Ͽ Ѵٸ   ̳ ٸ 
 б/⸦    ؾ  Ѵ.  ۹̼ 400 ̳  600 
 Ȯ.
4.14.4 [ɼ ] .
 йȣ MYSQL_PWD ȯ    ִ.    
  ϸ ؼ ȵȴ. Ϻ ps α   μ
 ȯ溯 ִ ɼ ִ; MYSQL_PWD  ϸ ٸ 
  йȣ   ִ. ̷  ps  ý
 μ ȯ溯 ˻  ִ  ٰ ϴ   
 ϴ.
߿    Ŭ̾Ʈ α йȣ 䱸ϰ
 ϰ   '.my.cnf' Ͽ йȣ ϴ ̴.
6.3 mysql ϴ 
Ѱ õ   mysql ͺ̽(ͺ̽ ̸  mysql 
) user, db, host, table_priv, columns_priv ̺ ȴ. mysql 
  ,  ȯ  (6.7 [ ] )  
̺  оδ.
mysql ϴ    ϴ ̸  Ʒ .
 ÷ ̸ grant tables      Ǵ context 
Ǿ ִ.
+-------------------+----------------+------------------------------+
|  Privilege () |  Column (÷) |  Context (ȯ)              |  
+-------------------+----------------+------------------------------+
|  select           |  Select_priv   |  tables                      | 
+-------------------+----------------+------------------------------+
|  insert           |  Insert_priv   |  tables                      | 
+-------------------+----------------+------------------------------+
|  update           |  Update_priv   |  tables                      | 
+-------------------+----------------+------------------------------+
|  delete           |  Delete_priv   |  tables                      | 
+-------------------+----------------+------------------------------+
|  index            |  Index_priv    |  tables                      | 
+-------------------+----------------+------------------------------+
|  alter            |  Alter_priv    |  tables                      | 
+-------------------+----------------+------------------------------+
|  create           |  Create_priv   |  databases, table or indexs  | 
+-------------------+----------------+------------------------------+
|  drop             |  Drop_priv     |  databases or tables         | 
+-------------------+----------------+------------------------------+
|  grant            |  Grant_priv    |  databases or tables         | 
+-------------------+----------------+------------------------------+
|  reload           |  Reload_priv   |  server administration       | 
+-------------------+----------------+------------------------------+
|  shutdown         |  Shutdown_priv |  server administration       | 
+-------------------+----------------+------------------------------+
|  process          |  Process_priv  |  server administration       | 
+-------------------+----------------+------------------------------+
|  file             |  File_priv     |  file access on server       | 
+-------------------+----------------+------------------------------+
select, insert, update, delete  ͺ̽ ̺  
忡  ۷̼   ֵ Ѵ.
SELECT    ̺ (ڵ)   select 
 ʿϴ.  ͺ̽     ϴ
 Ư SELECT     ִ.        
mysql Ŭ̾Ʈ   ִ:
mysql> SELECT 1+1;
mysql> SELECT PI()*2;
index(ε)  ε ϰų   ִ.
alter  ALTER TABLE    ֵ Ѵ.
create  drop  ο ͺ̽ ̺  ϰų 
ϴ ͺ̽ ̺   ֵ Ѵ.
ڿ mysql  ͺ̽ drop   ϸ,    ڴ 
mysql ٱ   ͺ̽    ִٴ°! 
.
grant  ڰ  ִ  ٸ ڰ   ֵ 
Ѵ.
file  LOAD DATA INFILE and SELECT ... INTO OUTFILE   ̿
   ϰ   ִ  Ѵ. ̷  
 ڴ mysql  а   ִ  а    ִ 
 ȴ.
 ѵ  ۷̼ǿ Ǹ mysqladmin α 
 Ѵ.
Ʒ ̺   ѿ    ִ  mysqladmin 
 ش:
+--------------------+----------------------------------------------+
|  Privilege ()  |  Command permitted to privilege holders      |
|                    |      (ѿ  Ǵ )             |
+--------------------+----------------------------------------------+
|  reload            |  reload, refresh, flush-privileges           |
|                    |  , flush-hosts, flush-logs, flush-tables     |
+--------------------+----------------------------------------------+
|  shutdown          |  shutdown                                    |
+--------------------+----------------------------------------------+
|  process           |  processlist, kill                           |
+--------------------+----------------------------------------------+
reload   grant ̺ ٽ о δ.  refresh  
  ̺   α   ݴ´.  flush-privileges 
 reload ɰ Ǿ̴. ٸ flush-*  refresh   
 Ѵ.      쿡   
ϴ.    α ϸ  ݰ ٽ   Ѵٸ flush-logs   
refresh   ̴.
(** flush ɼδ ȣƮ, α  ,  , ̺,  status 
variables   ִ. SQL  Ǵ mysqladmin  ƿƼ 
ϸ ȴ. **)
shutdown   ˴ٿѴ. (** ̰  ¾~~?? **)
processlist   ǰ ִ 忡   
. kill   带  δ.  ڽ   ų 
   ٸ ڿ  ۵  μ   
 ų   ִ.
  ɽ ؾ Ѵ:y:
 grant()  ڰ ٸ      ֵ 
Ѵ. ٸ Ѱ grant    ڴ     
ִ.
 file     б   дµ   
 .... SELECT  ̿   ִ ...
The file privilege can be abused  to read any world-readable file  on 
the server into a database table,  the contents of which can then  be 
accessed using SELECT.
(**    ʾƵ ̿  ִ    ʴ° 
ٴ ̰ **)
 shutdown  ٸ ڿ     ϵ 
  ִ.
  process  йȣ ϰ ٲٴ Ǹ   
ϰ ִ Ǹ µ   ִ.
 mysql ͺ̽   йȣ ٸ     
ٲٴ    ִ. (йȣ ȣȭǾ  Ǿٰ ϴ
,    ִ  ڴ ٸ йȣ ٲ   
)
mysql  ý ٷ    ִ:
  ź ڸ ϰ   .  ֳϸ ڿ 
 źϴ  ϰ ų   ̴.
 ڰ ͺ̽ ̺    ִ   
  ͺ̽ ü        
.
(** ϱ create  drop  ָ ͺ̽ ü  
  .  ̺     ֵ   Ѵٴ 
 **)
6.4  ý ۵ 
mysql  ý  ڰ  ŭ   ֵ 
. mysql   ,  Ȯ  ȣƮ ڰ 
  ̸  ȴ. ý  Ȯΰ   
   Ѵ.
mysql ڸ Ȯϴµ ȣƮ̸   ̸ Ѵ  Ѵ. 
ֳĸ ͳݿ ̸ ٰ  ڶ    
̴.        whitehouse.gov  ϴ      bill   
microsoft.com ϴ   bill     ʿ  . 
mysql   ̸  ִ ȣƮ ̿  ڸ 
Ѵ : whitehouse.gov ϴ bill Ư    
ְ microsoft.com ϴ bill ٸ    ִ.
mysql   ΰ ܰ谡 ִ:
ܰ 1:  ڰ   ִ  Ǵ
ܰ 2 ( ڰ  Ǿ ) : ڰ Ϸ 
ɿ    ִ  û  Ǵ. , 
ͺ̽ ̺ select  rows Ҷ, Ǵ  ͺ̽ 
̺    ̺  select  ִ 
̽    ִ Ȯ Ѵ.
     ܰ迡 mysql ͺ̽ user, db, host 
̺ ̿Ѵ.grant ̺ ʵ Ʒ :
+----------------+-----------------+---------------+---------------+
|  Table name    |  user           |  db           |  host         |
+----------------+-----------------+---------------+---------------+
|  Scope fields  |  Host           |  Host         |  Host         |
|  (ʵ )   +-----------------+---------------+---------------+
|                |  User           |  Db           |  Db           |
|                +-----------------+---------------+---------------+
|                |  Password       |  User         |               |
+----------------+-----------------+---------------+---------------+
|                |  Select_priv    |  Select_priv  |  Select_priv  |
|                +-----------------+---------------+---------------+
|                |  Insert_priv    |  Insert_priv  |  Insert_priv  |
|                +-----------------+---------------+---------------+
|                |  Update_priv    |  Update_priv  |  Update_priv  |
|                +-----------------+---------------+---------------+
|  Privilege     |  Delete_priv    |  Delete_priv  |  Delete_priv  |
|  filelds       +-----------------+---------------+---------------+
|  ( ʵ)   |  Index_priv     |  Index_priv   |  Index_priv   |
|                +-----------------+---------------+---------------+
|                |  Alter_priv     |  Alter_priv   |  Alter_priv   |
|                +-----------------+---------------+---------------+
|                |  Create_priv    |  Create_priv  |  Create_priv  |
|                +-----------------+---------------+---------------+
|                |  Drop_priv      |  Drop_priv    |  Drop_priv    |
|                +-----------------+---------------+---------------+
|                |  Grant_priv     |  Grant_priv   |  Grant_priv   |
|                +-----------------+---------------+---------------+
|                |  Reload_priv    |               |               |
|                +-----------------+---------------+---------------+
|                |  Shutdown_priv  |               |               |
|                +-----------------+---------------+---------------+
|                |  Process_priv   |               |               |
|                +-----------------+---------------+---------------+
|                |  File_priv      |               |               |
+----------------+-----------------+---------------+---------------+
  ι° ܰ踦 (û ), û ̺   
̶ ߰ tables_priv   columns_priv ̺ Ѵ.   
̺ ʵ  :
+-------------------+---------------+----------------+
|  Table name       |  tables_priv  |  columns_priv  |
+-------------------+---------------+----------------+
|  Scope fields     |  Host         |  Host          |
|                   +---------------+----------------+
|                   |  Db           |  Db            |
|                   +---------------+----------------+
|                   |  User         |  User          |
|                   +---------------+----------------+
|                   |  Table_name   |  Table_name    |
|                   +---------------+----------------+
|                   |               |  Column_name   |
+-------------------+---------------+----------------+
|  Privilege field  |  Table_priv   |  Type          |
|                   +---------------+----------------+
|                   |  Column_priv  |                |
+-------------------+---------------+----------------+
|  Other fields     |  Timestamp    |  Timestamp     |
|                   +---------------+----------------+
|                   |  Gran       |                |
+-------------------+---------------+----------------+
 (grant) ̺ ʵ   ʵ Ǿ ִ.
ʵ  ̺  Ʈ  Ѵ. ٽ  ϸ Ʈ
 Ǵ context(ȯ, )̴.   , Host  User   
'thomas.loc.gov'  'bob'  user ̺ Ʈ thomas.loc.gov ȣ
Ʈ bob   Ҷ      ϴµ ȴ.ϰ 
Host, User, db ʵ尪  'thomas.loc.gov', 'bob', 'reports'  db  
̺ Ʈ thomas.loc.gov ȣƮ bob  reports ͺ̽ 
  ȴ. tables_priv   columns_priv ̺  ̺̳ 
 Ʈ   ִ ̺/÷  Ű  ʵ带 
ϰ ִ.
 üũ ϱ  , HOst     ҹڸ   ʴ´. 
User,  Password,  Db,  Table_name    ҹڸ  Ѵ.  mysql 
3.22.12    Column_name  ҹڸ  ʴ´. 
(3.22.11 ҹ )
 ʵ ̺ Ʈ εǴ   Ű ̴    
ִ ䷹̴̼.    Ϻϰ ϱ  
 (grant) ̺  Ѵ.  ϴ Ģ 6.6 
[Request access] .
 ʵ ڿ̸   ǵǾ; ⺻    ڿ
:
+--------------+------------+-------------------------------------+
|  Field name  |  Type      |                                     | 
+--------------+------------|                                     | 
|  Host        |  CHAR(60)  |                                     | 
+--------------+------------|                                     | 
|  User        |  CHAR(16)  |                                     |  
+--------------+------------|                                     | 
|  Password    |  CHAR(16)  |                                     | 
+--------------+------------+-------------------------------------+
|  Db          |  CHAR(64)  |  (CHAR(60) for the tables_priv and  | 
|              |            |          columns_priv tables)       | 
+--------------+------------+-------------------------------------+
user, db, host ̺    ʵ ENUM('N','Y')  ǵǾ 
ִ. --  'N'  'Y'   ⺻ 'N' ̴.
(** ENUM Ÿ    ϳ  .ʵ Ÿ  **)
tables_priv  columns_priv ̺  ʵ SET  ʵ ǵ
:
(** SET Ÿ  ߿ 0̳ 1 ̻   **)
+--------------+-------------+--------------------------------------+
| Table name   | Field name  |  Possible set elements               | 
+--------------+-------------+--------------------------------------+
| tables_priv  | Table_priv  | 'Select', 'Insert', 'Update',        | 
|              |             | 'Delete', 'Create', 'Drop', 'Grant', | 
|              |             | 'References', 'Index', 'Alter'       | 
+--------------+-------------+--------------------------------------+
| tables_priv  | Column_priv | 'Select', 'Insert', 'Update',        | 
|              |             | 'References'                         | 
+--------------+-------------+--------------------------------------+
| columns_priv | Type        | 'Select', 'Insert', 'Update',        | 
|              |             | 'References'                         | 
+--------------+-------------+--------------------------------------+
ϰ ؼ  (grant) ̺   Ѵ:
 user ̺ scope() ʵ  ῡ    
 ź  Ѵ.  ῡ Ͽ,  ʵ 
 ü (superuser)  Ų.
 db  host ̺ Բ ȴ:
        - db ̺  ʵ  ȣƮ  ͺ̽ 
     ڰ   ִ Ѵ.  ʵ   
۷̼         Ǿ Ѵ.
        - host ̺ db ̺ Ʈ  ȣƮ 
      db ̺ Ȯ  Ѵ. , ڰ 
 Ʈ   ȣƮ ͺ̽    ֵ Ϸ,
        "db" ̺ Ʈ Host  ΰ,  "host" 
  ȣƮ    Ʈ  ȴ.̷   6,6  [Request 
access] ڼ  ϰ  ִ.
 tables_priv  columns_priv ̺ db ̺  ϴ. 
     ִ:  ̺  ͺ̽ ܰ迡 
 ư ̺ ÷ ܰ迡   ִ.
 (reload, shutdown,Ÿ..)  user ̺   
 ִٴ  ! ֳĸ  ۷̼   ü  
۷̸̼ Ư ͺ̽  ϴ  ƴϴ.  Ƿ 
̷  ٸ (grant) ̺  ʿ䰡 .,  
user ̺  ۷̼   ִ    
  ȴ.
(file) ѵ  user ̺ Ѵ.   
  ƴϴ.    ȣƮ  аų    ִ 
 ϰ ִ ͺ̽  ̴.
mysqld    (grant) ̺ ѹ д´.  ̺
 ϰ ȿ Ϸ 6.7 [Privilege changes] .
 ̺    ϴ´   Ǿ Ȯ
ϴ   ̴.   α  mysqlaccess ũƮ
μ Yves CArlier  mysql distribution  ϰ ִ.  
ϰ ִ Ȯϱ  mysqlaccess  --help ɼ  ־ 
.  6.11 [Access denied]  6.12 [Security] .
mysqlaccess  user, db, host ̺ Ѵ.  ̺̳ ÷ 
ܰ ѱ  ʴ´ٴ  .
6.5  ,
ܰ 1 :  Ȯ()
mysql  Ϸ     Ȯΰ йȣ  
 ϰų źѴ.   Ȯ ȵǸ     
źѴ.  Ȯ Ǹ   Ƶ̰ 2° ܰ 
 û ٸ.
 Ȯ ΰ  ϰ ִ:
 ϴ ȣƮ
 mysql  ̸
 Ȯ user ̺   ʵ(Host,  User, Password) 
Ͽ ȴ.  user ̺ Ʈ ȣƮ̸  
 , йȣ Ȯ   Ƶδ.
Ʒ  user ̺  ʵ尪   ִ:
 Host   ȣƮ  ̸̳ IP   Ǵ   ȣƮ  Ű 
'localhost'   ̴.
 Host ʵ忡 '%'  '_'  ϵī ڸ   ִ.
 '%' Host    ȣƮ ̸  Ÿ.  ȣƮ   
'%' . Ư ȣƮ  ̷       
ִٴ  .
 ϵī ڴ User ʵ忡  ʴ´.    
 شϴ     ִ.  Ϸ Ͽ    
̸ ִٸ Ŭ̾Ʈ   ̸ ſ  ڴ 
 , ̸  ڷμ ֵȴ.
 Password ʵ    ִ.̰ ƹ  йȣ 
  ִٴ  ǹϴ   ƴϸ ڴ йȣ   
ʰ  ؾ Ѵٴ ǹ̴.
Ʒ ̺  û ϴ "user" ̺   Host, User 
  յǴ ִ ̴:
+--------------------------+---------------------------------------+
| ȣƮ/        | Ͽ شϴ                   | 
+--------------------------+---------------------------------------+
| 'thomas.loc.gov'/'fred'  | thomas.loc.gov  ϴ fred     | 
+--------------------------+---------------------------------------+
| 'thomas.loc.gov'/''      | thomas.loc.gov  ϴ      | 
|                          |                                 | 
+--------------------------+---------------------------------------+
| '%'/'fred'               |  ȣƮ ϴ fred         | 
+--------------------------+---------------------------------------+
| '%'/''                   |  ȣƮ ϴ    | 
+--------------------------+---------------------------------------+
| '%.loc.gov'/'fred'       | loc.gov   ȣƮ      | 
|                          | ϴ fred                         | 
+--------------------------+---------------------------------------+
| 'x.y.%'/'fred'           | x.y.net, x.y.com, x.y.edu       | 
|                          | ϴ fred (̰ Ƹ  |  
|                          |  ̴)                          | 
+--------------------------+---------------------------------------+
| '144.155.166.177'/'fred' | 144.155.166.177 IP ּҿ         | 
|                          | ϴ fred                         | 
+--------------------------+---------------------------------------+
| '144.155.166.%'/'fred'   | 144.155.166 Ŭ C      | 
|                          | ȣƮ ϴ fred              | 
+--------------------------+---------------------------------------+
Host ʵ忡  IP ϵ  ī带    ֱ   (  
'144.155.166.%'                   ȣƮ    ȴ) 
144.155.166.somewhere   ȣƮ ̸ ̿Ͽ δϰ  ̿ 
ɼ   ִ. ̷    mysql ڿ Ʈ(.)
 ϴ ȣƮ̸  ʴ´. 1.2.foo.com    ȣƮ
 ̷ ȣƮ̸ (grant) ̺ Host ÷ ġ 
´. IP ڸ IP ϵ ī  ġų  ִ.
 Ѱ ̻ user table  ִٸ    user table 
ұ? ̷ 쿡 user table     ذ ϸ  , 
  Ҷ  ȴ. user table  ٰ 
:
+---------------------+-------------+-------------+
|  Host               |  User       |  ...        | 
+---------------------+-------------+-------------+
|  %                  |  root       |  ...        | 
+---------------------+-------------+-------------+
|  %                  |  jeffrey    |  ...        | 
+---------------------+-------------+-------------+
|  localhost          |  root       |  ...        | 
+---------------------+-------------+-------------+
|  localhost          |             |  ...        | 
+---------------------+-------------+-------------+
 ̺  ,  Ưϰ   ִ ȣƮ 
 Ѵ. (Host ÷ '%' " ȣƮ" ǹϿ ּѵ
 ϴ ̴) Ͽ  ȣƮ   Ưϰ   
ڰ ִ ͺ Ѵ.( Ǿ ִ User   " 
" ǹϿ ּѵ ϴ ̴.) ̷ ϸ  user 
̺  :
+---------------------+-------------+-------------+
|  Host               |  User       |  ...        |
+---------------------+-------------+-------------+
|  localhost          |  root       |  ...        |
+---------------------+-------------+-------------+
|  localhost          |             |  ...        |
+---------------------+-------------+-------------+
|  %                  |  jeffrey    |  ...        |
+---------------------+-------------+-------------+
|  %                  |  root       |  ...        |
+---------------------+-------------+-------------+
   Ī ˰ Ǹ  ĪǴ  
.   localhost   jeffrey     ϷҶ,   Host   ÷ 
'localhost'   Īȴ.   ̸   
ϴ ȣƮӰ  ̸ Īȴ. ('%'/'jeffrey'    
Ī ȴ.  ̺ ó ĪǴ  ƴϴ.)
ٸ  ִ. user ̺  ٰ غ:
+---------------------+-------------+-------------+
|  Host               |  User       |  ...        |
+---------------------+-------------+-------------+
|  %                  |  jeffrey    |  ...        |
+---------------------+-------------+-------------+
|  thom               |  as.loc.gov |  ...        |
+---------------------+-------------+-------------+
 ̺  :
+---------------------+-------------+-------------+
|  Host               |  User       |  ...        |
+---------------------+-------------+-------------+
|  thom as.loc.gov    |             |  ...        |
+---------------------+-------------+-------------+
|  %                  |  jeffrey    |  ...        |
+---------------------+-------------+-------------+
ù°   thomas.loc.gov  jeffrey   ϴ     ĪǸ, 
whitehouse.gov  jeffrey ϴ  ι° Ī ȴ.
    , user ̺ Ͽ    
ĪǴ   ϸ ȴ.
6.6  , 2ܰ : û 
Ǿٸ  2ܰ .  Ǿ    䱸 
 ڰ Ϸ   Ͽ   ڰ 
   ִ Ѵ. 
⼭  ̺   ʵ尡  ۵Ѵ.   user, db,  host, 
table_priv, columns_priv ̺  Ѵ. GRANT  REVOKE 
 ̿Ͽ  ̺ ٷ  ִ. 7.25 [GRANT] .
( Ҵ   ̺  ʵ  ϴ     
̴; 6.4[Privilege] .)
user ̺   ڿ ü   ϸ  
Ͱ  ʹ  .  , user ̺ 
ڿ delete  ߴٸ   ȣƮ   ͺ̽ 
ڵ   ִ! ٸ ؼ user ̺    
̸, ( ͺ̽  )Ը user ̺ 
  ϴ  . ٸ ڿԴ user  ̺ 
 'N' ϰ, db host ̺ Ͽ  Ư ͺ̽ 
 ѽ ϴ° .
db  host ̺ Ư ͺ̽  Ѵ.   ̺ 
Host  Db ʵ忡 ϵī  '%'  '_'     
 ̸ ʵ (scope fields)   Ѵ.  '%' Host 
 " ȣƮ" ǹѴ. db ̺ Host  ̸ "host 
̺  ڼ  ϶"  ǹ̴. A '%' or blank  Db 
value in the host table means or "any database." (** or  
 ڳ. host ̺ Db   '%' Ǵ ̸  " 
ͺ̽" ǹѴٴ   **) User  ̸  
ڷ ֵȴ.
   db  host ̺ а  Ѵ.(ÿ user 
̺ д´.) db ̺ Host, Db, User  ʵ   
 host ̺ Host, Db  ʵ  Ѵ.  user ̺ 
 Ưϰ Ǿ ִ   ǰ ּѵ   
߿ ȴ.  ĪǴ  ã,   ߰ 
 Ѵ.
 tables_priv  columns_priv ̺  Ư ̺ ÷  õ 
 Ѵ.db host ̺ Host ʵ  ϵī带 Host 
ʵ忡   ִ.  Db, Table_name,  Column_name ʵ忡
 ϵī峪 鰪   .
Host  ̺  ϵī带        tables_priv   
columns_priv ̺ db ̺ ϰ  Ǹ   
. 
û   Ʒ Ѵ. - ҽ ڵ忡 ģϴٸ, 
⼭ ϴ  ڵ忡  ˰ ణ  ٸٴ  
  ִ.⼭  ڵ尡  ۵ϴ İ ϴ. 
  ϰ ϴµ ̰ ִ ̴.
 û ؼ(shutdown, reload  )   user  ̺ 
üũ Ѵ. ֳĸ user  ̺   ϱ  
. Ͽ û  ϸ  Ǹ ƴ  쿡 
 źεȴ.
 , mysqladmin shutdown ϰ ϴµ user ̺ Ͽ
 ڿ shutdown    , db host  ̺ 
üũ ʴ   źεȴ. (̷ ̺  Shutdown_priv 
÷   ̷  ʿ䵵 )
ͺ̽ õ û (insert, update )   user 
̺ Ͽ  ü()  Ѵ. Ͽ  
û  ϸ  εȴ.
user ̺ ü  ϸ,  db   host ̺
 Ͽ ͺ̽ õ  Ѵ:
1.  db ̺ ĪǴ Host, Db, User ʵ带 ã´. 
  ȣƮ ̸ Mysql  ̸ Host  User Ī
. ڰ ϱ ϴ ͺ̽ Db ʵ忡  Īȴ. 
 Host  User    źεȴ.
2. ĪǴ db ̺   ְ Host ʵ尡  ƴϸ,   
 ͺ̽   Ѵ.
3. ĪǴ db ̺  Host ʵ尡 ̸, host ̺ 
 ȣƮ ͺ̽   ִ ǴѴٴ  ǹѴ. 
̷ ,  ڼ   host ̺ ĪǴ Host   Db 
ʵ带 ã´. host ̺ ĪǴ     źεȴ. 
ĪǴ    ͺ̽    db   host 
̺ Ͽ  intersection Ͽ ȴ.
(** insertection  ϸ .  and  **) ٽ  
, db host ̺    'Y' Ǿ    ȴ.̷ 
 db ̺ Ϲ     ,   
host ̺   host  Ͽ   
  ִ.)
db  host ̺  ̿ ͺ̽ õ    
 ,  ̷  user ̺   ü ѿ 
߰Ѵ.   û  ϸ  ȴ. ٸ 
,  tables_priv  columns_priv ̺  ̺ 
÷  ϰ  ѿ ߰Ѵ.      
ǰų źεȴ.
  ü  Ʈ ѿ ͺ̽,  ̺, ÷
 õ  ߰ϴ Ȯ ʴ.... ̷   
 ʱ û 꿡 Ͽ ϴ...
(It may not be apparent why the server adds the database-, table- and 
column-specific privileges to  the global user  entry privileges  for 
those cases in which  the user privileges  are initially found to  be 
insufficient for the requested operation.)
û Ѱ  ̻  ʿϱ ̴.  , INSERT 
... SELECT    insert  select     ʿϴ. 
  user ̺ Ѱ  ϰ db ̺ Ʈ
 ٸ   ̴. ̷ , ڴ ̷  û 
ϱ  ʿ   ִ.    ü ٸ 
̺ ؼ .....
(In this  case, you  have  the necessary  privileges to   perform the 
request, but   the server  cannot  tell that   from either  table  by 
itself;) ; 
 Ʈ  ε  յǾ Ѵ.
host ̺ ""   ϴµ   ִ. TcX
, host ̺  Ʈ  ý ԵǾ ִ. ⼭
   ȴ.
 ʴ ȣƮ Ű  host ̺   ִ. 
ϴٰ  ʴ   ġ public.your.domain ý 
ִٰ غ. ڴ   Ʈ  ȣƮ    
, host ̺ Ʈ   ý۸ Ѵ : 
+----------------------+------+-----------------------------------+
|       Host           |  Db  |                ...                |
+----------------------+------+-----------------------------------+
|  public.your.domain  |  %   |  ... (all privileges set to 'N')  |
+----------------------+------+-----------------------------------+
|  %.your.domain       |  %   |  ... (all privileges set to 'Y')  |
+----------------------+------+-----------------------------------+
翬   ϴ´ Ǿ ִ   ̺ 
 ؾ Ѵ. (  mysqlaccess  ) 
6.7    
mysqld   ,   ̺   ö ̶
 ȿϰ ȴ.
GRANT, REVOKE, SET PASSWORD  ̿  ̺   ϸ ٷ 
 ν Ѵ.
 ̺  ߴٸ(INSERT, UPDATE  Ͽ),  
  ̺   簡ϵ  ϱ     FLUSH   PRIVIEGES  ̳ 
mysqladmin flush-privileges  ؾ Ѵ.    
 ٽ ϱ     ʴ´.
  ̺ Ǿٴ    , ̹  ϴ 
Ŭ̾Ʈ     ´:
1. ̺ ÷   Ŭ̾Ʈ  û ȴ.
2. ͺ̽    USE db_name ɺ ȴ.
3. ü Ѱ йȣ  Ŭ̾Ʈ     
ȴ.
6.8 ʱ mysql Ѽ
mysql ġϰ , mysql_install_db ũƮ ؼ ʱ  
 ؾ Ѵ. 4.7.1 [Quick install] . mysql_install_db 
ũƮ mysqld  ϰ,    ̺   
ȭѴ:
- mysql root ڴ ̸     ִ.   ȣƮ
   ִ. 
 : ó  root йȣ ִ.     йȣ 
root  ְ   ι´.
-  ڴ 'test'  'test_'  ϴ ͺ̽   
  ι´.  ڰ  ȣƮ     
 ڷ ֵȴ.
- ٸ  źεȴ.    Ϲ ڴ mysqladmin  shutdown 
̳ mysqladmin processlist    .
ġ  ʱ  а  Ǿ ֱ     mysql 
root  йȣ  ؾ Ѵ.    ϸ  ȴ. 
(PASSWORD() Լ ̿ йȣ ؾ Ѵ!):
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
        WHERE user='root';
mysql> FLUSH PRIVILEGES;
or
shell> mysqladmin -u root password new_password
(** PASSWORD()  Լ  ʾƵ ǹǷ .   SQL
 grant  ̿    **)
ù°  ϸ  user ̺ йȣ ƮѴ. 
  ٽ  ̺ е ؾ Ѵ.(FLUSH  PRIVILEGES 
). ֳϸ ٸ δ  ˸   ̴.
(**  ̺ ٽ  ʾƼ  ߴ  йȣ  
ȵǴ 찡  Դϴ.  ϰ ־ؿ **)
root йȣ Ǿ  root Ҷ йȣ 
ؾ Ѵ.
߰ ¾ ϰų Ʈ  йȣ  ʿ䰡  
 root йȣ  ܵΰ  ̴.    ۾
 ϱ  ݵ йȣ ߴ Ȯؾ Ѵ.
⺻  ϴ mysql_install_db ũƮ 캸. 
 ڿ    ̰ ⺻   ִ.
      Ͱ   ٸ    ʱ      ϱ   ϸ, 
mysql_install_db ũƮ ϱ  ϸ ȴ.
ϰ  ̺ ٽ   mysql ͺ̽ ϴ 
丮 '*ISM'   '*.ISD'   ؾ  Ѵ. (  丮 
database 丮 'mysq''̶ ̸ پִ. mysqld --help 
 database 丮     ִ.) ϴ´    
 mysql_install_db ũƮ .
6.9 mysql ο   ߰ϱ
ΰ  ڸ ߰  ִ : GRANT   Ǵ mysql 
 ̺  . GRANT  ϴ   ȣǴ ̴.
Ʒ  ο ڸ ϱ   mysql Ŭ̾Ʈ 
ϴ ش.    ߴͰ  ⺻  
 ϴ  Ѵ.  ̰  ٲٱ   mysqld 
ǰ ִ   ýۿ ־ Ѵٴ   Ѵ.  (**ʱⰪ 
localhost  ϹǷ**)  mysql root ڷ  ؾ 
ϰ root ڴ mysql ͺ̽  insert Ѱ  reload 
  ־ Ѵ. root  йȣ  ٲپ, Ʒ 
 mysql  ¿ йȣ ؾ Ѵ.
GRANT  ̿ ο ڸ ߰  ִ:
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
        IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
        IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
 GRANT    ڸ Ѵ:
monty :      ִ    
йȣ ؾ Ѵ. 츮 monty@localhost  monty@"%"   
GRANT  ؼ ݵ Ǹ ؾ Ѵ. localhost   ߰ 
, mysql_install_db    localhost    
(?)  ȣƮ Ҷ  켱 ´. ֳϸ   
Host ʵ       ̴. (**  
   Ư Host  ͺ ϴ  .
admin : йȣ  localhost    reload process 
  ι . ̰ ڰ mysqladmin processlist 
Ӹ ƴ϶ mysqladmin reload, mysqladmin refresh, mysqladmin flush-* 
   ִ.ͺ̽  õ  ε  ʾҴ. 
̰ ߰ GRANT   ߿   ִ.
dummy : йȣ     localhost   
 .  (privilege type) USAGE ̱   ü 
 'N' Ǿ ִ. USAGE  ƹ ѵ   ʴ´. 
߿ ͺ̽ õ    ִ.
     INSERT    ߰   
̰쿡   ̺ ٽ е ˷־  Ѵ.(**FLUSH 
PRIVILEGES **)
shell> mysql --user=root mysql
mysql>                INSERT                 INTO                user 
VALUES('localhost','monty',PASSWORD('something'),
        'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),
        'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin', 
        Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                VALUES('localhost','dummy',");
mysql> FLUSH PRIVILEGES;
mysql      'Y'   ٸ   ִٴ    . 
3.22.11  Ŀ   ִ Ȯ INSERT   ⼭ admin 
ڿ Ǿ.
 ϱ  ʵ带 'Y'  user ̺  ϸ 
 ȴٴ  . db  host ̺  ʿ.  (** 
  db host ̺   . db    ִ 
ͺ̽  ϰ ϰ host ̺ db̺    
ϰ ϱ  ʿ ̴.     user ̺
 õǾִ **)
 INSERT (dummy ) user ̺  ÷ Ȯ
  ʾҴ. ֳĸ  ÷ ⺻ 'N' Ǿ  ֱ 
.
     custom   ̶   ڸ  ߰Ѵ.   custom 
localhost,   server.domain,   whitehouse.gov        ִ. 
localhost   bankaccount  ͺ̽         
whitehouse.gov expenses ͺ̽,    ȣƮ 
customer ͺ̽ ϱ Ѵ.   ȣƮ  stupid
 йȣ ϱ Ѵ.
GRANT  ̿ ̷   ϱ    
:
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
        ON bankaccount.*
        TO custom@localhost
        IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
        ON expenses.*
        TO custom@whitehouse.gov
        IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
        ON customer.*
        TO custom@'%'
        IDENTIFIED BY 'stupid';
 ̺     Ϸ   
. ( FLUSH PRIVILEGES  ؾ Ѵٴ  ):
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
        VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
        VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
        VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
 
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
        VALUES
        ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
 
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
        VALUES
 
       ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
 
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
        VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
ó  INSERT  custom ڰ йȣ  Ͽ پ 
ȣƮ   ֵ user ̺  ߰Ѵ.   
  ۹̼ǵ  ʴ´. (  ⺻  'N' 
)   INSERT   ȣƮ    , custom 
 bankaccount, expenses, customer ͺ̽    
ϴ db ̺  ߰Ѵ. Ϲ  ̺   
,   ϱ    ̺  ٽ е 
 ־ Ѵ.
Ư ڰ Ư  ýۿ    ֵ ϰ
 Ѵٸ,   GRANT    ִ:
mysql> GRANT ...
        ON *.*
        TO myusername@"%.mydomainname.com"
        IDENTIFIED BY 'mypassword';
 ̺  Ϸ   Ѵ:
mysql> INSERT INTO  user VALUES ('%.mydomainname.com',  'myusername', 
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~
 ̺ ٷ  xmysqladmin, mysql_webadmin, xmysql  α
   ִ. http://www.mysql.com/Contrib  ̷  ƿ
Ƽ ã  ִ.
6.10 йȣ  
  ߿ Ģ ش  : INSERT  UPDATE    
ƴ йȣ   ݵ ȣȭϱ  PASSWORD() Լ 
ؾ Ѵ!! user ̺ йȣ ÷ؽƮ(**Ϲ ؽƮ  
**) ƴ϶ ȣȭ · ϱ ̴. ̷   ؾ
   йȣ Ϸ  ̴:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
        VALUES('%','jeffrey','bLa81m0');
mysql> FLUSH PRIVILEGES;
÷ؽƮ    'bLa81m0'   user ̺   йȣ   
.jeffrey ڰ  йȣ   Ϸ    
mysql Ŭ̾Ʈ  йȣ ȣȭؼ     . 
 ȣȭ йȣ('bLa81m0' ƴϴ) user ̺ йȣ
(÷ؽƮ 'bLa81m0' ̴) Ѵ.  ϰ  
 źѴ:
shell> mysql -u jeffrey -pbLa81m0 test
Access denied
йȣ user ̺ Էµ   ݵ ȣȭǾ ϱ  , 
INSERT    ؾ Ѵ:
mysql> INSERT INTO user (Host,User,Password)
        VALUES('%','jeffrey',PASSWORD('bLa81m0'));
 SET PASSWORD    PASSWORD() Լ ؾ Ѵ:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('bLa81m0');
 : PASSWORD() Լ йȣ ȣȭ Ѵ.   н
 йȣ ȣȭϴ   ٸ. н йȣ  mysql 
йȣ   PASSWORD() н йȣ (** /etc/passwd 
 **) ȣȭǾ   ٰ ϸ  ȴ.
GRANT ... IDENTIFIED BY ̳ mysqladmin password   
ȣ ϸ PASSWORD() Լ ʿ. Ѵ йȣ  ȣȭ
 Ѵ:
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'bLa81m0';
shell> mysqladmin -u jeffrey password bLa81m0
(** , GRANT ̳ mysqladmin password  ϴ° ϰ
? mysql ȣȭ ˰  н ٸ н   mysql 
ڴ  ٸٴ ͵ ٽ ѹ ϰ ־ մϴ.**)
6.11  ź   
mysql  Ϸ    ź  ,  Ʒ ϴ 
Ϳ  ذ  ã  ִ: 
-  ʱ     ̺     ϱ    mysql   ġ   
mysql_install_db ũƮ Ͽ°?  ʾҴٸ  ũƮ
 . 6.8 [Default privileges]  .   ̿  ʱ 
    ִ:
        shell> mysql -u root test
     ̴. mysql  ͺ̽ 丮 
'user.ISD'  ִ Ȯغƾ  Ѵ. (Ϲ 'mysql  ġ 
丮/var/mysql/user.IDS' ̴)
- ġ ϰ  ,  ϰ ڿ    
 Ѵ:
        shell> mysql -u root mysql
ʱ mysql root ڸ йȣ      
. ȹ ֱ  , ٸ mysql  ڸ ϱ    
root йȣ ؾ Ѵ.
root Ϸϴµ   ٰ :
        Access denied for user: '@unknown' to database mysql
̰ user ̺ User ÷ = root   , mysqld 
 Ŭ̾Ʈ ȣƮ̸ ؼ  ٴ  ǹѴ.  ̷ 
  --skip-grant-tables  ɼ  ̿    ٽ  ؾ  ϰ 
'/etc/hosts'  ϰų '\windows\hosts' Ͽ  ȣƮ 
 ߰ؾ Ѵ.
- 3.22.11     3.22.11̳     Ʈߴٸ, 
mysql_fix_privilege_tables ũƮ ߴ°?  ʾҴٸ  
. mysql 3.22.11 GRANT   鼭  ̺ 
 ٲ.
- (INSERT  UPDATE  )  ̺  ư  ȭ 
 ݿ      ̸, FLUSH PRIVILEGES    ϰų 
mysqladmin flush-privileges      ̺  ٽ 
е ؾ Ѵٴ  .   ϱ 
 ȭ  ݿ ʴ´. root йȣ ϰ   
 flush ϱ йȣ  ʿ䰡 . ֳĸ   
йȣ ٲپ  ̴. 
-  ߰    ̸  ٲپ ̴. 
 ̺ ϴ  ο Ŭ̾Ʈ ӿ   ġ
 ̹ ϰ ִ  6.7 [Privileges  changes] Ѵ 
 ģ.
- ϱ , mysqld   --skip-grant-tables ɼ ־  
.  mysql  ̺   ְ Ȱ ϴ
 ۵ϴ üũϴ mysqlaccess ũƮ    ִ. 
ϴ´  Ǿ mysqld  ο  ̺  
 mysq1admin flush-priveleges  Ѵ.
 : ̺ εϴ  --skip-grant-tables ɼ ȿȭ
Ѵ. ̸   ٿŰ ٽ  ʰ   ̺
   ִ.
- , Python,  ODBC α ϴµ   ִٸ, mysql  -u 
user_name db_name Ǵ mysql -u user_name -pyour_pass db_name  
  õغ. (-p  йȣ̿  ٴ  
.  --password=your_pass ·ε   ִ) mysql Ŭ
̾Ʈ  Ǹ α  ִ ̸  ѿ 
 .
- йȣ  ۵ , INSERT, UPDATE, SET  PASSWORD 
 йȣ ϸ鼭 PASSWORD()  Լ ݵ ؾ  Ѵٴ 
 .  PASSWORD() Լ   GRANT ... INDENTIFIED  BY  ̳ 
mysqladmin password  ߴٸ ʿϴ. 6.10 [Passwords] 
.
- localhost   ȣƮ ̸  ̴.  ȣƮ ϰ 
   Ŭ̾Ʈ Ϸ ȣƮ ⺻̴.  
 MIT-pthreads ϴ ýۿ localhost   
۵ ʴ´. (localhost  н    . 
 MIT-pthreads н    ʴ´.) ̿   
ýۿ  Ϸ,  ȣƮ ̸ Ȯϰ ֱ 
 --host ɼ ؾ Ѵ.  mysqld  TCP/IP  
. ̰,  ȣƮ
 user ̺ Ͽ   ȣƮ̸ ־ Ѵ. (   
ȣƮ Ŭ̾Ʈ α Ѵٰ ϴ ̴.)
- mysql -u user_name db_name  ͺ̽ Ϸ     
ź  ,  user ̺    ̴.  mysql -u  root 
mysql  Ͽ ϰ  SQL  :
        mysql> SELECT * FROM user;
⼭  ȣƮ̸ mysql  ̸ ´ Host  User 
  ԵǾ ־ Ѵ.
- Access denied   Ϸ ڿ ȣƮ ̸,  
йȣ ߴ θ  ̴. Ϲ user  ̺ 
   ȣƮ ̸  ̸ Ȯϰ ´ 
  ־ Ѵ.
- ٸ ýۿ mysql       , 
user ̺  Ϸ ϴ ȣƮ ̸ ٴ  Ѵ:
        Host ... is not allowed to connect to this MySQL server
( ȣƮ!)  ƿƼ  mysql Ͽ user  ̺ 
ϰ ϴ /ȣƮ ̸  ߰Ͽ ذ  ִ.  mysql 
3.22  ϰ  ʰ ϰ ϴ ý IP  ڳ ȣƮ 
̸ ٸ, user ̺ Host  ÷  '%'   Էϰ 
 ýۿ --log ɼ  mysqld   . Ŭ̾Ʈ 
ýۿ  õ  mysql α     ߴ
   ִ. ( '%' α    ȣƮ 
̸ ٲ۴.   ȿ    ִ.)
- mysql -u root test  ۵ ϴµ mysql -h your_hostname  -u root 
test  ٿ  , user ̺ Ȯ ȣƮ ̸  
̴. Ϲ  user ̺ Host     ȣ
Ʈ ̸(**   ȣƮ ̸  **)    ִµ 
ý  ؼ ƾ FQDN(fully-qualified domain name -  ** 
  ̸ ȣƮ ̸ **) óϴ  ̴(Ǵ 
ٷ ؼ). , user ̺ ȣƮ ̸ 'taejun'   Ǿ
ִµ, DNS mysql ȣƮ ̸ 'taejun.subnet.se' ˷   
 ̰  ۵  ̴. 
user ̺ Host ÷ μ شϴ IP ڳ ȣƮ  ̸ 
. (, user ̺ Host  ϵī ڸ    
ִ.  , 'taejun.%'.  ȣƮ̸  '%' ϴ 
    ʴ´!)
-  mysql  -u   user_name test     ۵ϴµ   mysql -u   user_name 
other_db_name  ۵ ʴ´ٸ  db ̺ other_db_name   
 ̴.
-  ýۿ mysql -u  user_name db_name  ۵ ϴµ,  ٸ 
Ŭ̾Ʈ ýۿ mysql -u user_name db_name  ۵   ʴ
ٸ, user ̺̳ db ̺ Ŭ̾Ʈ ý    
̴.
-  Access denied   ذ ϸ, user  ̺ ϵ
ī('%' Ǵ '_') ϰ ִ Host      
. ſ Ϲ  Host='%'  User='some user' Է 
 , ̷ ϸ  ýۿ   localhost    
ֵ Ѵٰ ϴ ̴. ̰  ۵ ʴ  
⺻ ѿ Host='localhost'   User=''  ԵǾ ֱ  
. Host   '%'     и 'localhost'   ֱ  , 
localhost   ο Ϻ   ȴ. Ȯ 
 ι°  Host='localhost'  User='some_user'  Էϰų 
Host='localhost'  User=''  ϴ ̴.
-    :
        Access to database denied
db  host  ̺    ̴.   db ̺  Ͽ 
Host ÷ ִٸ, host ̺ db ̺ Ͽ  Ǵ ȣ
Ʈ ̸ ִ Ȯؾ Ѵ.
(** Ϲ db ̺ host   δ , host  ̺ 
ϴ ȣƮ   ִ **)
-    :
        Access to database denied
SELECT ... INTO OUTFILE Ǵ LOAD DATA INFILE  SQL  ϴ 
, user ̺ Ͽ file  Ǿ  ʾ ̴.
- ٸ   Ͽ , mysqld    ɼ 
. ( , --debug=d,general,query)   ɿ   
 Բ,  õϴ ȣƮ ڿ     
̴. G.1 [Debugging] .
- mysql  ̺ ٸ  εư   ϸƮ 
˷߰ڴٰ ,  mysql   ̺   Ͽ ؾ  Ѵ. 
mysqldump  mysql      ̺      ִ.   
mysqlbug ƮƮ Ͽ  ø.
-    , mysqld   ʰų  ߸ 
̳ Ʈ Ϸ õϴ :
        Can't connect to local MySQL server
        Can't connect to MySQL server on some_hostname
 mysqld   ۵ϴ ps ̿ ȮѴ.   
    ִ    Ȯϰ           ƾ    Ѵ.(Ϲ 
`/tmp/mysql.sock' ) Ǵ telnet host_name 3306   õغ
.    ڼ     mysqladmin  version    mysqladmin  -h 
host_name version     ִ.    ִ mysql 
Ÿ 丮  α  غ.
Ŭ̾Ʈ α  ̳ ȯ     з
   ִٴ  .    ʾҴµ Ŭ
̾Ʈ ߸ ⺻  з   Ǹ,  Ȩ 
丮 ȯ溯 '.my.cnf'  غ.  ⼭  
 зͿʹ 谡   ý  mysql    
   ִ. 4.14.4 [Option files] .  Ŭ̾Ʈ ƹ 
ɼǵ  ʾҴµ Access denied    , ɼ 
 ߿   йȣ   ʾҴ  Ȯ .  4.14.4 
[Option files] .
6.12 ũĿ Ͽ mysql ϰ ϴ 
mysql    Ϲ йȣ ؾ  Ѵ. йȣ
   ܼ ؽƮ ۵ ʴ´.
/Ŭ̾Ʈ  ȣȭ ʴ´;      
    ִ ؽƮ ۵ȴ.      
  ư ϱ   (mysql 3.22 ̻ ) 
   ִ.     Ȯϰ ϱ    ssh ġ    ִ. 
(http://www.cs.hut.fi/ssh ) ̰ ̿ mysql  Ŭ̾Ʈ 
̿ ȣȭ TCP/IP    ִ.
mysql ý  ϰ    ϰ :
-  mysql ڰ йȣ .  ڰ  йȣ 
 'mysql - u ̸'  ̿ ϰ  ڷ  α  
ִٴ  . ̰ Ŭ̾Ʈ/ ø̼  Ϲ 
۵̴. mysql_install_db ũƮ ϱ   ũƮ 
Ͽ   йȣ ٲ  ִ. Ǵ mysql  root 
 йȣ ٲ    ϸ ȴ:
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
        WHERE user='root';
mysql> FLUSH PRIVILEGES;
- mysql  н root  ڷ  . mysqld   ٸ 
ڰ   ִ.   ϰ ϱ  mysql̶ 
н ڸ   ִ. ٸ н ڷ  mysqld ϸ 
user ̺ root  ̸ ٲ ʿ䰡 . mysqld ٸ 
н ڰ ϱ  mysql.server ũƮ ϸ ȴ. 
 su   Ѵ.  ڼ   16.7 [Changing  mysql 
user] .
- mysqld   ִ ڸ ͺ̽  丮 б/
   ִ Ȯ.
-  ڿ process   . mysqladmin processlist  
ϸ  ϴ     ִ. Ƿ ̷ 
      ִ  ڴ  ٸ    UPDATE  user  SET 
password=PASSWORD(_'no_secure') Ǹ   ִ.mysql process  
  ڸ  ߰(extra)  Ѵ.  mysql 
root ڴ  Ϲ  Ǿ αϰ    
 ִ.
-  ڿ file   . ̷   ִ ڴ 
mysqld   ִ   ý      
 ִ.  ϰ ϱ  SELECT ... INTO OUTFILE   Ǵ 
   ڰ б⸸    ̹ ϴ  
  .
(** file  LOAD DATA INFILE , SELECT .. INTO OUTFILE  ̿
   ϰ   ִ  Ѵ. ̷  
 ڴ mysql  а   ִ  а    ִ 
 ȴ. Ϲ ڿ ̷   ʿ .  ʿ 
и  ִ  .  븻. **)
- DNS  ŷ Ѵٸ  Ը ȣƮ̸   IP 
. ⺻ mysqld   --secure ɼ ȣƮ̸ ϰ  
.   ϵī ڰ Ե ȣƮ̸   Ҷ 
 ؾ Ѵ.
- mysql.server ũƮ н root  йȣ ִ´ٸ, 
 ũƮ  root   ֵ ؾ Ѵ.
 mysqld ɼ Ȱ õǾ ִ:
--secure : gethostbyname() ý ݿ   ϵ IP ڰ   
ȣƮ̸ resolve  Ͱ  Ѵ. ̰   
 ȣƮ ̸ ķؼ ϴ  ư .   ɼ
  ȣƮ̸    ߰Ѵ. ؼϴµ 
 ð  ɷ mysql 3.21 ⺻  Ǿ  
. mysql 3.22 ȣƮ̸ ijϰ  ɼ  ⺻ 
Ǿ ִ.
(** Լ gethostbyname() ȣƮ ̸ ڷ   شϴ IP 
ּ  Ÿ  شϴ ü   ü   
ϴ ԼԴϴ.  ؼ ȣƮ ̸  ش IP ּҸ ã
.**)
--skip-grant-tables :  ɼ ϸ   ý  
 ʴ´.   ڰ  ͺ̽    
! 
(mysqladmin reload  Ͽ    ̺ ϵ
   ִ.)
--skip-name-resolve : ȣƮ̸ ؼ ʴ´.  ̺  
 Host ÷ ݵ IP ̰ų ȣƮ̾ Ѵ.
--skip-networking : Ʈ  TCP/IP  . mysqld 
     н          .     ɼ 
MIT-pthreads ϴ ýۿ  ۵  ʴ´.  ֳ
 MIT-pthreads Ű н   ʱ ̴.
(**  ϴ 鿡Դ  ? н    
ϴϱ. ̿ ϰ postgres 6.3 ĺΰ? ⺻
 н   ٲ. **)
7. MySQL language reference.
7.1 Literals: how to write strings and numbers
7.1.1 Strings
A string is  a sequence  of characters, surrounded  by either  single 
quote (`'') or double quote (`"') characters. Examples:
'a string'
"another string"
Within a  string, certain  sequences have  special meaning.   Each of 
these sequences begins with  a backslash (`\'),  known as the  escape 
character. MySQL recognizes the following escape sequences:
\0      An ASCII 0 (NUL) character.
\n      A newline character.
\t      A tab character.
\r      A carriage return character.
\b      A backspace character.
\'      A single quote (`'') character.
\"      A double quote (`"') character.
\\      A backslash (`\') character.
\%      A `%' character. This is used to search for literal instances 
        of `%' in contexts where  `%' would otherwise be  interpreted 
        as a wildcard character.
\_      A `_' character. This is used to search for literal instances 
        of `_' in contexts where  `_' would otherwise be  interpreted 
        as a wildcard character.
There are several ways to include quotes within a string:
A `'' inside a string quoted with `'' may be written as `'''.
A `"' inside a string quoted with `"' may be written as `""'.
You can precede the quote character with an escape character (`\').
A `'' inside a string quoted with `"' needs no special  treatment and 
need not be doubled or escaped. In the same way, `"' inside  a string 
quoted with `'' needs no special treatment.
The  SELECT  statements  shown  below  demonstrate  how  quoting  and 
escaping work:
mysq> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
If you want to insert binary  data into a BLOB column, the  following 
characters must be represented by escape sequences:
NUL     ASCII 0. You should represent  this by `\0' (a backslash  and 
        an ASCII `0' character).
\       ASCII 92, backslash. Represent this by `\\'.
'       ASCII 39, single quote. Represent this by `\''.
"       ASCII 34, double quote. Represent this by `\"'.
 If   you  write   C  code,   you  can   use  the   C   API  function 
mysql_escape_string() to escape characters for the INSERT  statement. 
See section  . In  Perl, you  can use  the quote  method of   the DBI 
package to convert special characters to the proper escape sequences. 
See section .
You should use an  escape function on  any string that might  contain 
any of the special characters listed above!
7.1.2 Numbers
Integers are represented as a sequence of digits. Floats use `.' as a 
decimal separator. Either type  of number may  be preceded by `-'  to 
indicate a negative value.
Examples of valid integers:
1221
0
-32
Examples of valid floating-point numbers:
294.42
-32032.6809e+10
148.00
An integer may be used in a floating-point context; it is interpreted 
as the equivalent floating-point number.
7.1.3 Hexadecimal values
MySQL supports hexadecimal values. In number context these  acts like 
an integer (64 bit  precision). In string  context these acts like  a 
binary string  where  each pair   of hex  digits is   converted to  a 
character.
mysql> SELECT 0xa+0
       -> 10
mysql> select 0x5061756c;
       -> Paul
Hexadecimal strings is  often used by  ODBC to  give values for  BLOB 
columns.
7.1.4 NULL values
The NULL value means ``no data'' and is different from values such as 
0 for numeric types or the empty string for string types. See section
18.15 Problems whit NULL values.
NULL may be  represented by  \N when using  the text  file import  or 
export formats  (LOAD  DATA INFILE,  SELECT  ... INTO  OUTFILE).  See 
section  7.15 LOAD DATA INFILE syntax.
7.1.5 Database, table, index, column and alias names
Database, table, index, column  and alias names  all follow the  same 
rules in MySQL:
A name   may consist  of alphanumeric   characters from  the  current 
character set and  also `_'  and `$'.  The default  character set  is 
ISO-8859-1 Latin1;  this may  be changed  by recompiling   MySQL. See 
section  9.1.1 The charater set used for data and sorting.
A database, table, index  or column name can  be up to 64  characters 
long. An alias name can be up to 256 characters long.
A name may  start with  any character  that is  legal in  a name.  In 
particular, a name may  start with a  number (this differs from  many 
other database  systems!). However,  a name  cannot consist{{
}} 
only{{
}} 
o
f
 numbers.
It is  recommended that  you do  not use  names like  1e, because  an 
expression like  1e+1 is  ambiguous.  It may  be interpreted   as the 
expression 1e + 1 or as the number 1e+1.
You cannot  use the  `.' character  in names  because it  is used  to 
extend the format by which you can refer to columns  (see immediately 
below).
In MySQL you can refer to a column using any of the following forms:
+--------------------+---------------------------------------------+
| Column reference   |  Meaning                                    |
+--------------------+---------------------------------------------+
| col_name           | Column col_name from whichever table used   |
|                    | in the query contains a column of that name |
+--------------------+---------------------------------------------+
| tbl_name.col_name  | Column col_name from table tbl_name         |
|                    | of the current database                     |
+--------------------+---------------------------------------------+
| db_name.tbl        | Column col_name from table tbl_name         |
| _name.col_name     | of the database db_name. This form is       |
|                    | available in MySQL 3.22 or later.           |
+--------------------+---------------------------------------------+
You need  not specify  a tbl_name  or db_name.tbl_name  prefix for  a 
column reference   in a   statement unless  the  reference  would  be 
ambiguous. For  example, suppose  tables  t1 and  t2 each   contain a 
column c, and you retrieve c in a SELECT statement that uses  both t1 
and t2. In this case, c is  ambiguous because it is not unique  among 
the tables used in  the statement, so  you must indicate which  table 
you mean by writing  t1.c or t2.c.  Similarly, if you are  retrieving 
from a table t in  database db1 and from  a table t in database  db2, 
you must  refer to  columns  in those  tables as   db1.t.col_name and 
db2.t.col_name.
 The syntax   .tbl_name means   the table  tbl_name  in  the  current 
database. This  syntax is  accepted for  ODBC compatibility,  because 
some ODBC programs prefix table names with a `.' character.
7.1.5.1 Case sensitivity in names
In MySQL, databases  and tables correspond  to directories and  files 
within those directories. Consequently,  the case sensitivity of  the 
underlying  operating  system  determines  the  case  sensitivity  of 
database and table  names. This  means database and  table names  are 
case sensitive in Unix and case insensitive in Win32.
Note: Although  database and  table names  are case   insensitive for 
Win32, you  should not   refer to a   given database or  table  using 
different cases within the same query. The following query  would not 
work because it refers to a table both as my_table and as MY_TABLE:
SELECT * FROM my_table WHERE MY_TABLE.col=1;
Column names are case insensitive in all cases.
Aliases on tables are case  sensitive. The following query would  not 
work because it refers to the alias both as a and as A:
mysql> SELECT col_name FROM tbl_name AS a
        WHERE a.col_name = 1 OR A.col_name = 2;
Aliases on columns are case insensitive.
7.2 Column types
MySQL supports a number  of column types,  which may be grouped  into 
three categories:  numeric types,  date and  time types,   and string 
(character) types. This section first gives an overview of  the types 
available and  summarizes the  storage requirements  for each  column 
type, then provides a more detailed description of the  properties of 
the types in each category. The overview is intentionally  brief. The 
more  detailed  descriptions  should   be consulted   for  additional 
information about  particular column   types, such as  the  allowable 
formats in which you can specify values.
The column types supported by  MySQL are listed below. The  following 
code letters are used in the descriptions:
M       Indicates the maximum display size. The maximum legal display 
        size is 255.
D       Applies to floating-point types  and indicates the number  of 
        digits following the decimal point.
Square   brackets   (`['   and    `]')   indicate   parts   of   type       
       specifiers that are optional.
Note  that  if  you  specify   ZEROFILL for   a column,   MySQL  will 
automatically add the UNSIGNED attribute to the column.
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
 A very small integer. The signed range is -128 to 127.  The unsigned 
range is 0 to 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
 A small integer. The signed range  is -32768 to 32767. The  unsigned 
range is 0 to 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
 A medium-size integer. The signed range is -8388608 to  8388607. The 
unsigned range is 0 to 16777215.
NT[(M)] [UNSIGNED] [ZEROFILL]
 A  normal-size   integer.  The   signed range   is   -2147483648  to 
2147483647. The unsigned range is 0 to 4294967295.
NTEGER[(M)] [UNSIGNED] [ZEROFILL]
 This is a synonym for INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
 A  large  integer.  The  signed  range  is  -9223372036854775808  to 
9223372036854775807. The unsigned range is 0 to 18446744073709551615. 
Note that  all  arithmetic is   done using signed   BIGINT or  DOUBLE 
values, so   you shouldn't  use unsigned   big integers  larger  than 
9223372036854775807 (63 bits) except with bit functions! Note that -, 
+ and * will  use BIGINT arithmetic  when both arguments are  INTEGER 
values! This means that if you multiply two big integers  (or results 
from functions that return integers)  you may get unexpected  results 
if the result is larger than 9223372036854775807.
FLOAT(precision) [ZEROFILL]
 A floating-point number. Cannot be  unsigned. precision can be 4  or 
8.  FLOAT(4)  is   a single-precision   number  and   FLOAT(8) is   a 
double-precision number. These  types are like  the FLOAT and  DOUBLE 
types described  immediately below.  FLOAT(4) and  FLOAT(8) have  the 
same ranges as the  corresponding FLOAT and  DOUBLE types, but  their 
display size and number of decimals is undefined. In MySQL 3.23, this 
is  a  true   floating point   value.  In   earlier MySQL   versions, 
FLOAT(precision) always has 2 decimals.  This syntax is provided  for 
ODBC compatibility.
FLOAT[(M,D)] [ZEROFILL]
 A   small  (single-precision)   floating-point  number.   Cannot  be 
unsigned. Allowable values are -3.402823466E+38 to  -1.175494351E-38, 
0 and 1.175494351E-38 to 3.402823466E+38.
DOUBLE[(M,D)] [ZEROFILL]
 A normal-size  (double-precision) floating-point  number. Cannot  be 
unsigned.   Allowable   values    are   -1.7976931348623157E+308   to 
-2.2250738585072014E-308,    0    and   2.2250738585072014E-308    to 
1.7976931348623157E+308.
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
 These are synonyms for DOUBLE.
DECIMAL(M,D) [ZEROFILL]
 An unpacked floating-point number. Cannot be unsigned.  Behaves like 
a CHAR column: ``unpacked'' means the  number is stored as a  string, 
using one character for each digit  of the value, the decimal  point, 
and, for negative numbers, the `-' sign. If D is 0, values  will have 
no decimal point  or fractional  part. The maximum  range of  DECIMAL 
values is the same as  for DOUBLE, but the  actual range for a  given 
DECIMAL column may be constrained by the choice of M and D.  In MySQL 
3.23 the M argument no longer includes the sign or the decimal point. 
(This is according to ANSI SQL.)
NUMERIC(M,D) [ZEROFILL]
 This is a synonym for DECIMAL.
DATE
 A date. The supported range  is '1000-01-01' to '9999-12-31'.  MySQL 
displays DATE values in 'YYYY-MM-DD' format, but allows you to assign 
values to DATE columns using either strings or numbers.
DATETIME
 A date  and time  combination. The  supported range   is '1000-01-01 
00:00:00' to '9999-12-31 23:59:59'. MySQL displays DATETIME values in 
'YYYY-MM-DD HH:MM:SS'  format, but  allows you  to assign   values to 
DATETIME columns using either strings or numbers.
TIMESTAMP[(M)]
 A timestamp. The range is  '1970-01-01 00:00:00' to sometime in  the 
year  2037.  MySQL  displays   TIMESTAMP values   in  YYYYMMDDHHMMSS, 
YYMMDDHHMMSS, YYYYMMDD or YYMMDD format, depending on whether M is 14 
(or missing),   12, 8  or 6,   but allows  you to   assign values  to 
TIMESTAMP columns using either strings or numbers. A TIMESTAMP column 
is useful for  recording the  date and time  of an  INSERT or  UPDATE 
operation because it is automatically set to the date and time of the 
most recent operation if you don't give it a value yourself.  You can 
also set it  to the  current date  and time  by assigning  it a  NULL 
value. See section 7.2.6 Date and time types
TIME
 A time. The  range is  '-838:59:59' to  '838:59:59'. MySQL  displays 
TIME values in 'HH:MM:SS' format, but allows you to assign  values to 
TIME columns using either strings or numbers.
YEAR
 A year.  The allowable  values are  1901 to  2155,  and 0000.  MySQL 
displays YEAR values in YYYY format, but allows you to  assign values 
to YEAR columns using  either strings or  numbers. (The YEAR type  is 
new in MySQL 3.22.)
CHAR(M) [BINARY]
 A fixed-length string that is always right-padded with spaces to the 
specified length when stored. The range of M is 1 to  255 characters. 
Trailing spaces are removed when the value is retrieved.  CHAR values 
are sorted and compared in case-insensitive fashion unless the BINARY 
keyword is given.
VARCHAR(M) [BINARY]
 A variable-length string. Note: Trailing spaces are removed when the 
value is stored (this differs  from the ANSI SQL specification).  The 
range of M  is 1  to 255 characters.  VARCHAR values  are sorted  and 
compared in  case-insensitive fashion  unless the  BINARY keyword  is 
given. See section 7.6.1 Silent column specification changes.
TINYBLOB
TINYTEXT
 A BLOB  or TEXT  column  with a  maximum length   of 255 (2^8  -  1) 
characters. See section  7.6.1 Silent column specification changes.
BLOB
TEXT
 A BLOB or  TEXT column with  a maximum  length of 65535  (2^16 -  1) 
characters. See section  7.6.1 Silent column specification changes.
MEDIUMBLOB
MEDIUMTEXT
 A BLOB or TEXT column with a  maximum length of 16777215 (2^24 -  1) 
characters. See section  7.6.1 Silent column specification changes.
LONGBLOB
LONGTEXT
 A BLOB or TEXT column with a maximum length of 4294967295 (2^32 - 1) 
characters. See section  7.6.1 Silent column specification changes.
ENUM('value1','value2',...)
 An enumeration. A string object that can have only one value, chosen 
from the list of values 'value1', 'value2', ..., or NULL. An ENUM can 
have a maximum of 65535 distinct values.
SET('value1','value2',...)
 A set. A string object  that can have zero  or more values, each  of 
which must be chosen from the list of values 'value1',  'value2', ... 
A SET can have a maximum of 64 members.
7.2.1 Column type storage requirements
The storage requirements for  each of the  column types supported  by 
MySQL are listed below by category.
7.2.2 Numeric types
+--------------------+---------------------------+
|  Column type       |  Storage required         |  
+--------------------+---------------------------+
|  TINYINT           |  1 byte                   |  
+--------------------+---------------------------+
|  SMALLINT          |  2 bytes                  |  
+--------------------+---------------------------+
|  MEDIUMINT         |  3 bytes                  |  
+--------------------+---------------------------+
|  INT               |  4 bytes                  |  
+--------------------+---------------------------+
|  INTEGER           |  4 bytes                  |  
+--------------------+---------------------------+
|  BIGINT            |  8 bytes                  |  
+--------------------+---------------------------+
|  FLOAT(4)          |  4 bytes                  |  
+--------------------+---------------------------+
|  FLOAT(8)          |  8 bytes                  |  
+--------------------+---------------------------+
|  FLOAT             |  4 bytes                  |  
+--------------------+---------------------------+
|  DOUBLE            |  8 bytes                  |  
+--------------------+---------------------------+
|  DOUBLE PRECISION  |  8 bytes                  |  
+--------------------+---------------------------+
|  REAL              |  8 bytes                  |  
+--------------------+---------------------------+
|  DECIMAL(M,D)      |  M bytes (D+2, if M < D)  |  
+--------------------+---------------------------+
|  NUMERIC(M,D)      |  M bytes (D+2, if M < D)  |  
+--------------------+---------------------------+
7.2.3 Date and time types
+--------------------+---------------------------+
|  Column type       |  Storage required         |  
+--------------------+---------------------------+
|  DATETIME          |  8 bytes                  |
+--------------------+---------------------------+
|  DATE              |  3 bytes                  |
+--------------------+---------------------------+
|  TIMESTAMP         |  4 bytes                  |
+--------------------+---------------------------+
|  TIME              |  3 bytes                  |
+--------------------+---------------------------+
|  YEAR              |  1 byte                   |
+--------------------+---------------------------+
+--------------------------+--------------------------------------+
|  Column type             |  Storage required                    | 
+--------------------------+--------------------------------------+
|  CHAR(M)                 |  M bytes, 1 <= M <= 255              | 
+--------------------------+--------------------------------------+
|  VARCHAR(M)              |  L+1 bytes, where L <= M and         | 
|                          |  1 <= M <= 255                       | 
+--------------------------+--------------------------------------+
|  TINYBLOB, TINYTEXT      |  L+1 bytes, where L < 2^8            | 
+--------------------------+--------------------------------------+
|  BLOB, TEXT              |  L+2 bytes, where L < 2^16           | 
+--------------------------+--------------------------------------+
|  MEDIUMBLOB, MEDIUMTEXT  |  L+3 bytes, where L < 2^24           | 
+--------------------------+--------------------------------------+
|  LONGBLOB, LONGTEXT      |  L+4 bytes, where L < 2^32           | 
+--------------------------+--------------------------------------+
|  ENUM('value1',          |  1 or 2 bytes, depending             | 
|  'value2',...)           |  on the number of enumeration values | 
|                          |  (65535 values maximum)              | 
+--------------------------+--------------------------------------+
|  SET('value1',           |  1, 2, 3, 4 or 8 bytes, depending    | 
|  'value2',...)           |  on the number of set members        | 
|                          |  (64 members maximum)                | 
+--------------------------+--------------------------------------+
VARCHAR and the BLOB  and TEXT types  are variable-length types,  for 
which the storage requirements depend on the actual length  of column 
values (represented by L in the preceding table), rather than  on the 
type's maximum possible size. For  example, a VARCHAR(10) column  can 
hold a string  with a  maximum length  of 10  characters. The  actual 
storage required is  the length  of the string  (L), plus  1 byte  to 
record the length of the  string. For the string  'abcd', L is 4  and 
the storage requirement is 5 bytes.
The BLOB and  TEXT types require  1, 2, 3  or 4  bytes to record  the 
length of the column value, depending on the maximum  possible length 
of the type.
If a  table includes  any variable-length  column types,   the record 
format will  also  be variable-length.   Note that when   a table  is 
created, MySQL may under  certain conditions change  a column from  a 
variable-length type   to a  fixed-length type,   or vice-versa.  See 
section  7.6.1 Silent column specification changes.
The size of an ENUM object  is determined by the number of  different 
enumeration values. 1 byte  is used for  enumerations with up to  255 
possible values. 2 bytes are used  for enumerations with up to  65535 
values.
The size of a SET object is determined by the number of different set 
members. If the  set size is  N, the  object occupies (N+7)/8  bytes, 
rounded up to 1, 2, 3, 4 or 8  bytes. A SET can have a maximum of  64 
members.
7.2.5 Numeric types
All integer types can have  an optional attribute UNSIGNED.  Unsigned 
values can be used when you want to allow only positive numbers  in a 
column and you need a little bigger numeric range for the column.
All numeric types can have an optional attribute ZEROFILL. Values for 
ZEROFILL columns   are left-padded  with zeroes   up to  the  maximum 
display length when  they are  displayed. For example,  for a  column 
declared as INT(5) ZEROFILL, a value of 4 is retrieved as 00004.
When asked to store a value in  a numeric column that is outside  the 
column  type's  allowable  range,   MySQL clips   the value   to  the 
appropriate endpoint  of the  range and  stores the   resulting value 
instead.
For example, the range of an INT column is -2147483648 to 2147483647. 
If you try  to insert -9999999999  into an INT  column, the value  is 
clipped to the lower endpoint of the range, and -2147483648 is stored 
instead. Similarly, if  you try to  insert 9999999999, 2147483647  is 
stored instead.
If the INT column is UNSIGNED, the size of the column's range  is the 
same but its endpoints shift  up to 0 and  4294967295. If you try  to 
store -9999999999 and  9999999999, the  values stored  in the  column 
become 0 and 4294967296.
Conversions that occur due to  clipping are reported as  ``warnings'' 
for ALTER   TABLE, LOAD  DATA INFILE,   UPDATE and  multi-row  INSERT 
statements.
The maximum display size (M) and number of decimals (D) are  used for 
formatting and calculation of maximum column width.
MySQL will store any value that fits a column's storage type  even if 
the value exceeds the display size. For example, an INT(4) column has 
a display size of 4. Suppose you insert a value which has more than 4 
digits into the column, such as 12345. The display size  is exceeded, 
but the allowable range of the INT  type is not, so MySQL stores  the 
actual value, 12345. When retrieving the value from the column, MySQL 
returns the actual value stored in the column.
The DECIMAL type  is considered a  numeric type  (as is its  synonym, 
NUMERIC), but such  values are  stored as strings.  One character  is 
used for each digit of  the value, the decimal  point (if D > 0)  and 
the `-' sign (for negative numbers).  If D is 0, DECIMAL and  NUMERIC 
values contain no decimal point or fractional part.
The maximum range of  DECIMAL values is the  same as for DOUBLE,  but 
the actual range for a given DECIMAL column may be constrained by the 
choice of   M and  D.  For example,   a type  specification  such  as 
DECIMAL(4,2) indicates a maximum length  of four characters with  two 
digits after the decimal  point. Due to the  way the DECIMAL type  is 
stored, this specification results in  an allowable range of -.99  to 
9.99, much less than the range of a DOUBLE.
To avoid some rounding problems, MySQL always rounds  everything that 
it stores  in any  floating-point column  to the  number of  decimals 
indicated by the column specification. Suppose you have a column type 
of FLOAT(8,2). The number of decimals is 2, so a value such  as 2.333 
is rounded to two decimals and stored as 2.33.
7.2.6 Date and time types
The date and time types are DATETIME, DATE, TIMESTAMP, TIME and YEAR. 
Each of these  has a range  of legal  values, as well  as a  ``zero'' 
value that is used when you specify an illegal value.
Here are some  general considerations  to keep in  mind when  working 
with date and time types:
MySQL retrieves values for  a given date or  time type in a  standard 
format, but it attempts to interpret a variety of formats  for values 
that you supply (e.g., when you specify a value to be assigned  to or 
compared to  a date  or time  type). Nevertheless,  only the  formats 
described in the  following sections  are supported.  It is  expected 
that you  will supply  legal values,  and unpredictable   results may 
occur if you use values in other formats.
Although MySQL  tries  to interpret  values  in several  formats,  it 
always expects the  year part of  date values  to be leftmost.  Dates 
must be given in year-month-day order (e.g., '98-09-04'), rather than 
in  the   month-day-year or   day-month-year   orders commonly   used 
elsewhere (e.g., '09-04-98', '04-09-98').
MySQL automatically converts a date or time type value to a number if 
the value is used in a numeric context, and vice versa.
When MySQL encounters a value for a date or time type that is  out of 
range or otherwise illegal for the type, it converts the value to the 
``zero'' value for  that type.  (The exception  is that  out-of-range 
TIME values  are clipped  to  the appropriate  endpoint of   the TIME 
range.) The table below  shows the format  of the ``zero'' value  for 
each type:
+---------------+------------------------------------+
|  Column type  |  ``Zero'' value                    |  
+---------------+------------------------------------+
|  DATETIME     |  '0000-00-00 00:00:00'             |  
+---------------+------------------------------------+
|  DATE         |  '0000-00-00'                      |  
+---------------+------------------------------------+
|  TIMESTAMP    |  00000000000000                    |  
|               |  (length depends on display size)  |  
+---------------+------------------------------------+
|  TIME         |  '00:00:00'                        |  
+---------------+------------------------------------+
|  YEAR         |  0000                              |  
+---------------+------------------------------------+
The ``zero'' values are special, but  you can store or refer to  them 
explicitly using the values shown in the table. You can also  do this 
using the values '0' or 0, which are easier to write.
``Zero'' date   or time  values used   through MyODBC  are  converted 
automatically to NULL in MyODBC 2.50.12 and above, because ODBC can't 
handle such values.
7.2.6.1 Y2K issues and date types
MySQL itself is Y2K-safe (see section  1.6 Year 2000 compliance), but 
input values presented to MySQL may not be. Any input containing 
2-digit year values is ambiguous, since the century is unknown. Such 
values must be interpreted into 4-digit form since MySQL stores years 
internally using four digits.
For DATETIME, DATE, TIMESTAMP and YEAR types, MySQL interprets dates 
with ambiguous year values using the following rules:
Year values in the range 00-69 are converted to 2000-2069.
Year values in the range 70-99 are converted to 1970-1999.
Remember that these rules provide only reasonable guesses as to what 
your data mean. If the heuristics used by MySQL don't produce the 
correct values, you should provide unambiguous input containing 
4-digit year values.
7.2.6.2 The DATETIME, DATE and TIMESTAMP types
The DATETIME, DATE and TIMESTAMP types are related. This section 
describes their characteristics, how they are similar and how they 
differ.
The DATETIME type is used when you need values that contain both date 
and time information. MySQL retrieves and displays DATETIME values in 
'YYYY-MM-DD HH:MM:SS'  format.  The supported   range is  '1000-01-01 
00:00:00'  to   '9999-12-31  23:59:59'.  (``Supported''   means  that 
although earlier values might work,  there is no guarantee that  they 
will.)
The DATE type is used when you need only a date value, without a time 
part. MySQL   retrieves and   displays DATE  values  in  'YYYY-MM-DD' 
format. The supported range is '1000-01-01' to '9999-12-31'.
The TIMESTAMP  column  type provides   a type  that you   can use  to 
automatically mark INSERT or UPDATE operations with the  current date 
and time. If you have multiple TIMESTAMP columns, only the  first one 
is updated automatically.
Automatic updating of the first TIMESTAMP column occurs under  any of 
the following conditions:
The column is  not specified  explicitly in  an INSERT  or LOAD  DATA 
INFILE statement.
The column is  not specified  explicitly in an  UPDATE statement  and 
some other column  changes value. (Note  that an  UPDATE that sets  a 
column to  the value  it already  has will  not  cause the  TIMESTAMP 
column to be  updated, because  if you set  a column  to its  current 
value, MySQL ignores the update for efficiency.)
You explicitly set the TIMESTAMP column to NULL.
TIMESTAMP columns other than the first may also be set to the current 
date and time. Just set the column to NULL, or to NOW().
You can  set any   TIMESTAMP column to   a value different  than  the 
current date and time by setting it explicitly to the  desired value. 
This is true even  for the first TIMESTAMP  column. You can use  this 
property if,  for example,  you want  a TIMESTAMP  to be  set to  the 
current date and time when  you create a row,  but not to be  changed 
whenever the row is updated later:
Let MySQL   set the   column when   the row  is  created.  This  will 
initialize it to the current date and time.
When you perform subsequent updates to other columns in the  row, set 
the TIMESTAMP column explicitly to its current value.
On the other hand,  you may find  it just as easy  to use a  DATETIME 
column that you initialize to NOW() when the row is created and leave 
alone for subsequent updates.
TIMESTAMP values may range from the beginning of 1970 to  sometime in 
the year 2037, with a resolution of one second. Values  are displayed 
as numbers.
The format in  which MySQL  retrieves and  displays TIMESTAMP  values 
depends on the display size, as  illustrated by the table below.  The 
`full' TIMESTAMP format is  14 digits, but  TIMESTAMP columns may  be 
created with shorter display sizes:
+-----------------+------------------+
|  Column type    |  Display format  |  
+-----------------+------------------+
|  TIMESTAMP(14)  |  YYYYMMDDHHMMSS  |  
+-----------------+------------------+
|  TIMESTAMP(12)  |  YYMMDDHHMMSS    |  
+-----------------+------------------+
|  TIMESTAMP(10)  |  YYMMDDHHMM      |  
+-----------------+------------------+
|  TIMESTAMP(8)   |  YYYYMMDD        |  
+-----------------+------------------+
|  TIMESTAMP(6)   |  YYMMDD          |  
+-----------------+------------------+
|  TIMESTAMP(4)   |  YYMM            |  
+-----------------+------------------+
|  TIMESTAMP(2)   |  YY              |  
+-----------------+------------------+
All TIMESTAMP  columns  have the  same  storage size,  regardless  of 
display size. The most common display sizes are 6, 8, 12, and 14. You 
can specify an  arbitrary display  size at table  creation time,  but 
values of 0 or greater than 14 are coerced to 14. Odd-valued sizes in 
the range from 1 to 13 are coerced to the next higher even number.
You can specify DATETIME,  DATE and TIMESTAMP  values using any of  a 
common set of formats:
As a string  in either 'YYYY-MM-DD  HH:MM:SS' or 'YY-MM-DD  HH:MM:SS' 
format. A ``relaxed''  syntax is  allowed--any non-numeric  character 
may be used as  the delimiter between date  parts or time parts.  For 
example,   '98-12-31   11:30:45',  '98.12.31   11+30+45',   '98/12/31 
11*30*45' and '98@12@31 11^30^45' are equivalent.
As  a  string   in either   'YYYY-MM-DD'  or   'YY-MM-DD' format.   A 
``relaxed'' syntax  is allowed  here, too.  For example,  '98-12-31', 
'98.12.31', '98/12/31' and '98@12@31' are equivalent.
As  a  string  with  no  delimiters  in  either  'YYYYMMDDHHMMSS'  or 
'YYMMDDHHMMSS' format,  provided that  the string  makes sense   as a 
date.   For   example,   '19970523091528'  and   '970523091528'   are 
interpreted as '1997-05-23 09:15:28',  but '971122459015' is  illegal 
(it has a nonsensical minute part) and becomes '0000-00-00 00:00:00'.
As a  string with  no  delimiters in  either 'YYYYMMDD'   or 'YYMMDD' 
format, provided that the string makes sense as a date.  For example, 
'19970523' and '970523' are interpreted as '1997-05-23', but '971332' 
is illegal  (it has  nonsensical  month and  day parts)   and becomes 
'0000-00-00'.
As a number in either YYYYMMDDHHMMSS or YYMMDDHHMMSS format, provided 
that the number makes  sense as a  date. For example,  19830905132800 
and 830905132800 are interpreted as '1983-09-05 13:28:00'.
As a number in  either YYYYMMDD or  YYMMDD format, provided that  the 
number makes sense as  a date. For  example, 19830905 and 830905  are 
interpreted as '1983-09-05'.
As the result of a function  that returns a value that is  acceptable 
in  a  DATETIME,  DATE  or   TIMESTAMP context,   such as   NOW()  or 
CURRENT_DATE.
Illegal DATETIME,  DATE  or TIMESTAMP  values  are converted  to  the 
``zero''  value  of  the  appropriate  type  ('0000-00-00  00:00:00', 
'0000-00-00' or 00000000000000).
For values specified as strings that include date part delimiters, it 
is not necessary to specify two  digits for month or day values  that 
are less than 10. '1979-6-9' is the same as  '1979-06-09'. Similarly, 
for values specified as strings that include time part delimiters, it 
is not necessary  to specify  two digits  for hour,  month or  second 
values that  are less  than 10.  '1979-10-30 1:2:3'  is  the same  as 
'1979-10-30 01:02:03'.
Values specified as numbers should be 6, 8, 12 or 14 digits  long. If 
the number is 8 or 14 digits long, it is assumed to be in YYYYMMDD or 
YYYYMMDDHHMMSS format  and that  the year  is given  by  the first  4 
digits. If the number is 6 or 12 digits long, it is assumed to  be in 
YYMMDD or YYMMDDHHMMSS format and that the year is given by the first 
2 digits. Numbers that are not  one of these lengths are  interpreted 
as though padded with leading zeros to the closest length.
Values specified as non-delimited strings are interpreted using their 
length as given. If the string is  8 or 14 characters long, the  year 
is assumed to be given by the first 4 characters. Otherwise  the year 
is assumed  to be  given by  the first  2 characters.  The string  is 
interpreted from left to right to find year, month, day, hour, minute 
and second values, for  as many parts as  are present in the  string. 
This means   you should  not  use strings   that have  fewer  than  6 
characters. For example,  if you specify  '9903', thinking that  will 
represent March, 1999, you  will find that  MySQL inserts a  ``zero'' 
date into your table. This is  because the year and month values  are 
99 and 03, but the day part is missing (zero), so the value is  not a 
legal date.
TIMESTAMP columns store  legal values using  the full precision  with 
which the value was specified,  regardless of the display size.  This 
has several implications:
Always specify year, month,  and day, even  if your column types  are 
TIMESTAMP(4) or  TIMESTAMP(2). Otherwise,  the value  will not   be a 
legal date and 0 will be stored.
If  you  use  ALTER  TABLE   to widen   a narrow   TIMESTAMP  column, 
information will be displayed that previously was ``hidden''.
Similarly, narrowing a TIMESTAMP column does not cause information to 
be lost, except in the sense that less information is shown  when the 
values are displayed.
Although TIMESTAMP  values are  stored to  full precision,   the only 
function that operates  directly on  the underlying  stored value  is 
UNIX_TIMESTAMP(). Other functions operate on the formatted  retrieved 
value. This means you cannot use functions such as HOUR() or SECOND() 
unless the relevant part  of the TIMESTAMP  value is included in  the 
formatted value. For example,  the HH part  of a TIMESTAMP column  is 
not displayed unless the  display size is at  least 10, so trying  to 
use HOUR() on shorter TIMESTAMP values produces a meaningless result.
You can to some extent assign values of one date type to an object of 
a different date type. However, there  may be some alteration of  the 
value or loss of information:
If you assign  a DATE value  to a DATETIME  or TIMESTAMP object,  the 
time part of the  resulting value is  set to '00:00:00', because  the 
DATE value contains no time information.
If you assign  a DATETIME or  TIMESTAMP value to  a DATE object,  the 
time part of the  resulting value is  deleted, because the DATE  type 
stores no time information.
Remember that although DATETIME, DATE and TIMESTAMP values all can be 
specified using the same  set of formats, the  types do not all  have 
the same range  of values.  For example, TIMESTAMP  values cannot  be 
earlier than 1970 or later than 2037. This means that a date  such as 
'1968-01-01', while legal as a DATETIME or DATE value, is not a valid 
TIMESTAMP value and  will be converted  to 0 if  assigned to such  an 
object.
Be aware of certain pitfalls when specifying date values:
The relaxed format  allowed for  values specified as  strings can  be 
deceiving. For example, a value such as '10:11:12' might look  like a 
time value  because of  the `:'   delimiter, but if  used in   a date 
context will  be  interpreted as  the  year '2010-11-12'.  The  value 
'10:45:15' will be converted  to '0000-00-00' because  '45' is not  a 
legal month.
Year values specified as two digits are ambiguous, since  the century 
is unknown. MySQL interprets 2-digit year values using  the following 
rules:
Year values in the range 00-69 are converted to 2000-2069.
Year values in the range 70-99 are converted to 1970-1999.
7.2.6.3 The TIME type
MySQL retrieves and  displays TIME  values in  'HH:MM:SS' format  (or 
'HHH:MM:SS' format for  large hours  values). TIME  values may  range 
from '-838:59:59' to '838:59:59'. The reason the hours part may be so 
large is that the TIME type may be used not only to represent  a time 
of day (which must be less than 24 hours), but also elapsed time or a 
time interval between two events (which  may be much greater than  24 
hours, or even negative).
You can specify TIME values in a variety of formats:
As  a   string  in  'HH:MM:SS'   format.  A  ``relaxed''   syntax  is 
allowed--any non-numeric   character may  be used   as the  delimiter 
between time   parts. For   example, '10:11:12'  and  '10.11.12'  are 
equivalent.
As a string with no delimiters  in 'HHMMSS' format, provided that  it 
makes sense   as a  time.  For example,   '101112' is  understood  as 
'10:11:12', but  '109712' is  illegal (it  has a   nonsensical minute 
part) and becomes '00:00:00'.
As a number in HHMMSS format, provided that it makes sense as a time. 
For example, 101112 is understood as '10:11:12'.
As the result of a function  that returns a value that is  acceptable 
in a TIME context, such as CURRENT_TIME.
For TIME   values specified  as  strings that   include a  time  part 
delimiter, it  is not  necessary  to specify  two digits   for hours, 
minutes or seconds values that are less than 10. '8:3:2' is  the same 
as '08:03:02'.
Be careful about assigning  ``short'' TIME values  to a TIME  column. 
MySQL interprets   values using  the assumption   that the  rightmost 
digits represent seconds.  (MySQL interprets TIME  values as  elapsed 
time, rather than as  time of day.) For  example, you might think  of 
'11:12', '1112' and 1112 as  meaning '11:12:00' (12 minutes after  11 
o'clock), but MySQL  interprets them  as '00:11:12'  (11 minutes,  12 
seconds). Similarly, '12' and 12 are interpreted as '00:00:12'.
Values that lie outside  the TIME range  but are otherwise legal  are 
clipped to   the appropriate  endpoint of   the range.  For  example, 
'-850:00:00'  and  '850:00:00'  are  converted  to  '-838:59:59'  and 
'838:59:59'.
Illegal TIME  values are  converted to  '00:00:00'. Note   that since 
'00:00:00' is itself  a legal TIME  value, there is  no way to  tell, 
from a value of  '00:00:00' stored in  a table, whether the  original 
value was specified as '00:00:00' or whether it was illegal.
7.2.6.4 The YEAR type
The YEAR type is a 1-byte type used for representing years.
MySQL retrieves and displays YEAR values in YYYY format. The range is 
1901 to 2155.
You can specify YEAR values in a variety of formats:
As a four-digit string in the range '1901' to '2155'.
As a four-digit number in the range 1901 to 2155.
As a two-digit string in the range '00' to '99'. Values in the ranges 
'00' to '69' and  '70' to '99'  are converted to  YEAR values in  the 
ranges 2000 to 2069 and 1970 to 1999.
As a two-digit number in the range 1 to 99. Values in the ranges 1 to 
69 and 70 to 99  are converted to YEAR  values in the ranges 2001  to 
2069 and 1970 to 1999. Note  that the range for two-digit numbers  is 
slightly different than  the range for  two-digit strings, since  you 
cannot specify zero directly as a  number and have it be  interpreted 
as 2000. You must specify  it as a string '0'  or '00' or it will  be 
interpreted as 0000.
As the result of a function  that returns a value that is  acceptable 
in a YEAR context, such as NOW().
Illegal YEAR values are converted to 0000.
7.2.7 String types
The string types are CHAR, VARCHAR, BLOB, TEXT, ENUM and SET.
7.2.7.1 The CHAR and VARCHAR types
The CHAR and VARCHAR  types are similar, but  differ in the way  they 
are stored and retrieved.
The length of a CHAR column is  fixed to the length that you  declare 
when you create the table. The length can be any value between  1 and 
255. When CHAR values are  stored, they are right-padded with  spaces 
to the specified  length. When  CHAR values  are retrieved,  trailing 
spaces are removed.
Values in   VARCHAR columns   are variable-length  strings.  You  can 
declare a VARCHAR column to be any length between 1 and 255,  just as 
for CHAR columns. However,  in contrast to  CHAR, VARCHAR values  are 
stored using only as many characters as are needed, plus one  byte to 
record the length.  Values are not  padded; instead, trailing  spaces 
are removed when values are stored. (This space removal  differs from 
the ANSI SQL specification.)
If you assign a value  to a CHAR or  VARCHAR column that exceeds  the 
column's maximum length, the value is truncated to fit.
The table below illustrates the differences between the two  types of 
columns by showing the result  of storing various string values  into 
CHAR(4) and VARCHAR(4) columns:
+------------+---------+----------+------------+-----------------+
| Value      | CHAR(4) | Storage  | VARCHAR(4) | Storage require | 
|            |         | required |            | required        |
+------------+---------+----------+------------+-----------------+
| ''         | ' '     | 4 bytes  | ''         | 1 byte          | 
+------------+---------+----------+------------+-----------------+
| 'ab'       | 'ab '   | 4 bytes  | 'ab'       | 3 bytes         | 
+------------+---------+----------+------------+-----------------+
| 'abcd'     | 'abcd'  | 4 bytes  | 'abcd'     | 5 bytes         | 
+------------+---------+----------+------------+-----------------+
| 'abcdefgh' | 'abcd'  | 4 bytes  | 'abcd'     | 5 bytes         | 
+------------+---------+----------+------------+-----------------+
The values retrieved from the CHAR(4) and VARCHAR(4) columns  will be 
the same in each case, because trailing spaces are removed  from CHAR 
columns upon retrieval.
Values in   CHAR and  VARCHAR  columns are   sorted and  compared  in 
case-insensitive fashion, unless the  BINARY attribute was  specified 
when the table was  created. The BINARY  attribute means that  column 
values are sorted and compared in case-sensitive fashion according to 
the ASCII order of the machine where the MySQL server is running.
The BINARY  attribute is  ``sticky''.  This means  that if   a column 
marked BINARY  is used  in  an expression,  the whole   expression is 
compared as a BINARY value.
MySQL may silently change the type of a CHAR or VARCHAR column at 
table creation time. See section  7.6.1 Silent column specification 
changes.
7.2.7.2 The BLOB and TEXT types
A BLOB is a binary  large object that can  hold a variable amount  of 
data. The four  BLOB types  TINYBLOB, BLOB,  MEDIUMBLOB and  LONGBLOB 
differ only in the  maximum length of the  values they can hold.  See 
section  7.2.1 Column type storage requirements.
The  four   TEXT types   TINYTEXT,  TEXT,   MEDIUMTEXT and   LONGTEXT 
correspond to the four BLOB types  and have the same maximum  lengths 
and storage requirements. The only  difference between BLOB and  TEXT 
types is that sorting and  comparison is performed in  case-sensitive 
fashion for BLOB values and case-insensitive fashion for TEXT values. 
In other words, a TEXT is a case-insensitive BLOB.
If you assign  a value  to a  BLOB or  TEXT column  that exceeds  the 
column type's maximum length, the value is truncated to fit.
In most respects, you  can regard a TEXT  column as a VARCHAR  column 
that can be  as big as  you like.  Similarly, you can  regard a  BLOB 
column as a VARCHAR BINARY column. The differences are:
You can have  indexes on BLOB  and TEXT  columns with MySQL  versions 
3.23.2 and newer. Older versions of MySQL did not support this.
There is no  trailing-space removal  for BLOB and  TEXT columns  when 
values are stored, as there is for VARCHAR columns.
BLOB and TEXT columns cannot have DEFAULT values.
MyODBC defines   BLOB values  as LONGVARBINARY   and TEXT  values  as 
LONGVARCHAR.
Because BLOB and TEXT  values may be extremely  long, you may run  up 
against some constraints when using them:
If you want to use GROUP BY or ORDER BY on a BLOB or TEXT column, you 
must convert   the column   value into  a  fixed-length  object.  The 
standard way to do this is with the SUBSTRING function. For example:
mysql> select comment  from tbl_name,substring(comment,20) as  substr 
        ORDER BY substr;
If you don't  do this, only  the first  max_sort_length bytes of  the 
column are used when sorting. The default value of max_sort_length is 
1024; this value can be changed using the -O option when starting the 
mysqld server. You can group on an expression involving BLOB  or TEXT 
values by specifying the column position or by using an alias:
mysql> select id,substring(blob_col,1,100) from tbl_name
           GROUP BY 2;
mysql> select id,substring(blob_col,1,100) as b from tbl_name
           GROUP BY b;
The maximum size of a BLOB or TEXT object is determined by  its type, 
but the largest value  you can actually  transmit between the  client 
and server is determined  by the amount  of available memory and  the 
size of the communications buffers. You can change the message buffer 
size, but you  must do so  on both  the server and  client ends.  See 
section  10.1 Tuning server parameters.
Note that each  BLOB or  TEXT value  is represented  internally by  a 
separately-allocated object. This is in contrast to all  other column 
types, for which storage is allocated once per column when  the table 
is opened.
7.2.7.3 The ENUM type
An ENUM is a string object whose value normally is chosen from a list 
of allowed   values that  are enumerated   explicitly in  the  column 
specification at table creation time.
The value may  also be the  empty string ("")  or NULL under  certain 
circumstances:
If you insert an invalid  value into an ENUM  (that is, a string  not 
present in the list of allowed values), the empty string  is inserted 
instead as a special error value.
If an ENUM  is declared  NULL, NULL  is also  a legal  value for  the 
column, and the  default value is  NULL. If an  ENUM is declared  NOT 
NULL, the default value is the  first element of the list of  allowed 
values.
Each enumeration value has an index:
Values  from   the  list   of  allowable   elements  in   the  column 
specification are numbered beginning with 1.
The index value of the empty string error value is 0. This means that 
you can use the  following SELECT statement  to find rows into  which 
invalid ENUM values were assigned:
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
The index of the NULL value is NULL.
For example, a  column specified as  ENUM("one", "two", "three")  can 
have any of the values shown below.  The index of each value is  also 
shown:
+-----------+---------+
|  Value    |  Index  |  
+-----------+---------+
|  NULL     |   NULL  |  
+-----------+---------+
|  ""       |   0     |  
+-----------+---------+
|  "one"    |   1     |  
+-----------+---------+
|  "two"    |   2     |  
+-----------+---------+
|  "three"  |   3     |  
+-----------+---------+
An enumeration can have a maximum of 65535 elements.
Lettercase is irrelevant when  you assign values  to an ENUM  column. 
However, values   retrieved from  the column   later have  lettercase 
matching the values that were used to specify the allowable values at 
table creation time.
If you retrieve  an ENUM  in a  numeric context,  the column  value's 
index is returned. If you store a number into an ENUM, the  number is 
treated as an  index, and  the the  value stored  is the  enumeration 
member with that index.
ENUM  values  are  sorted  according   to the   order in   which  the 
enumeration members  were listed   in the column  specification.  (In 
other  words,  ENUM  values  are  sorted  according  to  their  index 
numbers.) For example, "a" sorts  before "b" for ENUM("a", "b"),  but 
"b" sorts  before "a"  for  ENUM("b", "a").  The empty   string sorts 
before non-empty  strings,  and NULL  values  sort before  all  other 
enumeration values.
If you want to get all possible values for an ENUM column, you should 
use: SHOW COLUMNS FROM table_name LIKE enum_column_name and parse the 
ENUM definition in the second column.
7.2.7.4 The SET type
A SET is a string object that  can have zero or more values, each  of 
which must be chosen from a list of allowed values specified when the 
table is  created. SET  column values  that consist  of multiple  set 
members are  specified  with members  separated  by commas  (`,').  A 
consequence of  this  is that  SET  member values  cannot  themselves 
contain commas.
For example, a  column specified  as SET("one", "two")  NOT NULL  can 
have any of these values:
""
"one"
"two"
"one,two"
A SET can have a maximum of 64 different members.
MySQL stores SET values  numerically, with the  low-order bit of  the 
stored value corresponding to the first set member. If you retrieve a 
SET value in  a numeric  context, the  value retrieved  has bits  set 
corresponding to the set members that make up the column value.  If a 
number is stored  into a SET  column, the  bits that are  set in  the 
binary representation of the number determine the set members  in the 
column value. Suppose a column is specified  as SET("a","b","c","d"). 
Then the members have the following bit values:
+--------------+------------------+----------------+
|  SETmember   |  Decimal value   |  Binary value  |  
+--------------+------------------+----------------+
|  a           |  1               |  0001          |  
+--------------+------------------+----------------+
|  b           |  2               |  0010          |  
+--------------+------------------+----------------+
|  c           |  4               |  0100          |  
+--------------+------------------+----------------+
|  d           |  8               |  1000          |  
+--------------+------------------+----------------+
If you assign a value of 9 to this column, that is 1001 in binary, so 
the first and fourth SET value  members "a" and "d" are selected  and 
the resulting value is "a,d".
For a value containing more than one SET element, it does  not matter 
what order the elements are listed  in when you insert the value.  It 
also doesn't not matter how many  times a given element is listed  in 
the value. When  the value is  retrieved later,  each element in  the 
value will appear once, with  elements listed according to the  order 
in which they were specified at table creation time. For  example, if 
a column is specified as SET("a","b","c","d"), then "a,d",  "d,a" and 
"d,a,a,d,d" will all appear as "a,d" when retrieved.
SET  values   are  sorted   numerically. NULL   values   sort  before 
non-NULLSET values.
Normally, you  perform  a SELECT   on a  SET column   using the  LIKE 
operator or the FIND_IN_SET() function:
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>
But the following will also work:
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
The first of these  statements looks for  an exact match. The  second 
looks for values containing the first set member.
If you want to get all possible values for an SET column,  you should 
use: SHOW COLUMNS FROM table_name LIKE set_column_name and  parse the 
SET definition in the second column.
7.2.8 Choosing the right type for a column
For the most efficient  use of storage, try  to use the most  precise 
type in all cases. For example, if an integer column will be used for 
values in the range  between 1 and  99999, MEDIUMINT UNSIGNED is  the 
best type.
Accurate representation of  monetary values is  a common problem.  In 
MySQL, you should use the DECIMAL  type. This is stored as a  string, 
so no   loss of   accuracy should   occur. If  accuracy  is  not  too 
important, the DOUBLE type may also be good enough.
For high  precision, you  can always  convert to  a fixed-point  type 
stored in  a BIGINT.  This allows  you to  do  all calculations  with 
integers and convert results back to floating-point values  only when 
necessary.
See section  10.17 What are the different row formats? Or, when 
should VARACHAR/.
7.2.9 Column indexes
All MySQL column types can be indexed except BLOB and TEXT types. Use 
of indexes on  the relevant columns  is the best  way to improve  the 
performance of SELECT operations.
A table may have up  to 16 indexes. The  maximum index length is  256 
bytes, although this may be changed when compiling MySQL.
You cannot index a  column that may  contain NULL values, so  indexed 
columns must be declared NOT NULL.
For CHAR and  VARCHAR columns, you  can index a  prefix of a  column. 
This is much faster  and requires less  disk space than indexing  the 
whole column. The  syntax to  use in  the CREATE  TABLE statement  to 
index a column prefix looks like this:
KEY index_name (col_name(length))
The example below creates an index for the first 10 characters of the 
name column:
mysql> CREATE TABLE test (
           name CHAR(200) NOT NULL,
           KEY index_name (name(10)));
7.2.10 Multiple-column indexes
MySQL can create indexes on multiple columns. An index may consist of 
up to 15 columns.  (On CHAR and  VARCHAR columns you  can also use  a 
prefix of the column as a part of an index).
A multiple-column index can be  considered a sorted array  containing 
values that are created  by concatenating the  values of the  indexed 
columns.
MySQL uses multiple-column  indexes in  such a way  that queries  are 
fast when you specify  a known quantity for  the first column of  the 
index in a  WHERE clause, even  if you don't  specify values for  the 
other columns.
Suppose a table is created using the following specification:
mysql> CREATE TABLE test (
                id INT NOT NULL,
                last_name CHAR(30) NOT NULL,
                first_name CHAR(30) NOT NULL,
                PRIMARY KEY (id),
                INDEX name (last_name,first_name));
Then the index name  is an index  over last_name and first_name.  The 
index will be used for queries  that specify values in a known  range 
for last_name, or for both  last_name and first_name. Therefore,  the 
name index will be used in the following queries:
mysql> SELECT * FROM test WHERE last_name="Widenius";
mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name="Michael";
mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND         (first_name="Michael"        OR           
               first_name="Monty");
mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name >="M" AND first_name < "N";
However, the name index will NOT be used in the following queries:
mysql> SELECT * FROM test WHERE first_name="Michael";
mysql> SELECT * FROM test WHERE last_name="Widenius"
                          OR first_name="Michael";
For more information  on the manner  in which  MySQL uses indexes  to 
improve query performance, see section  10.4 How MySQL uses indexes.
7.2.11 Using column types from other database engines
To make it easier  to use code  written for SQL implementations  from 
other vendors, MySQL maps column types  as shown in the table  below. 
These mappings make it  easier to move  table definitions from  other 
database engines to MySQL:
+----------------------+------------------------+
|  Other vendor type   |  MySQL type            |  
+----------------------+------------------------+
|  BINARY(NUM)         |  CHAR(NUM) BINARY      |  
+----------------------+------------------------+
|  CHAR VARYING(NUM)   |  VARCHAR(NUM)          |  
+----------------------+------------------------+
|  FLOAT4              |  FLOAT                 |  
+----------------------+------------------------+
|  FLOAT8              |  DOUBLE                |  
+----------------------+------------------------+
|  INT1                |  TINYINT               |  
+----------------------+------------------------+
|  INT2                |  SMALLINT              |  
+----------------------+------------------------+
|  INT3                |  MEDIUMINT             |  
+----------------------+------------------------+
|  INT4                |  INT                   |  
+----------------------+------------------------+
|  INT8                |  BIGINT                |  
+----------------------+------------------------+
|  LONG VARBINARY      |  MEDIUMBLOB            |  
+----------------------+------------------------+
|  LONG VARCHAR        |  MEDIUMTEXT            |  
+----------------------+------------------------+
|  MIDDLEINT           |  MEDIUMINT             |  
+----------------------+------------------------+
|  VARBINARY(NUM)      |  VARCHAR(NUM) BINARY   |  
+----------------------+------------------------+
Column type mapping occurs  at table creation  time. If you create  a 
table with types  used by  other vendors  and then  issue a  DESCRIBE 
tbl_name statement,   MySQL reports  the table   structure using  the 
equivalent MySQL types.
7.3 Functions for use in SELECT and WHERE clauses
A select_expression   or where_definition   in a  SQL  statement  can 
consist of any expression using the functions described below.
An expression that contains NULL always produces a NULL  value unless 
otherwise indicated   in the   documentation for  the  operators  and 
functions involved in the expression.
Note: There must  be no whitespace  between a  function name and  the 
parenthesis following  it. This  helps the  MySQL parser  distinguish 
between function  calls  and references  to  tables or  columns  that 
happen to have the same name  as a function. Spaces around  arguments 
are permitted, though.
For the sake of brevity, examples  display the output from the  mysql 
program in abbreviated form. So this:
mysql> select MOD(29,9);
1 rows in set (0.00 sec)
+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+
Is displayed like this:
mysql> select MOD(29,9);
        -> 2
7.3.1 Grouping functions
( ... ) Parentheses. Use these to force the order of evaluation in an 
expression.
mysql> select 1+2*3;
        -> 7
mysql> select (1+2)*3;
        -> 9
7.3.2 Normal arithmetic operations
The usual arithmetic operators are  available. Note that in the  case 
of -,   + and  *,  the result   is calculated  with  BIGINT  (64-bit) 
precision if both arguments are integers!
+       Addition
mysql> select 3+5;
        -> 8
-       Subtraction
mysql> select 3-5;
        -> -2
*       Multiplication
mysql> select 3*5;
        -> 15
mysql> select 18014398509481984*18014398509481984.0;
        -> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
        -> 0
The result of the last expression is incorrect because the  result of 
the  integer  multiplication  exceeds  the  64-bit  range  of  BIGINT 
calculations.
/       Division
mysql> select 3/5;
        -> 0.60
Division by zero produces a NULL result:
mysql> select 102/(1-1);
        -> NULL
A  division  will  be  calculated  with  BIGINT  arithmetic  only  if 
performed in a context where its result is converted to an integer!
7.3.3 Bit functions
MySQL uses BIGINT  (64-bit) arithmetic for  bit operations, so  these 
operators have a maximum range of 64 bits.
|       Bitwise OR
mysql> select 29 | 15;
        -> 31
&       Bitwise AND
mysql> select 29 & 15;
        -> 13
<<      Shifts a longlong (BIGINT) number to the left.
mysql> select 1 << 2
        -> 4
>>      Shifts a longlong (BIGINT) number to the right.
mysql> select 4 >> 2
        -> 1
BIT_COUNT(N)
 Returns the number of bits that are set in the argument N.
mysql> select BIT_COUNT(29);
        -> 4
7.3.4 Logical operations
All logical functions return 1 (TRUE) or 0 (FALSE).
NOT
!       Logical NOT.   Returns 1  if the   argument is  0,  otherwise  
        returns 0. Exception: NOT NULL returns NULL.
mysql> select NOT 1;
        -> 0
mysql> select NOT NULL;
        -> NULL
mysql> select ! (1+1);
        -> 0
mysql> select ! 1+1;
        -> 1
The last example returns 1 because the expression evaluates  the same 
way as (!1)+1.
OR
||      Logical OR. Returns  1 if either  argument is  not 0 and  not 
        NULL
.
mysql> select 1 || 0;
        -> 1
mysql> select 0 || 0;
        -> 0
mysql> select 1 || NULL;
        -> 1
AND
&       Logical AND.  Returns 0  if  either argument  is 0   or NULL, 
        otherwise returns 1.
mysql> select 1 && NULL;
        -> 0
mysql> select 1 && 0;
        -> 0
7.3.5 Comparison operators
Comparison operations result  in a value  of 1  (TRUE), 0 (FALSE)  or 
NULL. These functions work for both numbers and strings.  Strings are 
automatically converted to numbers and  numbers to strings as  needed 
(as in Perl).
MySQL performs comparisons using the following rules:
If one or both arguments are NULL, the result of the  comparison is 
NULL.
If both arguments in a  comparison operation are strings, they  are 
compared as strings.
If both arguments are integers, they are compared as integers.
Hexadecimal values are treated as binary strings if not compared to 
a number.
If one of the arguments is  a TIMESTAMP or DATETIME column and  the 
other argument   is a   constant, the  constant  is  converted  to  a 
timestamp before the comparison is performed. This is done to be more 
ODBC-friendly.
In all other  cases, the arguments  are compared as  floating-point 
(real) numbers.
By default, string comparisons  are done in case-independent  fashion 
using the current character set (ISO-8859-1 Latin1 by  default, which 
also works excellently for English).
The examples below  illustrate conversion of  strings to numbers  for 
comparison operations:
mysql> SELECT 1 > '6x';
         -> 0
mysql> SELECT 7 > '6x';
         -> 1
mysql> SELECT 0 > 'x6';
         -> 0
mysql> SELECT 0 = 'x6';
         -> 1
=       Equal
mysql> select 1 = 0;
        -> 0
mysql> select '0' = 0;
        -> 1
mysql> select '0.0' = 0;
        -> 1
mysql> select '0.01' = 0;
        -> 0
mysql> select '.01' = 0.01;
        -> 1
<>
!=      Not equal
mysql> select '.01' <> '0.01';
        -> 1
mysql> select .01 <> '0.01';
        -> 0
mysql> select 'zapp' <> 'zappp';
        -> 1
<=      Less than or equal
mysql> select 0.1 <= 2;
        -> 1
<       Less than
mysql> select 2 <= 2;
        -> 1
>=      Greater than or equal
mysql> select 2 >= 2;
        -> 1
>       Greater than
mysql> select 2 > 2;
        -> 0
<=>     Null safe equal
mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1 1 0
expr BETWEEN min AND max
 If expr is greater  than or equal  to min and expr  is less than  or 
equal to max,  BETWEEN returns  1, otherwise  it returns  0. This  is 
equivalent to the expression (min <= expr AND expr <= max) if all the 
arguments are of the same type. The first argument  (expr) determines 
how the comparison is  performed. If expr  is a string expression,  a 
case-insensitive string  comparison  is done.  If  expr is  a  binary 
string, a case-sensitive  string comparison  is done. If  expr is  an 
integer expression,   an integer  comparison is   done. Otherwise,  a 
floating-point (real) comparison is done.
mysql> select 1 BETWEEN 2 AND 3;
        -> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
        -> 1
mysql> select 2 BETWEEN 2 AND '3';
        -> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
        -> 0
expr IN (value,...)
 Returns 1 if expr is any of the values in the IN list,  else returns 
0. If   all values  are  constants, then   all values  are  evaluated 
according to the type of expr and sorted. The search for the  item is 
then done using a binary search. This  means IN is very quick if  the 
IN  value  list  consists  entirely   of constants.   If expr   is  a 
case-sensitive string expression, the string comparison is  performed 
in case-sensitive fashion.
mysql> select 2 IN (0,3,5,'wefwf');
        -> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
        -> 1
expr NOT IN (value,...)
 Same as NOT (expr IN (value,...)).
ISNULL(expr)
 If expr is NULL, ISNULL() returns 1, otherwise it returns 0.
mysql> select ISNULL(1+1);
        -> 0
mysql> select ISNULL(1/0);
        -> 1
Note that a comparison of NULL values using = will always be false!
COALESCE(list)
 Returns first non-NULL element in list.
mysql> select COALESCE(NULL,1);
        -> 1
mysql> select COALESCE(NULL,NULL,NULL);
        -> NULL
INTERVAL(N,N1,N2,N3,...)
 Returns 0 if  N <  N1, 1  if N  < N2 and  so on.  All arguments  are 
treated as numbers. It is required that N1  < N2 < N3 < ... < Nn  for 
this function to work correctly. This  is because a binary search  is 
used (very fast).
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
        -> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
        -> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
        -> 0
7.3.6 String comparison functions
 Normally,  if  any  expression   in a   string comparison   is  case 
sensitive, the comparison is performed in case-sensitive fashion.
expr LIKE pat [ESCAPE 'escape-char']
 Pattern matching  using SQL  simple regular   expression comparison. 
Returns 1 (TRUE) or  0 (FALSE). With LIKE  you can use the  following 
two wildcard characters:
+------+----------------------------------------------------------+
|  %   |  Matches any number of characters, even zero characters  |  
+------+----------------------------------------------------------+
|  _   |  Matches exactly one character                           |  
+------+----------------------------------------------------------+
mysql> select 'David!' LIKE 'David_';
        -> 1
mysql> select 'David!' LIKE '%D%v%';
        -> 1
To test for literal  instances of a  wildcard character, precede  the 
character with the escape character. If you don't specify  the ESCAPE 
character, `\' is assumed:
+------+---------------------------+
|  \%  |  Matches one % character  |  
+------+---------------------------+
|  \_  |  Matches one _ character  |  
+------+---------------------------+
mysql> select 'David!' LIKE 'David\_';
        -> 0
mysql> select 'David_' LIKE 'David\_';
        -> 1
To specify a different escape character, use the ESCAPE clause:
mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
        -> 1
LIKE is allowed on numeric expressions! (This is a MySQL extension to 
the ANSI SQL LIKE.)
mysql> select 10 LIKE '1%';
        -> 1
Note: Because MySQL uses the C escape syntax in strings (e.g., `\n'), 
you must  double any  `\' that   you use in  your LIKE   strings. For 
example, to search for `\n', specify it as `\\n'. To search  for `\', 
specify it  as  `\\\\' (the   backslashes are stripped   once by  the 
parser, and another time  when the pattern  match is done, leaving  a 
single backslash to be matched).
expr NOT LIKE pat [ESCAPE 'escape-char']
 Same as NOT (expr LIKE pat [ESCAPE 'escape-char']).
expr REGEXP pat
expr RLIKE pat
 Performs a pattern match of a string expression expr against a 
pattern pat. The pattern can be an extended regular expression. See 
section  H Desciption of MySQL regular expretion syntax. Returns 1 if 
expr matches pat, otherwise returns 0. RLIKE is a synonym for REGEXP, 
provided for mSQL compatibility. Note: Because MySQL uses the C 
escape syntax in strings (e.g., `\n'), you must double any `\' that 
you use in your REGEXP strings.
mysql> select 'Monty!' REGEXP 'm%y%%';
        -> 0
mysql> select 'Monty!' REGEXP '.*';
        -> 1
mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line';
        -> 1
REGEXP and RLIKE use the current character set (ISO-8859-1  Latin1 by 
default) when deciding the type of a character.
expr NOT REGEXP pat
expr NOT RLIKE pat
 Same as NOT (expr REGEXP pat).
STRCMP(expr1,expr2)
STRCMP() returns  0 if  the strings  are the  same, -1  if the  first 
argument is smaller  than the  second according to  the current  sort 
order, and 1 otherwise.
mysql> select STRCMP('text', 'text2');
        -> -1
mysql> select STRCMP('text2', 'text');
        -> 1
mysql> select STRCMP('text', 'text');
        -> 0
7.3.7 Cast operators
BINARY
 The BINARY  operator  casts the   string following it   to a  binary 
string. This is an easy way to  force a column comparison to be  case 
independent even if the column isn't defined as BINARY or BLOB.
mysql> select "a" = "A";
        -> 1
mysql> select BINARY "a" = "A";
        -> 0
BINARY was introduced in MySQL 3.23.0
7.3.8 Control flow functions
IFNULL(expr1,expr2)
 If expr1 is not NULL, IFNULL() returns expr1, else it returns expr2. 
IFNULL() returns a numeric or string value, depending on  the context 
in which it is used.
mysql> select IFNULL(1,0);
        -> 1
mysql> select IFNULL(0,10);
        -> 0
mysql> select IFNULL(1/0,10);
        -> 10
mysql> select IFNULL(1/0,'yes');
        -> 'yes'
IF(expr1,expr2,expr3)
 If expr1 is TRUE (expr1  <> 0 and expr1  <> NULL) then IF()  returns 
expr2, else it returns  expr3. IFNULL() returns  a numeric or  string 
value, depending on the context in which it is used.
mysql> select IF(1>2,2,3);
        -> 3
mysql> select IF(1<2,'yes','no');
        -> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
        -> 'no'
expr1 is evaluated as an integer  value, which means that if you  are 
testing floating-point or  string values,  you should do  so using  a 
comparison operation.
mysql> select IF(0.1,1,0);
        -> 0
mysql> select IF(0.1<>0,1,0);
        -> 1
In the first case above, IF(0.1)  returns 0 because 0.1 is  converted 
to an integer value, resulting  in a test of  IF(0). This may not  be 
what you   expect. In  the  second case,   the comparison  tests  the 
original floating-point  value to  see whether  it is   non-zero. The 
result of the comparison is used as an integer.
CASE value  WHEN [compare-value]  THEN result   [WHEN [compare-value] 
THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN  result ...] 
[ELSE result] END
 The first version returns the result where  value=compare-value. The 
second version returns the  result for the  first condition which  is 
true. If there was  no matching result  value, then the result  after 
ELSE is returned. If there is no ELSE part then NULL is returned.
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two"  ELSE "more" 
END;
       -> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
       -> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
       -> NULL
7.3.9 Mathematical functions
All mathematical functions return NULL in case of an error.
-       Unary minus. Changes the sign of the argument.
mysql> select - 2;
        -> -2
Note that if this operator is used with a BIGINT, the return value is 
a BIGINT! This means that you  should avoid using - on integers  that 
may have the value of -2^63!
ABS(X)  Returns the absolute value of X.
mysql> select ABS(2);
        -> 2
mysql> select ABS(-32);
        -> 32
This function is safe to use with BIGINT values.
SIGN(X) Returns the sign of the argument as -1, 0 or 1,  depending on 
        whether X is negative, zero, or positive.
mysql> select SIGN(-32);
        -> -1
mysql> select SIGN(0);
        -> 0
mysql> select SIGN(234);
        -> 1
MOD(N,M)
%       Modulo (like the % operator in C). Returns the remainder of N 
        divided by M.
mysql> select MOD(234, 10);
        -> 4
mysql> select 253 % 7;
        -> 1
mysql> select MOD(29,9);
        -> 2
This function is safe to use with BIGINT values.
FLOOR(X)        Returns the largest integer value not greater than X.
mysql> select FLOOR(1.23);
        -> 1
mysql> select FLOOR(-1.23);
        -> -2
Note that the return value is converted to a BIGINT!
CEILING(X)      Returns the smallest integer value not less than X.
mysql> select CEILING(1.23);
        -> 2
mysql> select CEILING(-1.23);
        -> -1
Note that the return value is converted to a BIGINT!
ROUND(X)        Returns the argument X, rounded to an integer.
mysql> select ROUND(-1.23);
        -> -1
mysql> select ROUND(-1.58);
        -> -2
mysql> select ROUND(1.58);
        -> 2
Note that the return value is converted to a BIGINT!
ROUND(X,D)      Returns the argument  X, rounded to  a number with  D 
                decimals. If D is 0, the result will have  no decimal 
                point or fractional part.
mysql> select ROUND(1.298, 1);
        -> 1.3
mysql> select ROUND(1.298, 0);
        -> 1
Note that the return value is converted to a BIGINT!
EXP(X)  Returns the  value  of e  (the  base of  natural  logarithms) 
        raised to the power of X.
mysql> select EXP(2);
        -> 7.389056
mysql> select EXP(-2);
        -> 0.135335
LOG(X)          Returns the natural logarithm of X.
mysql> select LOG(2);
        -> 0.693147
mysql> select LOG(-2);
        -> NULL
If you want the log  of a number X to  some arbitary base B, use  the 
formula LOG(X)/LOG(B).
LOG10(X)        Returns the base-10 logarithm of X.
mysql> select LOG10(2);
        -> 0.301030
mysql> select LOG10(100);
        -> 2.000000
mysql> select LOG10(-100);
        -> NULL
POW(X,Y)
POWER(X,Y)      Returns the value of X raised to the power of Y.
mysql> select POW(2,2);
        -> 4.000000
mysql> select POW(2,-2);
        -> 0.250000
SQRT(X)         Returns the non-negative square root of X.
mysql> select SQRT(4);
        -> 2.000000
mysql> select SQRT(20);
        -> 4.472136
PI()    Returns the value of PI.
mysql> select PI();
        -> 3.141593
COS(X)          Returns the cosine of X, where X is given in radians.
mysql> select COS(PI());
        -> -1.000000
SIN(X)          Returns the sine of X, where X is given in radians.
mysql> select SIN(PI());
        -> 0.000000
TAN(X)          Returns the   tangent of   X, where  X  is  given  in   
                 radians.
mysql> select TAN(PI()+1);
        -> 1.557408
ACOS(X)         Returns the arc cosine of X, that is, the value whose 
                cosine is X. Returns NULL if X is not in the range -1 
                to 1.
mysql> select ACOS(1);
        -> 0.000000
mysql> select ACOS(1.0001);
        -> NULL
mysql> select ACOS(0);
        -> 1.570796
ASIN(X)         Returns the arc sine of  X, that is, the value  whose 
                sine is X. Returns NULL if  X is not in the range  -1 
                to 1.
mysql> select ASIN(0.2);
        -> 0.201358
mysql> select ASIN('foo');
        -> 0.000000
ATAN(X)         Returns the  arc tangent  of X,  that is,   the value 
                whose tangent is X.
mysql> select ATAN(2);
        -> 1.107149
mysql> select ATAN(-2);
        -> -1.107149
ATAN2(X,Y)      Returns the arc tangent of the two variables X and Y. 
                It is similar to calculating  the arc tangent of Y  / 
                X, except that the signs  of both arguments are  used 
                to determine the quadrant of the result.
mysql> select ATAN(-2,2);
        -> -0.785398
mysql> select ATAN(PI(),0);
        -> 1.570796
COT(X)          Returns the cotangent of X.
mysql> select COT(12);
        -> -1.57267341
mysql> select COT(0);
        -> NULL
RAND()
RAND(N)         Returns a random floating-point value in the  range 0 
                to 1.0. If an integer argument N is specified,  it is 
                used as the seed value.
mysql> select RAND();
        -> 0.5925
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND();
        -> 0.2079
mysql> select RAND();
        -> 0.7888
You can't use  a column  with RAND() values  in an  ORDER BY  clause, 
because ORDER BY would evaluate  the column multiple times. In  MySQL 
3.23, you can however  do: SELECT *  FROM table_name ORDER BY  RAND() 
This is  useful  to get   a random sample   of a  set SELECT  *  FROM 
table1,table2 WHERE a=b AND c select LEAST(2,0);
        -> 0
mysql> select LEAST(34.0,3.0,5.0,767.0);
        -> 3.0
mysql> select LEAST("B","A","C");
        -> "A"
In MySQL  versions prior  to 3.22.5,  you can  use  MIN() instead  of 
LEAST.
GREATEST(X,Y,...)
 Returns the  largest (maximum-valued)  argument. The   arguments are 
compared using the same rules as for LEAST.
mysql> select GREATEST(2,0);
        -> 2
mysql> select GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0
mysql> select GREATEST("B","A","C");
        -> "C"
In MySQL  versions prior  to 3.22.5,  you can  use  MAX() instead  of 
GREATEST.
DEGREES(X)
        Returns the argument X, converted from radians to degrees.
mysql> select DEGREES(PI());
        -> 180.000000
RADIANS(X)
        Returns the argument X, converted from degrees to radians.
mysql> select RADIANS(90);
        -> 1.570796
TRUNCATE(X,D)
        Returns the number X, truncated to D decimals.
mysql> select TRUNCATE(1.223,1);
        -> 1.2
mysql> select TRUNCATE(1.999,1);
        -> 1.9
mysql> select TRUNCATE(1.999,0);
        -> 1
7.3.10 String functions
String-valued functions return NULL if the length of the result would 
be greater than the max_allowed_packet server parameter. See section
10,1 Tuning server parame.
For functions that operate on string positions, the first position is 
numbered 1.
ASCII(str)
 Returns the  ASCII  code value   of the leftmost   character of  the  
string str. Returns 0 if str is the empty string. Returns NULL if str 
is NULL.
mysql> select ASCII('2');
        -> 50
mysql> select ASCII(2);
        -> 50
mysql> select ASCII('dx');
        -> 100
CONV(N,from_base,to_base)
 Converts numbers between  different number bases.  Returns a  string 
representation of the number N, converted from base from_base to base 
to_base. Returns NULL  if any  argument is  NULL. The  argument N  is 
interpreted as an integer,  but may be specified  as an integer or  a 
string. The minimum base is 2 and the maximum base is 36.  If to_base 
is a negative number, N is regarded as a signed number.  Otherwise, N 
is treated as unsigned. CONV works with 64-bit precision.
mysql> select CONV("a",16,2);
        -> '1010'
mysql> select CONV("6E",18,8);
        -> '172'
mysql> select CONV(-17,10,-18);
        -> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
        -> '40'
BIN(N)
 Returns a string representation of the binary value of N, where N is 
a longlong   (BIGINT) number.  This is   equivalent to  CONV(N,10,2). 
Returns NULL if N is NULL.
mysql> select BIN(12);
        -> '1100'
OCT(N)
 Returns a string representation of the octal value of N, where  N is 
a longlong number. This is  equivalent to CONV(N,10,8). Returns  NULL 
if N is NULL.
mysql> select OCT(12);
        -> '14'
HEX(N)
 Returns a string representation of the hexadecimal value of N, where 
N is a longlong (BIGINT) number. This is equivalent to CONV(N,10,16). 
Returns NULL if N is NULL.
mysql> select HEX(255);
        -> 'FF'
CHAR(N,...)
CHAR() interprets  the arguments  as integers  and returns   a string 
consisting of the characters given by the ASCII code values  of those 
integers. NULL values are skipped.
mysql> select CHAR(77,121,83,81,'76');
        -> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
        -> 'MMM'
CONCAT(X,Y,...)
 Returns the string  that results from  concatenating the  arguments. 
Returns NULL if any argument is NULL. May have more than 2 arguments.
mysql> select CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
        -> NULL
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)           Returns the length of the string str.
mysql> select LENGTH('text');
        -> 4
mysql> select OCTET_LENGTH('text');
        -> 4
LOCATE(substr,str)
POSITION(substr IN str)
 Returns the position of the first occurrence of substring  substr in 
string str. Returns 0 if substr is not in str.
mysql> select LOCATE('bar', 'foobarbar');
        -> 4
mysql> select LOCATE('xbar', 'foobar');
        -> 0
LOCATE(substr,str,pos)
 Returns the position of the first occurrence of substring  substr in 
string str, starting at position pos.  Returns 0 if substr is not  in 
str.
mysql> select LOCATE('bar', 'foobarbar',5);
        -> 7
INSTR(str,substr)
 Returns the position of the first occurrence of substring  substr in 
string str. This is  the same as  the two-argument form of  LOCATE(), 
except that the arguments are swapped.
mysql> select INSTR('foobarbar', 'bar');
        -> 4
mysql> select INSTR('xbar', 'foobar');
        -> 0
LPAD(str,len,padstr)
 Returns the string str, left-padded with the string padstr until str 
is len characters long.
mysql> select LPAD('hi',4,'??');
        -> '??hi'
RPAD(str,len,padstr)
 Returns the string  str, right-padded with  the string padstr  until 
str is len characters long.
mysql> select RPAD('hi',5,'?');
        -> 'hi???'
LEFT(str,len)
        Returns the leftmost len characters from the string str.
mysql> select LEFT('foobarbar', 5);
        -> 'fooba'
RIGHT(str,len)
        Returns the rightmost len characters from the string str.
mysql> select RIGHT('foobarbar', 4);
        -> 'rbar'
mysql> select SUBSTRING('foobarbar' FROM 4);
        -> 'rbar'
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
 Returns a substring len characters long from string str, starting at 
position pos. The variant form that uses FROM is ANSI SQL92 syntax.
mysql> select SUBSTRING('Quadratically',5,6);
        -> 'ratica'
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
 Returns a substring from string str starting at position pos.
mysql> select SUBSTRING('Quadratically',5);
        -> 'ratically'
SUBSTRING_INDEX(str,delim,count)
 Returns the substring from string str after count occurrences of the 
delimiter delim. If count is positive, everything to the left  of the 
final delimiter (counting  from the  left) is returned.  If count  is 
negative, everything to  the right of  the final delimiter  (counting 
from the right) is returned.
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'
LTRIM(str)
        Returns the string str with leading space characters removed.
mysql> select LTRIM('  barbar');
        -> 'barbar'
RTRIM(str)
 Returns the string str with trailing space characters removed.
mysql> select RTRIM('barbar   ');
        -> 'barbar'
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
 Returns the  string str  with all  remstr prefixes   and/or suffixes 
removed. If  none of  the specifiers  BOTH, LEADING  or TRAILING  are 
given, BOTH  is  assumed. If   remstr is not   specified, spaces  are 
removed.
mysql> select TRIM('  bar   ');
        -> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'
SOUNDEX(str)
 Returns a soundex string  from str. Two  strings that sound  ``about 
the same''  should have   identical soundex strings.  A  ``standard'' 
soundex string  is  4 characters  long,  but the  SOUNDEX()  function 
returns an arbitrarily long  string. You can  use SUBSTRING() on  the 
result to  get a  ``standard'' soundex  string. All  non-alphanumeric 
characters are ignored in the  given string. All international  alpha 
characters outside the A-Z range are treated as vowels.
mysql> select SOUNDEX('Hello');
        -> 'H400'
mysql> select SOUNDEX('Quadratically');
        -> 'Q36324'
SPACE(N)
 Returns a string consisting of N space characters.
mysql> select SPACE(6);
        -> '      '
REPLACE(str,from_str,to_str)
 Returns the  string  str with   all all occurrences   of the  string 
from_str replaced by the string to_str.
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'
REPEAT(str,count)
 Returns a string consisting of the string str repeated  count times. 
If count <= 0, returns an empty string. Returns NULL if str  or count 
are NULL.
mysql> select REPEAT('MySQL', 3);
        -> 'MySQLMySQLMySQL'
REVERSE(str)
 Returns the string str with the order of the characters reversed.
mysql> select REVERSE('abc');
        -> 'cba'
INSERT(str,pos,len,newstr)
 Returns the string str, with the substring beginning at position pos 
and len characters long replaced by the string newstr.
mysql> select INSERT('Quadratic', 3, 4, 'What');
        -> 'QuWhattic'
ELT(N,str1,str2,str3,...)
 Returns str1 if N = 1, str2 if N  = 2, and so on. Returns NULL if  N 
is less than 1 or greater than the number of arguments. ELT()  is the 
complement of FIELD().
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'
FIELD(str,str1,str2,str3,...)
 Returns the index of str in the str1, str2, str3, ...  list. Returns 
0 if str is not found. FIELD() is the complement of ELT().
mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0
FIND_IN_SET(str,strlist)
 Returns a value  1 to N  if the string  str is  in the list  strlist 
consisting of N  substrings. A string  list is  a string composed  of 
substrings separated by `,'  characters. If the  first argument is  a 
constant string   and the   second is   a column  of  type  SET,  the 
FIND_IN_SET() function is optimized to use bit arithmetic!  Returns 0 
if str is not in strlist or  if strlist is the empty string.  Returns 
NULL if either argument is NULL. This function will not work properly 
if the first argument contains a `,'.
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2
MAKE_SET(bits,str1,str2,...)
 Returns a  set  (a string  containing  substrings separated  by  `,' 
characters) consisting of the strings that have the corresponding bit 
in bits set.  str1 corresponds to  bit 0,  str2 to bit  1, etc.  NULL 
strings in str1, str2, ... are not appended to the result.
mysql> SELECT MAKE_SET(1,'a','b','c');
        -> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
        -> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
        -> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
 Returns a string where for  every bit set in  'bit', you get a  'on' 
string and for every reset bit  you get an 'off' string. Each  string 
is separated with 'separator' (default ',') and only 'number_of_bits' 
(default 64) of 'bits' is used.
mysql> select EXPORT_SET(5,'Y','N',',',4)
        -> Y,N,Y,N 
LCASE(str)
LOWER(str)
 Returns the  string str  with all  characters changed   to lowercase 
according to   the current  character set   mapping (the  default  is 
ISO-8859-1 Latin1).
mysql> select LCASE('QUADRATICALLY');
        -> 'quadratically'
UCASE(str)
UPPER(str)
 Returns the  string str  with all  characters changed   to uppercase 
according to   the current  character set   mapping (the  default  is 
ISO-8859-1 Latin1).
mysql> select UCASE('Hej');
        -> 'HEJ'
LOAD_FILE(file_name)
 Reads the file and returns the  file contents as a string. The  file 
must be on  the server,  you must specify  the full  pathname to  the 
file, and you must have the file privilege. The file must be readable 
by all and be  smaller than max_allowed_packet.  If the file  doesn't 
exist or can't be read due to one of the above reasons,  the function 
returns NULL.
mysql> UPDATE   table_name SET  blob_column=LOAD_FILE("/tmp/picture") 
WHERE id=1;
There is no string function to convert  a number to a char. There  is 
no need  for one,  because MySQL  automatically converts   numbers to 
strings as necessary, and vice versa:
mysql> SELECT 1+"1";
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'
If a string function is given a binary string as an argument, the 
resulting string is also a binary string. A number converted to a 
string is treated as a binary string. This only affects comparisons.
7.3.11 Date and time functions
See section  7.2.6 Date and time types for a description of the range 
of values each type has, and the valid formats in which date and time 
values may be specified.
Here is an example that uses date functions. The query  below selects 
all records with a date_col value from within the last 30 days:
mysql> SELECT something FROM table
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
 Returns the weekday index for date (1 = Sunday, 2 = Monday, ...  7 = 
Saturday). These index values correspond to the ODBC standard.
mysql> select DAYOFWEEK('1998-02-03');
        -> 3
WEEKDAY(date)
 Returns the weekday index for date (0 = Monday, 1 = Tuesday, ... 6 = 
Sunday).
mysql> select WEEKDAY('1997-10-04 22:23:00');
        -> 5
mysql> select WEEKDAY('1997-11-05');
        -> 2
DAYOFMONTH(date)
 Returns the day of the month for date, in the range 1 to 31.
mysql> select DAYOFMONTH('1998-02-03');
        -> 3
DAYOFYEAR(date)
 Returns the day of the year for date, in the range 1 to 366.
mysql> select DAYOFYEAR('1998-02-03');
        -> 34
MONTH(date)
        Returns the month for date, in the range 1 to 12.
mysql> select MONTH('1998-02-03');
        -> 2
DAYNAME(date)
        Returns the name of the weekday for date.
mysql> select DAYNAME("1998-02-05");
        -> 'Thursday'
MONTHNAME(date) Returns the name of the month for date.
mysql> select MONTHNAME("1998-02-05");
        -> 'February'
QUARTER(date)
 Returns the quarter of the year for date, in the range 1 to 4.
mysql> select QUARTER('98-04-01');
        -> 2
WEEK(date)
WEEK(date,first)
 With a single argument, returns the week for date, in the range 0 to 
52, for locations  where Sunday  is the first  day of  the week.  The 
two-argument form of WEEK()  allows you to  specify whether the  week 
starts on Sunday or Monday. The  week starts on Sunday if the  second 
argument is 0, on Monday if the second argument is 1.
mysql> select WEEK('1998-02-20');
        -> 7
mysql> select WEEK('1998-02-20',0);
        -> 7
mysql> select WEEK('1998-02-20',1);
        -> 8
YEAR(date)
 Returns the year for date, in the range 1000 to 9999.
mysql> select YEAR('98-02-03');
        -> 1998
HOUR(time)
        Returns the hour for time, in the range 0 to 23.
mysql> select HOUR('10:05:03');
        -> 10
MINUTE(time)
        Returns the minute for time, in the range 0 to 59.
mysql> select MINUTE('98-02-03 10:05:03');
        -> 5
SECOND(time)
        Returns the second for time, in the range 0 to 59.
mysql> select SECOND('10:05:03');
        -> 3
PERIOD_ADD(P,N)
 Adds N months to period P (in the format YYMM or YYYYMM).  Returns a 
value in the format YYYYMM. Note that the period argument P is{{
}} 
not{{
}} 
a
 date value.
mysql> select PERIOD_ADD(9801,2);
        -> 199803
PERIOD_DIFF(P1,P2)
 Returns the number of  months between periods P1  and P2. P1 and  P2 
should be   in the  format  YYMM or   YYYYMM. Note  that  the  period 
arguments P1 and P2 are not date values.
mysql> select PERIOD_DIFF(9802,199703);
        -> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
 These functions  perform date  arithmetic. They  are new   for MySQL 
3.22.  ADDDATE()  and  SUBDATE()  are  synonyms  for  DATE_ADD()  and 
DATE_SUB(). date is a DATETIME or DATE value specifying  the starting 
date. expr is an expression specifying the interval value to be added 
or substracted from the starting date. expr is a string; it may start 
with a `-' for negative intervals.  type is a keyword indicating  how 
the expression should be interpreted. The EXTRACT()  function returns 
the corresponding interval from the  date. The following table  shows 
how the type and expr arguments are related:
+----------------+----------------------+--------------------------+
|  typevalue     |  Meaning             |  Expectedexprformat      |
+----------------+----------------------+--------------------------+
|  SECOND        |  Seconds             |  SECONDS                 |
+----------------+----------------------+--------------------------+
|  MINUTE        |  Minutes             |  MINUTES                 |
+----------------+----------------------+--------------------------+
|  HOUR          |  Hours               |  HOURS                   |
+----------------+----------------------+--------------------------+
|  DAY           |  Days                |  DAYS                    |
+----------------+----------------------+--------------------------+
|  MONTH         |  Months              |  MONTHS                  |
+----------------+----------------------+--------------------------+
|  YEAR          |  Years               |  YEARS                   |
+----------------+----------------------+--------------------------+
|  MINUTE_SECOND |  Minutes and seconds |  "MINUTES:SECONDS"       |
+----------------+----------------------+--------------------------+
|  HOUR_MINUTE   |  Hours and minutes   |  "HOURS:MINUTES"         |
+----------------+----------------------+--------------------------+
|  DAY_HOUR      |  Days and hours      |  "DAYS HOURS"            |
+----------------+----------------------+--------------------------+
|  YEAR_MONTH    |  Years and months    |  "YEARS-MONTHS"          |
+----------------+----------------------+--------------------------+
|  HOUR_SECOND   |  Hours, minutes,     |  "HOURS:MINUTES:SECONDS" |
+----------------+----------------------+--------------------------+
|  DAY_MINUTE    |  Days, hours, minutes|  "DAYS HOURS:MINUTES"    |
+----------------+----------------------+--------------------------+
|  DAY_SECOND    |  Days, hours, minutes|  "DAYS HOURS:MINUTES     |
|                |  ,seconds            |   :SECONDS"              |
+----------------+----------------------+--------------------------+
MySQL allows any non-numeric delimiter  in the expr format. The  ones 
shown in the table are the suggested delimiters. If the date argument 
is a DATE value  and your calculations  involve only YEAR, MONTH  and 
DAY parts  (that is,  no time  parts), the  result is  a DATE  value. 
Otherwise the result is a DATETIME value.
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 SECOND);
        -> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 DAY);
        -> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL "1:1" MINUTE_SECOND);
        -> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
                       INTERVAL "1 1:1:1" DAY_SECOND);
        -> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
                       INTERVAL "-1 10" DAY_HOUR);
        -> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
        -> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
       -> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
       -> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
       -> 20102
If you specify an interval value that is too short (does  not include 
all the interval parts that would be expected from the type keyword), 
MySQL assumes you have  left out the  leftmost parts of the  interval 
value. For example, if you specify a type of DAY_SECOND, the value of 
expr is expected to have days,  hours, minutes and seconds parts.  If 
you specify a  value like  "1:10", MySQL  assumes that  the days  and 
hours parts are missing and the value represents minutes and seconds. 
In other words, "1:10" DAY_SECOND is  interpreted in such a way  that 
it is equivalent to  "1:10" MINUTE_SECOND. This  is analogous to  the 
way that MySQL  interprets TIME values  as representing elapsed  time 
rather than as time of day. If you use incorrect dates, the result is 
NULL. If you add MONTH, YEAR_MONTH or YEAR and the resulting date has 
a day that is larger than the maximum day for the new month,  the day 
is adjusted to the maximum days in the new month.
mysql> select DATE_ADD('1998-01-30', Interval 1 month);
        -> 1998-02-28
Note from the preceding example that  the word INTERVAL and the  type 
keyword are not case sensitive.
TO_DAYS(date)
        Given a date date,  returns a daynumber  (the number of  days 
        since year 0).
mysql> select TO_DAYS(950501);
        -> 728779
mysql> select TO_DAYS('1997-10-07');
        -> 729669
TO_DAYS() is not intended for use with values that precede the advent 
of the Gregorian calendar (1582).
FROM_DAYS(N)
        Given a daynumber N, returns a DATE value.
mysql> select FROM_DAYS(729669);
        -> '1997-10-07'
FROM_DAYS() is  not intended  for use  with values  that precede  the 
advent of the Gregorian calendar (1582).
DATE_FORMAT(date,format)
 Formats the date value according to the format string. The following 
specifiers may be used in the format string:
+------+------------------------------------------+
|  %M  |  Month name (January..December)          |  
+------+------------------------------------------+
|  %W  |  Weekday name (Sunday..Saturday)         |  
+------+------------------------------------------+
|  %D  |  Day of the month with english suffix    |  
|      |  (1st, 2nd, 3rd, etc.)                   |  
+------+------------------------------------------+
|  %Y  |  Year, numeric, 4 digits                 |  
+------+------------------------------------------+
|  %y  |  Year, numeric, 2 digits                 |  
+------+------------------------------------------+
|  %a  |  Abbreviated weekday name (Sun..Sat)     |  
+------+------------------------------------------+
|  %d  |  Day of the month, numeric (00..31)      |  
+------+------------------------------------------+
|  %e  |  Day of the month, numeric (0..31)       |  
+------+------------------------------------------+
|  %m  |  Month, numeric (01..12)                 |  
+------+------------------------------------------+
|  %c  |  Month, numeric (1..12)                  |  
+------+------------------------------------------+
|  %b  |  Abbreviated month name (Jan..Dec)       |  
+------+------------------------------------------+
|  %j  |  Day of year (001..366)                  |  
+------+------------------------------------------+
|  %H  |  Hour (00..23)                           |  
+------+------------------------------------------+
|  %k  |  Hour (0..23)                            |  
+------+------------------------------------------+
|  %h  |  Hour (01..12)                           |  
+------+------------------------------------------+
|  %I  |  Hour (01..12)                           |  
+------+------------------------------------------+
|  %l  |  Hour (1..12)                            |  
+------+------------------------------------------+
|  %i  |  Minutes, numeric (00..59)               |  
+------+------------------------------------------+
|  %r  |  Time, 12-hour (hh:mm:ss [AP]M)          |  
+------+------------------------------------------+
|  %T  |  Time, 24-hour (hh:mm:ss)                |  
+------+------------------------------------------+
|  %S  |  Seconds (00..59)                        |  
+------+------------------------------------------+
|  %s  |  Seconds (00..59)                        |  
+------+------------------------------------------+
|  %p  |  AM or PM                                |  
+------+------------------------------------------+
|  %w  |  Day of the week (0=Sunday..6=Saturday)  |  
+------+------------------------------------------+
|  %U  |  Week (0..52), where Sunday is the       |  
|      |  first day of the week                   |  
+------+------------------------------------------+
|  %u  |  Week (0..52), where Monday is the       |  
|      |  first day of the week                   |  
+------+------------------------------------------+
|  %%  |  A literal `%'.                          |  
+------+------------------------------------------+
All  other  characters   are just   copied  to   the result   without 
interpretation.
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
        -> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%D %y %a %d %m %b %j');
        -> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
As of  MySQL  3.23, the   % is  required before   a format  specifier 
characters. In earlier versions of MySQL, % was optional.
TIME_FORMAT(time,format)
 This is used like the  DATE_FORMAT() function above, but the  format 
string may contain  only those format  specifiers that handle  hours, 
minutes and seconds. Other specifiers produce a NULL value or 0.
CURDATE()
CURRENT_DATE
 Returns today's date as a value in 'YYYY-MM-DD' or  YYYYMMDD format, 
depending on whether  the function  is used  in a  string or  numeric 
context.
mysql> select CURDATE();
        -> '1997-12-15'
mysql> select CURDATE() + 0;
        -> 19971215
CURTIME()
CURRENT_TIME
 Returns the current time as a value in 'HH:MM:SS' or  HHMMSS format, 
depending on whether  the function  is used  in a  string or  numeric 
context.
mysql> select CURTIME();
        -> '23:50:26'
mysql> select CURTIME() + 0;
        -> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
 Returns the   current date   and time  as  a  value  in  'YYYY-MM-DD 
HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function 
is used in a string or numeric context.
mysql> select NOW();
        -> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
        -> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
 If called with no argument, returns a Unix timestamp  (seconds since 
'1970-01-01 00:00:00' GMT). If UNIX_TIMESTAMP() is called with a date 
argument, it  returns the  value  of the  argument as   seconds since 
'1970-01-01 00:00:00'  GMT. date  may be  a DATE  string, a  DATETIME 
string, a TIMESTAMP, or a number in the format YYMMDD or  YYYYMMDD in 
local time.
mysql> select UNIX_TIMESTAMP();
        -> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580
When UNIX_TIMESTAMP is used on a TIMESTAMP column, the  function will 
receive     the     value      directly,     with     no     implicit 
``string-to-unix-timestamp'' conversion.
FROM_UNIXTIME(unix_timestamp)
 Returns a representation of the  unix_timestamp argument as a  value 
in 'YYYY-MM-DD   HH:MM:SS' or   YYYYMMDDHHMMSS format,  depending  on 
whether the function is used in a string or numeric context.
mysql> select FROM_UNIXTIME(875996580);
        -> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
        -> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
 Returns a  string representation  of the  Unix timestamp,  formatted 
according  to  the  format   string. format   may contain   the  same 
specifiers as   those listed   in the  entry  for  the  DATE_FORMAT() 
function.
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
                            '%Y %D %M %h:%i:%s %x');
        -> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(seconds)
 Returns the   seconds argument,   converted to  hours,  minutes  and 
seconds, as  a value  in 'HH:MM:SS'  or HHMMSS  format, depending  on 
whether the function is used in a string or numeric context.
mysql> select SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
        -> 3938
TIME_TO_SEC(time)
 Returns the time argument, converted to seconds.
mysql> select TIME_TO_SEC('22:23:00');
        -> 80580
mysql> select TIME_TO_SEC('00:39:38');
        -> 2378
7.3.12 Miscellaneous functions
DATABASE()
 Returns the current database name.
mysql> select DATABASE();
        -> 'test'
If there is no current database, DATABASE() returns the empty string.
USER()
SYSTEM_USER()
SESSION_USER()
        Returns the current MySQL user name.
mysql> select USER();
        -> 'davida@localhost'
In MySQL 3.22.11 or later, this includes the client hostname  as well 
as the username.  You can extract  just the  username part like  this 
(which works whether or not the value includes a hostname part):
mysql> select substring_index(USER(),"@",1);
        -> 'davida'
PASSWORD(str)
 Calculates a password string from  the plaintext password str.  This 
is the  function that  is  used for  encrypting MySQL   passwords for 
storage in the Password column of the user grant table.
mysql> select PASSWORD('badpwd');
        -> '7f84554057dd964b'
PASSWORD() encryption is non-reversible. PASSWORD() does not  perform 
password  encryption  in  the   same way   that Unix   passwords  are 
encrypted. You should not assume that if your Unix password  and your 
MySQL password  are the  same,  PASSWORD() will  result in   the same 
encrypted  value  as  is  stored  in  the  Unix  password  file.  See 
ENCRYPT().
ENCRYPT(str[,salt])
 Encrypt str using the  Unix crypt() system  call. The salt  argument 
should be a string with 2 characters.
mysql> select ENCRYPT("hello");
        -> 'VxuFAJXVARROc'
If crypt() is not available on your system, ENCRYPT()  always returns 
NULL. ENCRYPT() ignores  all but the  first 8  characters of str,  at 
least on some systems. This will be determined by the behavior of the 
underlying crypt() system call.
ENCODE(str,pass_str)
 Encrypt str using pass_str as  the password. To decrypt the  result, 
use DECODE(). The results is a binary string. If you want to  save it 
in a column, use a BLOB column type.
DECODE(crypt_str,pass_str)
 Descrypts the   encrypted string  crypt_str using   pass_str as  the 
password. crypt_str should be a string returned from ENCODE().
MD5(string)
 Calculates a MD5 checksum for the string. Value is returned as  a 32 
long hex number that may, for example, be used as a hash key.
mysql> select MD5("testing")
        -> 'ae2b1fca515949e5d54fb22b8ed95575'
This is a "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
LAST_INSERT_ID([expr])
 Returns the last automatically generated value that was inserted 
into an AUTO_INCREMENT column. See section 20.4.29 mysql_insert_id().
mysql> select LAST_INSERT_ID();
        -> 195
The last  ID that  was generated  is maintained  in the  server on  a 
per-connection basis. It will  not be changed  by another client.  It 
will not even be changed if you update another  AUTO_INCREMENT column 
with a non-magic value (that is, a value that is not NULL and not 0). 
If expr is  given as  an argument  to LAST_INSERT_ID()  in an  UPDATE 
clause,  then   the  value   of  the  argument   is  returned   as  a 
LAST_INSERT_ID() value. This can be used to simulate sequences: First 
create the table:
mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);
Then the table can be used to generate sequence numbers like this:
mysql> update sequence set id=LAST_INSERT_ID(id+1);
You can generate sequences without calling LAST_INSERT_ID(),  but the 
utility of  using the  function this   way is that  the ID   value is 
maintained in the server as the last automatically generated value.
You  can  retrieve   the new   ID  as  you   would read   any  normal 
AUTO_INCREMENT value in MySQL. For example, LAST_INSERT_ID() (without 
an  argument)   will  return   the  new  ID.   The  C   API  function 
mysql_insert_id() can also be used to get the value.
FORMAT(X,D)
 Formats the   number X   to a  format  like  '#,###,###.##'  with  D 
decimals. If  D  is 0,  the  result will  have  no decimal  point  or 
fractional part.
mysql> select FORMAT(12332.1234, 2);
        -> '12,332.12'
mysql> select FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> select FORMAT(12332.2,0);
        -> '12,332'
VERSION()
        Returns a string indicating the MySQL server version.
mysql> select VERSION();
        -> '3.22.19b-log'
GET_LOCK(str,timeout)
 Tries to obtain a lock with a  name given by the string str, with  a 
timeout of  timeout  seconds. Returns   1 if the   lock was  obtained 
successfully, 0  if  the attempt   timed out,  or NULL   if an  error 
occurred (such as running out of memory or the thread was killed with 
mysqladmin kill). A lock is released when you execute RELEASE_LOCK(), 
execute a new GET_LOCK() or the thread terminates. This  function can 
be used to implement application locks or to simulate record locks.
mysql> select GET_LOCK("lock1",10);
        -> 1
mysql> select GET_LOCK("lock2",10);
        -> 1
mysql> select RELEASE_LOCK("lock2");
        -> 1
mysql> select RELEASE_LOCK("lock1");
        -> NULL
Note that the  second RELEASE_LOCK()  call returns  NULL because  the 
lock "lock1"  was automatically   released by the  second  GET_LOCK() 
call.
RELEASE_LOCK(str)
 Releases the lock  named by the  string str  that was obtained  with 
GET_LOCK(). Returns 1 if the lock was released, 0 if the  lock wasn't 
locked by this thread  (in which case the  lock is not released)  and 
NULL if the named lock  didn't exist. The lock  will not exist if  it 
was never obtained by a call to GET_LOCK() or if it already  has been 
released.
BENCHMARK(count,expr)
 The BENCHMARK()  function executes  the expression   expr repeatedly 
count times. It  may be  used to time  how fast  MySQL processes  the 
expression. The result value is always 0. The intended use is  in the 
mysql client, which reports query execution times.
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)
The time reported is elapsed time on the client end, not CPU  time on 
the server end. It  may be advisable  to execute BENCHMARK()  several 
times, and interpret the result with regard to how heavily loaded the 
server machine is.
7.3.13 Functions for use with GROUP BY clauses
If you use  a group function  in a statement  containing no GROUP  BY 
clause, it is equivalent to grouping on all rows.
COUNT(expr)
 Returns a count of the number of non-NULL rows retrieved by a SELECT 
statement.
mysql> select student.student_name,COUNT(*)
           from student,course
           where student.student_id=course.student_id
           GROUP BY student_name;
COUNT(*) is optimized to return very quickly if the  SELECT retrieves 
from one table, no other columns are retrieved and there is  no WHERE 
clause. For example:
mysql> select COUNT(*) from student;
COUNT(DISTINCT expr,[expr...])
 Returns a count of the number of different values.
mysql> select COUNT(DISTINCT results) from student;
In MySQL you can get the number of distinct  expressions combinations 
by giving a list of expressions. In  ANSI SQL you would have to do  a 
concatenation of all expressions inside CODE(DISTINCT ..).
AVG(expr)       Returns the average value of expr.
mysql> select student_name, AVG(test_score)
           from student
           GROUP BY student_name;
MIN(expr)
MAX(expr)
 Returns the minimum or  maximum value of  expr. MIN() and MAX()  may 
take a string  argument; in  such cases  they return  the minimum  or 
maximum string value.
mysql> select student_name, MIN(test_score), MAX(test_score)
           from student
           GROUP BY student_name;
SUM(expr)
        Returns the sum of expr. Note  that if the return set has  no 
        rows, it returns NULL!
STD(expr)
STDDEV(expr)
 Returns the standard deviation of expr. This is an extension to ANSI 
SQL. The  STDDEV()  form of   this function is   provided for  Oracle 
compatability.
BIT_OR(expr)
 Returns the  bitwise OR  of all  bits in  expr.  The calculation  is 
performed with 64-bit (BIGINT precision.
BIT_AND(expr)
 Returns the bitwise  AND of  all bits  in expr.  The calculation  is 
performed with 64-bit (BIGINT precision.
MySQL has  extended the  use of   GROUP BY. You  can use   columns or 
calculations in  the SELECT  expressions which  don't appear   in the 
GROUP BY part. This stands for any possible value for this group. You 
can use  this  to get   better performance by   avoiding sorting  and 
grouping on unnecessary items. For  example, you don't need to  group 
on customer.name in the following query:
mysql> select order.custid,customer.name,max(payments)
       from order,customer
       where order.custid = customer.custid
       GROUP BY order.custid;
In ANSI SQL,  you would  have to add  customer.name to  the GROUP  BY 
clause. In MySQL, the name is redundant.
Don't use this feature if the columns you omit from the GROUP BY part 
aren't unique in the group!
In some  cases, you  can use  MIN() and  MAX() to  obtain a  specific 
column value even if it isn't  unique. The following gives the  value 
of column from  the row  containing the  smallest value  in the  sort 
column:
substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)
))
 Note that if you  are using MySQL  3.22 (or earlier)  or if you  are 
trying to follow ANSI SQL, you  can't use expressions in GROUP BY  or 
ORDER BY clauses.  You can work  around this  limitation by using  an 
alias for the expression:
mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name
           GROUP BY id,val ORDER BY val;
In MySQL 3.23 you can do:
mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();
7.4 CREATE DATABASE syntax
CREATE DATABASE db_name
 CREATE DATABASE creates a database with the given name. Rules for 
allowable database names are given in section  7.1.5 Database, table,
index, column and alias. An error occurs if the database already 
exists.
 Databases in MySQL are  implemented as directories containing  files 
that correspond to tables in the database. Since there are  no tables 
in a  database when  it  is initially  created, the   CREATE DATABASE 
statement only creates a directory under the MySQL data directory.
 You can also create databases with mysqladmin. See section
12.1 Overview of the different MySQL pro.
7.5 DROP DATABASE syntax
DROP DATABASE [IF EXISTS] db_name
 DROP DATABASE  drops all  tables  in the  database and   deletes the 
database. Be VERY careful with this command!
DROP DATABASE returns the number of files that were removed  from the 
database directory.  Normally,  this is  three  times the  number  of 
tables, since each table corresponds to a `.ISD' file, a  `.ISM' file 
and a `.frm' file.
In MySQL 3.22 or later, you can use the keywords IF EXISTS to prevent 
an error from occurring if the database doesn't exist.
 You can also drop databases with mysqladmin. See section
12.1 Overview of the different MySQL pro.
7.6 CREATE TABLE syntax
CREATE    [TEMPORARY]     TABLE    [IF    NOT     EXISTS]    tbl_name 
(create_definition,...)
[table_options] [select_statement]
create_definition:
        col_name type   [NOT NULL   | NULL]  [DEFAULT  default_value] 
[AUTO_INCREMENT]
                [PRIMARY KEY] [reference_definition]
        or      PRIMARY KEY (index_col_name,...)
        or      KEY [index_name] KEY(index_col_name,...)
        or      INDEX [index_name] (index_col_name,...)
        or      UNIQUE [INDEX] [index_name] (index_col_name,...)
        or      [CONSTRAINT    symbol]    FOREIGN   KEY    index_name 
(index_col_name,...)
                [reference_definition]
        or      CHECK (expr)
type:
        TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  or    INT[(length)] [UNSIGNED] [ZEROFILL]
  or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  or    NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  or    CHAR(length) [BINARY]
  or    VARCHAR(length) [BINARY]
  or    DATE
  or    TIME
  or    TIMESTAMP
  or    DATETIME
  or    TINYBLOB
  or    BLOB
  or    MEDIUMBLOB
  or    LONGBLOB
  or    TINYTEXT
  or    TEXT
  or    MEDIUMTEXT
  or    LONGTEXT
  or    ENUM(value1,value2,value3,...)
  or    SET(value1,value2,value3,...)
index_col_name:
        col_name [(length)]
reference_definition:
        REFERENCES tbl_name [(index_col_name,...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE reference_option]
                   [ON UPDATE reference_option]
reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
table_options:
    type = [ISAM | MYISAM | HEAP]
or    AUTO_INCREMENT = #
or    AVG_ROW_LENGTH = #
or    CHECKSUM = [0 | 1]
or    COMMENT = "string"
or    MAX_ROWS = #
or    MIN_ROWS = #
or    PACK_KEYS = [0 | 1]
or    PASSWORD = "string"
or    DELAY_KEY_WRITE = [0 | 1]
select_statement:
    [IGNORE | REPLACE] SELECT ...  (Some legal select statement)
CREATE TABLE creates a table with the given name in the current 
database. Rules for allowable table names are given in section
7.1.5 Database, table, index, column and alias. An error occurs if 
there is no current database or if the table already exists.
In MySQL 3.22 or later, the table name can be specified as 
db_name.tbl_name. This works whether or not there is a current 
database.
In MySQL 3.23, you  can use the TEMPORARY  keyword when you create  a 
table.  A  temporary  table   will automatically   be deleted   if  a 
connection dies and the name is  per connection. This means that  two 
different connections  can both  use the  same temporary   table name 
without conflicting with each other or with an existing table  of the 
same name. (The existing table is hidden until the temporary table is 
deleted).
In MySQL 3.23 or  later, you can  use the keywords  IF NOT EXISTS  so 
that an error does not occur  if the table already exists. Note  that 
there is no verification that the table structures are identical.
Each table  tbl_name is  represented by  some files  in the  database 
directory. In the case of ISAM-type tables you will get:
+----------------+--------------------------------+
|  File          |  Purpose                       |  
+----------------+--------------------------------+
|  tbl_name.frm  |  Table definition (form) file  |  
+----------------+--------------------------------+
|  tbl_name.ISD  |  Data file                     |  
+----------------+--------------------------------+
|  tbl_name.ISM  |  Index file                    |  
+----------------+--------------------------------+
For more information on the  properties of the various column  types, 
see section 7.2 Column type.
If neither NULL nor NOT NULL is specified, the column is treated as 
though NULL had been specified.
An integer column may have the additional attribute AUTO_INCREMENT. 
When  you  insert  a  value  of  NULL  (recommended)  or  0  into  an 
AUTO_INCREMENT column, the column is  set to value+1, where value  is 
the largest value for the column currently in the table.
 AUTO_INCREMENT sequences begin with 1. See section  20.4.29 mysql 
insert id(). If you delete the row containing the maximum value for 
an AUTO_INCREMENT column, the value will be reused. If you delete all 
rows in the table, the sequence starts over. Note: There can be only 
one AUTO_INCREMENT column per table, and it must be indexed. To make 
MySQL compatible with some ODBC applications, you can find the last 
inserted row with the following query:
SELECT * FROM tbl_name WHERE auto_col IS NULL
NULL values are handled differently for TIMESTAMP columns  than for 
other column types. You  cannot store a  literal NULL in a  TIMESTAMP 
column; setting the column  to NULL sets it  to the current date  and 
time. Because TIMESTAMP  columns behave  this way, the  NULL and  NOT 
NULL attributes do not apply in the normal way and are ignored if you 
specify them. On the other hand, to make it easier for  MySQL clients 
to use TIMESTAMP columns, the server reports that such columns may be 
assigned NULL values  (which is  true), even  though TIMESTAMP  never 
actually will contain  a NULL value.  You can see  this when you  use 
DESCRIBE tbl_name  to get  a  description of  your table.   Note that 
setting a TIMESTAMP  column to 0  is not  the same as  setting it  to 
NULL, because 0 is a valid TIMESTAMP value.
If no DEFAULT value is specified for a column,  MySQL automatically 
assigns one. If  the column  may take NULL  as a  value, the  default 
value is NULL.  If the column  is declared as  NOT NULL, the  default 
value depends on the column type:
        For  numeric  types  other   than those   declared  with  the   
          AUTO_INCREMENT   attribute,  the   default  is   0.   For  an    
            AUTO_INCREMENT column, the default value is the next value in 
        the sequence.
        For date and time types other than TIMESTAMP, the  default is 
        the appropriate ``zero''  value for the  type. For the  first 
        TIMESTAMP column in a table, the default value is the current 
        date and time. See section  7.2.6 Date and time types.
        For string types other  than ENUM, the  default is the  empty 
        string. For ENUM, the default is the first enumeration value.
        KEY is a synonym for INDEX.
In MySQL, a  UNIQUE key  can have  only distinct  values. An  error 
occurs if  you try  to add  a  new row  with a  key that  matches  an 
existing row.
In MySQL a PRIMARY KEY  is the same thing  as a unique KEY that  is 
named PRIMARY. A table  can have only one  PRIMARY KEY. If you  don't 
have a PRIMARY KEY and some  applications ask for the PRIMARY KEY  in 
your tables, MySQL will  return the first  UNIQUE key as the  PRIMARY 
KEY.
A PRIMARY KEY can be  a multiple-column index. However, you  cannot 
create a multiple-column index using the PRIMARY KEY key  attibute in 
a column specification. Doing so will mark only that single column as 
primary. You must use the PRIMARY KEY(index_col_name, ...) syntax.
If you don't assign a name to an index, the index will  be assigned 
the same name as  the first index_col_name,  with an optional  suffix 
(_2, _3, ...) to make it unique. You can see index names for  a table 
using SHOW INDEX FROM tbl_name. See section 7.20 SHOW syntax (Get 
information about tables, columns,...).
Only the MyISAM  table type  supports indexes on  columns that  can 
have NULL values. In  other cases you  must declare such columns  NOT 
NULL or an error results.
With col_name(length) syntax, you can  specify an index which  uses 
only a part of a CHAR or VARCHAR column. This can make the index file 
much smaller. See section  7.2.9 Column indexs.
Only the  MyISAM table  type  supports indexing  on BLOB   and TEXT 
columns. When putting  an index  on a BLOB  or TEXT  column you  MUST 
always specify the length of the index:
CREATE TABLE test (blob_col BLOB, index(blob_col(10)));
When you use ORDER BY or GROUP BY with a TEXT or BLOB  column, only 
the first max_sort_length bytes are used. See section  7.2.7.2 The 
BLOB and TEXT types.
 
The FOREIGN KEY, CHECK and REFERENCES clauses don't actually do 
anything. The syntax for them is provided only for compatibility, to 
make it easier to port code from other SQL servers and to run 
applications that create tables with references. See section
5.3 Functionality missing from MySQL.
Each NULL column  takes one bit  extra, rounded  up to the  nearest 
byte.
The maximum record length in bytes can be calculated as follows:
row length = 1
             + (sum of column lengths)
             + (number of NULL columns + 7)/8
             + (number of variable-length columns)
The table_options and SELECT options  is only implemented in  MySQL 
3.23 and above. The different table types are:
+----------+----------------------------------------------------+
|  ISAM    |  The original table handler                        |  
+----------+----------------------------------------------------+
|  MyISAM  |  The new binary portable table handler             |  
+----------+----------------------------------------------------+
|  HEAP    |  The data for this table is only stored in memory  |  
+----------+----------------------------------------------------+
 See section 10.18 MySQL table type. The other table options are used 
to optimize the behavior of the table. In most cases, you don't have 
to specify any of them. The options work for all table types, if not 
otherwise indicated.
+-----------------+------------------------------------------------+
| AUTO_INCREMENT  | The next auto_increment value you want         |
|                 | to set for your table (MyISAM)                 |
+-----------------+------------------------------------------------+
| AVG_ROW_LENGTH  | An approximation of the average row length for |
|                 | your table                                     |
+-----------------+------------------------------------------------+
| CHECKSUM        | Set this to 1 if you want MySQL to maintain a  |
|                 | checksum for all rows (makes the table a       |
|                 | little slower to update but makes it easier    |
|                 | to find corrupted tables) (MyISAM)             |
+-----------------+------------------------------------------------+
| COMMENT         | A 60 character comment for your table          |
+-----------------+------------------------------------------------+
| MAX_ROWS        | Max number of rows you plan to store           |
|                 | in the table                                   |
+-----------------+------------------------------------------------+
| MIN_ROWS        | Minimum number of rows you plan to store       |
|                 | in the table                                   |
+-----------------+------------------------------------------------+
| PACK_KEYS       | Set this to 1 if you want to have smaller      |
|                 | index. This usually makes updates slower and   |
|                 | reads faster (MyISAM, ISAM).                   |
+-----------------+------------------------------------------------+
| PASSWORD        | Encrypt the .frm file with a password. This    |
|                 | option doesn't do anything in the standard     |
|                 | MySQL version.                                 |
+-----------------+------------------------------------------------+
| DELAY_KEY_WRITE | Set this to 1 if want to delay key table       |
|                 | updates until the table is closed (MyISAM).    |
+-----------------+------------------------------------------------+
When you use  a MyISAM table,  MySQL uses the  product of max_rows  * 
avg_row_length to decide how big the resulting table will be.  If you 
don't specify any of the above options, the maximum size for  a table 
will be 4G (or 2G if your operating systems only supports 2G tables).
If you  specify a  SELECT after  the CREATE  STATEMENT, MySQL  will 
create new fields for all elements in the SELECT. For example:
mysql> CREATE TABLE test (a int not null auto_increment,
           primary key (a), key(b))
           TYPE=HEAP SELECT b,c from test2;
This will create  a HEAP table  with 3 columns.  Note that the  table 
will automatically be deleted if any errors occur while  copying data 
into the table.
7.6.1 Silent column specification changes
In some cases,  MySQL silently  changes a  column specification  from 
that given in  a CREATE TABLE  statement. (This  may also occur  with 
ALTER TABLE.)
VARCHAR columns with a length less than four are changed to CHAR.
If any column in a table has  a variable length, the entire row  is 
variable-length as  a  result. Therefore,  if  a table  contains  any 
variable-length columns  (VARCHAR, TEXT  or BLOB),  all CHAR  columns 
longer than three  characters are changed  to VARCHAR columnss.  This 
doesn't affect how you use the columns in any way; in  MySQL, VARCHAR 
is just  a different  way to  store characters.  MySQL performs  this 
conversion because it saves space and makes table operations faster.
See section 10.17 What are the different row formats? Or, when should 
VARCHAR/CHAR be used?. 
TIMESTAMP display sizes must be even and in the range from 2 to 14. 
If you specify a display  size of 0 or  greater than 14, the size  is 
coerced to 14. Odd-valued sizes in the range from 1 to 13 are coerced 
to the next higher even number.
You cannot store a literal NULL  in a TIMESTAMP column; setting  it 
to NULL  sets it  to the  current date  and  time. Because  TIMESTAMP 
columns behave this  way, the  NULL and  NOT NULL  attributes do  not 
apply in the normal way and are ignored if you specify them. DESCRIBE 
tbl_name always reports that a TIMESTAMP column may be  assigned NULL 
values.
MySQL maps certain column types used by other SQL  database vendors 
to MySQL  types. See  section 7.2.11  Using column  types from  other 
database engines.
 If you want to  see whether or  not MySQL used  a column type  other 
than the one you specified, issue a DESCRIBE tbl_name statement after 
creating or altering your table.
 Certain other column type changes may occur if you compress  a table 
using pack_isam. See section  10.17 What are the different row 
format? Or, when should VARCHAR/.
7.7 ALTER TABLE syntax
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]
alter_specification:
        ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
  or    ADD INDEX [index_name] (index_col_name,...)
  or    ADD PRIMARY KEY (index_col_name,...)
  or    ADD UNIQUE [index_name] (index_col_name,...)
  or    ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  or    CHANGE [COLUMN] old_col_name create_definition
  or    MODIFY [COLUMN] create_definition
  or    DROP [COLUMN] col_name
  or    DROP PRIMARY KEY
  or    DROP INDEX key_name
  or    RENAME [AS] new_tbl_name
  or    table_option
 ALTER TABLE allows you to change the structure of an existing table. 
For example,   you can  add  or delete   columns, create  or  destroy 
indexes, change the type  of existing columns,  or rename columns  or 
the table itself. You can also  change the comment for the table  and 
type of the table. See section  7.6 CREAT TABLE syntax
 If you use ALTER TABLE to change a column specification but DESCRIBE 
tbl_name indicates that your column  was not changed, it is  possible 
that MySQL ignored your modification for one of the reasons described 
in section  7.6.1 Silent column specification changes.
For example, if  you try to  change a VARCHAR  column to CHAR,  MySQL 
will still use  VARCHAR if the  table contains other  variable-length 
columns.
 ALTER TABLE works by making a temporary copy of the  original table. 
The alteration is performed on the  copy, then the original table  is 
deleted and the new one is renamed.  This is done in such a way  that 
all updates are automatically redirected to the new table without any 
failed updates. While ALTER TABLE is executing, the original table is 
readable by  other  clients. Updates   and writes to   the table  are 
stalled until the new table is ready.
        To use   ALTER TABLE,   you need  select,  insert,  delete,   
        update, create and drop privileges on the table.
        IGNORE is a MySQL extension to ANSI SQL92. It  controls how 
        ALTER TABLE works if there  are duplicates on unique keys  in 
        the new table. If IGNORE isn't specified, the copy is aborted 
        and rolled back. If IGNORE  is specified, then for rows  with 
        duplicates on a unique key, only  the first row is used;  the 
        others are deleted.
        You can issue multiple ADD, ALTER, DROP and  CHANGE clauses 
        in a single ALTER TABLE statement. This is a  MySQL extension 
        to ANSI SQL92, which allows only one of each clause per ALTER 
        TABLE statement.
        CHANGE col_name,  DROP col_name  and DROP  INDEX are  MySQL 
        extensions to ANSI SQL92.
        MODIFY is an Oracle extension to ALTER TABLE.
        The optional word COLUMN  is a pure  noise word and can  be 
        omitted.
        If you use ALTER TABLE tbl_name RENAME AS  new_name without 
        any other   options, MySQL   simply renames  the  files  that   
        correspond to the table tbl_name. There is no need  to create 
        the temporary table.
        create_definition clauses use the  same syntax for ADD  and 
        CHANGE as for  CREATE TABLE. Note  that this syntax  includes 
        the column name, not  just the column  type. See section  7.6 
        CREATE TABLE syntax.
        You  can  rename  a  column  using  a  CHANGE  old_col_name   
         create_definition clause. To do so,  specify the old and  new 
        column names and the type that the column currently  has. For 
        example, to rename an INTEGER column from a to b, you  can do 
        this:
        mysql> ALTER TABLE t1 CHANGE a b INTEGER;
        If you  want to  change a  column's type  but  not the  name, 
        CHANGE syntax still  requires two column  names even if  they 
        are the same. For example:
        mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
        However, as of  MySQL 3.22.16a,  you can also  use MODIFY  to 
        change a column's type without renaming it:
        mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
        If you use CHANGE or MODIFY  to shorten a column for  which 
        an index exists on part of  the column (for instance, if  you 
        have an   index on  the  first 10   characters of  a  VARCHAR  
         column), you cannot make the  column shorter than the  number 
        of characters that are indexed.
        When you change a column type using CHANGE or MODIFY, MySQL 
        tries to convert data to the new type as well as possible.
        In MySQL 3.22 or later, you can use FIRST or ADD  ... AFTER 
        col_name to  add a  column at  a specific  position within  a 
        table row. The default is to add the column last.
        ALTER COLUMN specifies a new default value for a  column or 
        removes the old default value. If the old default  is removed 
        and the column can be NULL,  the new default is NULL. If  the 
        column cannot be NULL, MySQL assigns a default value. Default 
        value assignment  is described  in section  7.6 CREATE  TABLE 
        syntax.
        DROP INDEX removes an index.  This is a MySQL extension  to 
        ANSI SQL92.
        If columns are dropped from  a table, the columns are  also 
        removed from  any index  of which  they are  a  part. If  all 
        columns that  make up  an  index are  dropped, the   index is 
        dropped as well.
        DROP PRIMARY KEY drops the primary index. If no  such index 
        exists, it drops the first UNIQUE index in the  table. (MySQL 
        marks the first UNIQUE key as  the PRIMARY KEY if no  PRIMARY 
        KEY was specified explicitly.)
        With the C API function mysql_info(), you can find  out how 
        many records were copied, and (when IGNORE is used)  how many 
        records were deleted due to duplication of unique key values.
        The  FOREIGN  KEY,  CHECK   and REFERENCES   clauses  don't   
         actually do anything.  The syntax for  them is provided  only 
        for compatibility, to make it easier to port code  from other 
        SQL servers and to run  applications that create tables  with 
        references. See section  5.3 Functionality missing form MySQL
Here is an example  that shows some  of the uses  of ALTER TABLE.  We 
begin with a table t1 that is created as shown below:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
To rename the table from t1 to t2:
mysql> ALTER TABLE t1 RENAME t2;
To change column a from INTEGER to TINYINT NOT NULL (leaving the name 
the same), and to change column  b from CHAR(10) to CHAR(20) as  well 
as renaming it from b to c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
To add a new TIMESTAMP column named d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
To add an index on column d, and make column a the primary key:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
To remove column c:
mysql> ALTER TABLE t2 DROP COLUMN c;
To add a new AUTO_INCREMENT integer column named c:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);
Note that   we indexed  c, because   AUTO_INCREMENT columns  must  be 
indexed, and also  that we  declare c  as NOT  NULL, because  indexed 
columns cannot be NULL.
When you add an  AUTO_INCREMENT column, column  values are filled  in 
with sequence numbers for you automatically.
7.8 OPTIMIZE TABLE syntax
OPTIMIZE TABLE tbl_name
OPTIMZE TABLE should be used  if you have deleted  a large part of  a 
table  or   if  you   have made   many   changes  to  a   table  with 
variable-length  rows  (tables  that   have VARCHAR,   BLOB  or  TEXT 
columns). Deleted   records are   maintained in  a  linked  list  and 
subsequent INSERT operations reuse old record positions. You  can use 
OPTIMIZE TABLE to reclaim the unused space.
OPTIMIZE TABLE  works by  making  a temporary  copy of   the original 
table. The old table is copied  to the new table (without the  unused 
rows), then the original table is deleted and the new one is renamed. 
This is  done  in such   a way  that all   updates are  automatically 
redirected to   the new   table without  any  failed  updates.  While 
OPTIMIZE TABLE is executing, the original table is readable  by other 
clients. Updates and writes  to the table  are stalled until the  new 
table is ready.
7.9 DROP TABLE syntax
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
DROP TABLE removes one or more  tables. All table data and the  table 
definition are removed,  so be  careful with this  command! In  MySQL 
3.22 or later, you can use the keywords IF EXISTS to prevent an error 
from occurring for tables that don't exist.
7.10 DELETE syntax
DELETE [LOW_PRIORITY] FROM tbl_name
    [WHERE where_definition] [LIMIT rows]
DELETE deletes rows from tbl_name that satisfy the condition given by 
where_definition, and returns the number of records deleted.
If you issue  a DELETE with  no WHERE clause,  all rows are  deleted. 
MySQL does this by recreating the  table as an empty table, which  is 
much faster than deleting each row. In this case, DELETE returns zero 
as the number of affected records. (MySQL can't return the  number of 
rows that were actually deleted,  since the recreate is done  without 
opening the   data files.   As long  as  the  table  definition  file 
`tbl_name.frm' is valid, the table can be recreated this way, even if 
the data or index files have become corrupted.).
If you really want to know how many records are deleted when  you are 
deleting all rows, and are willing to suffer a speed penalty, you can 
use a DELETE statement of this form:
mysql> DELETE FROM tbl_name WHERE 1>0;
Note that this is MUCH slower than DELETE FROM tbl_name with no WHERE 
clause, because it deletes rows one at a time.
If you specify the keyword  LOW_PRIORITY, execution of the DELETE  is 
delayed until no other clients are reading from the table.
Deleted records are maintained in a linked list and subsequent INSERT 
operations reuse old  record positions. To  reclaim unused space  and 
reduce file sizes, use the OPTIMIZE TABLE statement or the isamchk 
utility to reorganize tables. OPTIMIZE TABLE is easier, but isamchk 
is faster. See section 7.8 OPIMIZE TABLE syntax, and section 
3.4.3 Tableoptimization.
The MySQL-specific LIMIT rows option  to DELETE tells the server  the 
maximum number of rows  to be deleted  before control is returned  to 
the client. This can be used to ensure that a specific DELETE command 
doesn't take too much time. You can simply repeat the  DELETE command 
until the number of affected rows is less than the LIMIT value.
7.11 SELECT syntax
SELECT     [STRAIGHT_JOIN]    [SQL_SMALL_RESULT]     [SQL_BIG_RESULT] 
[HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
   select_expression,...
   [INTO OUTFILE 'file_name' export_options]
   [FROM table_references
       [WHERE where_definition]
       [GROUP BY col_name,...]
       [HAVING where_definition]
        [ORDER BY  {unsigned_integer |   col_name | formula}  [ASC  | 
DESC] ,...]
       [LIMIT [offset,] rows]
       [PROCEDURE procedure_name] ]
SELECT is used  to retrieve rows  selected from  one or more  tables. 
select_expression indicates the columns you want to  retrieve. SELECT 
may also be used to retrieve  rows computed without reference to  any 
table. For example:
mysql> SELECT 1 + 1;
         -> 2
All keywords used must be given in exactly the order shown above. For 
example, a HAVING  clause must  come after  any GROUP  BY clause  and 
before any ORDER BY clause.
        A SELECT expression  may be  given an alias  using AS.  The 
        alias is used as the expression's column name and can be used 
        with ORDER BY or HAVING clauses. For example:
        mysql> select concat(last_name,', ',first_name) AS full_name
            from mytable ORDER BY full_name;
        The FROM table_references clause indicates the tables  from 
        which to retrieve rows. If you name more than one  table, you 
        are performing a  join. For information  on join syntax,  see 
        section 7.12 JOIN syntax.
        You can refer to a column as col_name, tbl_name.col_name or 
        db_name.tbl_name.col_name. You need not specify a tbl_name or 
        db_name.tbl_name prefix for  a column reference  in a  SELECT 
        statement  unless  the  reference  would  be  ambiguous.  See   
        section  7.1.5 Database, table, index, column and alias names
        , for examples of ambiguity that require the more explicit 
        column reference forms.
        A table   reference may   be aliased  using  tbl_name  [AS]   
        alias_name.
        mysql> select t1.name, t2.salary from employee AS t1, info AS 
t2
                   where t1.name = t2.name;
        mysql> select t1.name, t2.salary from employee t1, info t2
                   where t1.name = t2.name;
        Columns selected for output may be referred to in  ORDER BY 
        and GROUP BY  clauses using column  names, column aliases  or 
        column positions. Column positions begin with 1.
        mysql> select college, region, seed from tournament
                   ORDER BY region, seed;
        mysql> select college, region AS r, seed AS s from tournament
                   ORDER BY r, s;
        mysql> select college, region, seed from tournament
                   ORDER BY 2, 3;
        To sort in reverse order,  add the DESC (descending)  keyword 
        to the name of the column in the ORDER BY clause that you are 
        sorting by.  The  default is  ascending  order; this  may  be 
        specified explicitly using the ASC keyword.
        The HAVING clause can refer to any column or alias named in 
        the select_expression. It is applied last, just  before items 
        are sent  to  the client,  with  no optimization.  Don't  use 
        HAVING for  items that  should be  in the  WHERE clause.  For 
        example, do not write this:
        mysql> select col_name from tbl_name HAVING col_name > 0;
        Write this instead:
        mysql> select col_name from tbl_name WHERE col_name > 0;
        In MySQL 3.22.5  or later,  you can also  write queries  like 
this:
        mysql> select user,max(salary) from users
                   group by user HAVING max(salary)>10;
        In older MySQL versions, you can write this instead:
        mysql> select user,max(salary) AS sum from users
                   group by user HAVING sum>10;
        STRAIGHT_JOIN forces the  optimizer to join  the tables  in 
        the order in which  they are listed  in the FROM clause.  You 
        can use this to speed up  a query if the optimizer joins  the 
        tables in non-optimal order. See section 7.21  EXPLAIN syntax 
        (Get information about a SELECT). 
        SQL_SMALL_RESULT can be used with  GROUP BY or DISTINCT  to 
        tell the optimizer that the result set will be small. In this 
        case, MySQL  will  use fast  temporary  tables to  store  the 
        resulting table instead of using sorting. SQL_SMALL_RESULT is 
        a MySQL extension to ANSI SQL92.
        The LIMIT clause  can be  used to constrain  the number  of 
        rows returned by the SELECT statement. LIMIT takes one or two 
        numeric arguments.  If two   arguments are given,  the  first 
        specifies the offset of the  first row to return, the  second 
        specifies the maximum number of rows to return. The offset of 
        the initial row is 0 (not 1).
        mysql> select * from table LIMIT 5,10;  # Retrieve rows 6-15
        If one argument is given, it indicates the maximum  number of 
        rows to return.
        mysql> select * from table  LIMIT 5;     # Retrieve  first 5 
rows
        In other words, LIMIT n is equivalent to LIMIT 0,n.
        The SELECT  ... INTO   OUTFILE 'file_name' form  of  SELECT 
        writes the selected rows  to a file.  The file is created  on 
        the server   host, and   cannot already  exist  (among  other   
        things, this   prevents database  tables and   files such  as 
        `/etc/passwd' from being destroyed).  You must have the  file 
        privilege on the server host to use this form of SELECT.
        SELECT ...   INTO OUTFILE  is the   complement of  LOAD  DATA  
        INFILE;  the  syntax  for  the  export_options  part  of  the   
         statement consists of the same FIELDS and LINES  clauses that 
        are used with  the LOAD  DATA INFILE  statement. See  section 
        7.15 LOAD DATA  INFILE Syntax.  In the  resulting text  file, 
        only the following characters are  escaped by the ESCAPED  BY 
        character:
         The ESCAPED BY character
         The first character in FIELDS TERMINATED BY
         The first character in LINES TERMINATED BY
        Additionally, ASCII 0 is converted to ESCAPED BY  followed by 
        0 (ASCII  48). The  reason for  the above  is  that you  MUST 
        escape  any  FIELDS  TERMINATED   BY, ESCAPED   BY  or  LINES   
          TERMINATED BY characters to reliably be able to read the file 
        back. ASCII 0 is escaped to make it easier to view  with some 
        pagers. As the resulting file doesn't have to conform  to the 
        SQL syntax, nothing else need be escaped.
7.12 JOIN syntax
 MySQL supports   the following   JOIN syntaxes  for  use  in  SELECT 
statements:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{   oj   table_reference   LEFT   OUTER   JOIN   table_reference   ON 
conditional_expr }
 The last   LEFT OUTER   JOIN syntax  shown  above  exists  only  for 
compatibility with ODBC.
        A  table  reference  may   be aliased   using  tbl_name  AS   
          alias_name or tbl_name alias_name.
        mysql> select t1.name, t2.salary from employee AS t1, info AS 
t2
                   where t1.name = t2.name;
        INNER JOIN and , (comma) are semantically  equivalent. Both 
        do a full join between the tables used. Normally, you specify 
        how the tables should be linked in the WHERE condition.
        The ON conditional is any conditional of the form  that may 
        be used in a WHERE clause.
        If there is  no matching record  for the  right table in  a 
        LEFT JOIN, a row with all columns set to NULL is used for the 
        right table. You can use this fact to find records in a table 
        that have no counterpart in another table:
        mysql> select table1.* from table1
                   LEFT JOIN table2 ON table1.id=table2.id
                   where table2.id is NULL;
        This example finds all rows in  table1 with an id value  that 
        is not present in  table2 (i.e., all  rows in table1 with  no 
        corresponding row in table2). This assumes that  table2.id is 
        declared NOT NULL, of course.
        The USINGcolumn_list clause  names a list  of columns  that 
        must exist in both tables. A USING clause such as:
        A LEFT JOIN B USING (C1,C2,C3,...)
        is defined to be semantically  identical to an ON  expression 
        like this:
        A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
        The NATURAL  LEFT  JOIN of   two tables is   defined to  be  
        semantically equivalent to  a LEFT JOIN  with a USING  clause 
        that names all columns that exist in both tables.
        STRAIGHT_JOIN is identical  to JOIN, except  that the  left 
        table is always read before the right table. This can be used 
        for those  (few)  cases where  the  join optimizer  puts  the 
        tables in the wrong order.
Some examples:
mysql> select * from table1,table2 where table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 USING (id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id
           LEFT JOIN table3 ON table2.id=table3.id;
See section  10.6 How MySQL optimize LEFT
7.13 INSERT syntax
    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...),(...),...
or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression, ...
 INSERT inserts  new rows  into  an existing  table. The   INSERT ... 
VALUES   form    of   the    statement   inserts   rows    based   on 
explicitly-specified values. The INSERT ... SELECT form  inserts rows 
selected from another  table or  tables. The INSERT  ... VALUES  form 
with multiple value lists is supported in MySQL 3.22.5 or  later. The 
col_name=expression syntax is supported in MySQL 3.22.10 or later.
tbl_name is the table into which rows should be inserted.  The column 
name list or  the SET  clause indicates which  columns the  statement 
specifies values for.
        If you  specify no  column list  for INSERT  ... VALUES  or 
        INSERT ... SELECT, values for all columns must be provided in 
        the VALUES() list  or by the  SELECT. If  you don't know  the 
        order of the columns in  the table, use DESCRIBE tbl_name  to 
        find out.
        Any column  not explicitly  given  a value  is set   to its 
        default value. For example, if you specify a column list that 
        doesn't name all  the columns in  the table, unnamed  columns 
        are set to their default values. Default value  assignment is 
        described in section 7.6 CREATE TABLE syntax.
        An expression may refer to any column that was  set earlier 
        in a value list. For example, you can say this:
        mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
        But not this:
        mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
        If you specify the  keyword LOW_PRIORITY, execution of  the 
        INSERT is delayed until no other clients are reading from the 
        table.
        If you specify the  keyword IGNORE in  an INSERT with  many 
        value rows, any rows which  duplicate an existing PRIMARY  or 
        UNIQUE key in the table are ignored and are not  inserted. If 
        you do not specify IGNORE, the insert is aborted if  there is 
        any row that duplicates an existing key value. You  can check 
        with the mysql_info()  how many rows  were inserted into  the 
        table.
        If MySQL was  configured using the  DONT_USE_DEFAULT_FIELDS 
        option,  INSERT  statements  generate  an  error  unless  you   
        explicitly specify  values for   all columns that  require  a 
        non-NULL value. See section  4.7.3 Typical configure options.
 
        The following conditions hold for a INSERT INTO  ... SELECT 
        statement:
                 The query cannot contain an ORDER BY clause.
                 The target  table of the  INSERT statement  cannot 
                appear in the FROM clause  of the SELECT part of  the 
                query, because it's forbidden  in ANSI SQL to  SELECT 
                from the  same table  into which  you are  INSERTing. 
                (The problem is that  the SELECT possibly would  find 
                records that were  inserted earlier  during the  same 
                run. When  using  sub-select clauses,  the  situation 
                could easily be very confusing!)
                 AUTO_INCREMENT columns work as usual.
 If you use INSERT ... SELECT  or a INSERT ... VALUES statement  with 
multiple value lists, you can use the C API function  mysql_info() to 
get information about the query. The format of the information string 
is shown below:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates indicates the  number of  rows that  couldn't be  inserted 
because they would duplicate some existing unique index value.
Warnings indicates the  number of  attempts to  insert column  values 
that were problematic in  some way. Warnings  can occur under any  of 
the following conditions:
        Inserting NULL into  a column  that has  been declared  NOT 
        NULL. The column is set to its default value.
        Setting a numeric column to  a value that lies outside  the 
        column's range.   The value  is clipped   to the  appropriate 
        endpoint of the range.
        Setting a numeric column to a value such as '10.34  a'. The 
        trailing garbage is stripped  and the remaining numeric  part 
        is inserted. If the value doesn't  make sense as a number  at 
        all, the column is set to 0.
        Inserting a  string  into a  CHAR,  VARCHAR, TEXT  or  BLOB 
        column that exceeds the column's maximum length. The value is 
        truncated to the column's maximum length.
        Inserting a  value  into a   date or time   column that  is  
        illegal for   the column  type.  The column   is set  to  the  
         appropriate ``zero'' value for the type.
 The DELAYED  option for  the INSERT  statement is   a MySQL-specific 
option that is very  useful if you have  clients that can't wait  for 
the INSERT to complete. This is common when you use MySQL for logging 
and you also periodically run SELECT statements that take a long time 
to complete. DELAYED was introduced in  MySQL 3.22.15. It is a  MySQL 
extension to ANSI SQL92.
 Another major benefit of using  INSERT DELAYED is that inserts  from 
many clients are bundled together and  written in one block. This  is 
much faster than doing many separate inserts.
Note that currently the queued rows  are only stored in memory  until 
they are inserted into the table. This means that if you  kill mysqld 
the hard way  (kill -9) or  if mysqld  dies unexpectedly, any  queued 
rows that weren't written to disk are lost!
 The following happens when you use  the DELAYED option to INSERT  or 
REPLACE. In  this  description, the  ``thread''  is the  thread  that 
received an INSERT DELAYED command and ``handler'' is the thread that 
handles all INSERT DELAYED statements for a particular table.
        When a thread executes a  DELAYED statement for a table,  a 
        handler thread is  created to handle  all DELAYED  statements 
        for the table, if no such handler already exists.
        The thread checks whether or  not the handler has acquired  a 
        DELAYED lock already; if not, it tells the handler  thread to 
        do so. The DELAYED lock can be obtained even if other threads 
        have a READ or WRITE lock on the table. However,  the handler 
        will wait for all ALTER TABLE locks or FLUSH TABLES to ensure 
        that the table structure is up to date.
        The thread  executes the  INSERT statement  but instead  of 
        writing the row to the table it puts a copy of the  final row 
        into a  queue that  is  managed by  the handler   thread. Any 
        syntax errors  are noticed  by the  thread and   reported the 
        client program.
        The client can't  report the  number of  duplicates or  the 
        AUTO_INCREMENT value for the  resulting row; it can't  obtain 
        them from the server, because  the INSERT returns before  the 
        insert operation has been  completed. If you  use the C  API, 
        the mysql_info() function doesn't return anything meaningful, 
        for the same reason.
        The update log is  updated by the  handler thread when  the 
        row is  inserted  into the  table.  In case  of  multiple-row 
        inserts, the  update log  is updated  when the  first row  is 
        inserted.
        After every   delayed_insert_limit rows  are  written,  the 
        handler checks whether or not any SELECT statements are still 
        pending. If so, it allows these to execute before continuing.
        When the handler has no more  rows in its queue, the  table 
        is unlocked. If no new  INSERT DELAYED commands are  received 
        within    delayed_insert_timeout    seconds,   the    handler     
            terminates.
        If more than delayed_queue_size rows are pending already in 
        a specific handler  queue, the  thread waits  until there  is 
        room in the queue. This is  useful to ensure that the  mysqld 
        server doesn't use all memory for the delayed memory queue.
        The handler thread will show  up in the MySQL process  list 
        with delayed_insert in the Command column. It will  be killed 
        if you execute a  FLUSH TABLES command  or kill it with  KILL 
        thread_id. However, it will first store all queued  rows into 
        the table before exiting. During this time it will not accept 
        any new INSERT commands from  another thread. If you  execute 
        an INSERT DELAYED  command after this,  a new handler  thread 
        will be created.
        Note that the above means that INSERT DELAYED commands have 
        higher priority than  normal INSERT commands  if there is  an 
        INSERT DELAYED handler already running! Other update commands 
        will have  to wait  until the  INSERT DELAY  queue is  empty, 
        someone kills  the handler  thread (with  KILL thread_id)  or 
        someone executes FLUSH TABLES.
        The following  status variables  provide information  about 
        INSERT DELAYED commands:
+--------------------------+--------------------------------------+
| Delayed_insert_threads   | Number of handler threads            | 
+--------------------------+--------------------------------------+
| Delayed_writes           | Number of rows written with          | 
|                          | INSERT DELAYED                       | 
+--------------------------+--------------------------------------+
| Not_flushed_delayed_rows | Number of rows waiting to be written | 
+--------------------------+--------------------------------------+
You can view these variables by issuing a SHOW STATUS statement or by 
executing a mysqladmin extended-status command.
7.14 REPLACE syntax
    REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...)
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression,...
REPLACE works exactly like INSERT, except that if an old record in 
the table has the same value as a new record on a unique index, the 
old record is deleted before the new record is inserted. See section
7.13 INSERT syntax.
7.15 LOAD DATA INFILE syntax
LOAD DATA [LOW_PRIORITY]  [LOCAL] INFILE  'file_name.txt' [REPLACE  | 
IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]]
    [LINES TERMINATED BY '\n']
    [IGNORE number LINES]
    [(col_name,...)]
 The LOAD DATA INFILE  statement reads rows from  a text file into  a 
table at a very  high speed. If the  LOCAL keyword is specified,  the 
file is read  from the client  host. If LOCAL  is not specified,  the 
file must be  located on  the server.  (LOCAL is  available in  MySQL 
3.22.6 or later.)
 For security reasons, when reading text files located on the server, 
the files must either reside in the database directory or be readable 
by all. Also, to use LOAD DATA INFILE on server files, you  must have 
the file privilege  on the  server host. See  section 6.5  Privileges 
provided by MySQL.
 Using LOCAL will be a bit slower than letting the server  access the 
files directly, since the contents of  the file must travel from  the 
client host to the server  host. On the other  hand, you do not  need 
the file privilege to load local files.
 You can also load  data files by  using the mysqlimport utility;  it 
operates by sending  a LOAD DATA  INFILE command  to the server.  The 
--local option causes mysqlimport to read data files from  the client 
host. You can specify the --compress option to get better performance 
over slow networks if  the client and  server support the  compressed 
protocol.
 When locating   files on   the server  host,  the  server  uses  the 
following rules:
        If an  absolute  pathname is  given,  the server  uses  the 
        pathname as is.
        If a relative pathname with one or more  leading components 
        is given, the server  searches for the  file relative to  the 
        server's data directory.
        If a  filename with  no leading  components is   given, the 
        server looks for the  file in the  database directory of  the 
        current database.
Note that these  rules mean a  file given  as `./myfile.txt' is  read 
from  the   server's  data  directory,   whereas  a  file   given  as 
`myfile.txt' is  read  from the  database  directory of  the  current 
database. Note also that for statements such as those below, the file 
is read from the database directory for db1, not db2:
mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table; 
 The REPLACE and  IGNORE keywords control  handling of input  records 
that duplicate existing records on unique key values. If  you specify 
REPLACE, new rows replace existing rows that have the same unique key 
value. If you specify IGNORE,  input rows that duplicate an  existing 
row on a unique  key value are skipped.  If you don't specify  either 
option, an error occurs when a duplicate key value is found,  and the 
rest of the text file is ignored.
 If you load  data from  a local file  using the  LOCAL keyword,  the 
server has no way to stop transmission  of the file in the middle  of 
the operation, so the  default bahavior is the  same as if IGNORE  is 
specified.
LOAD DATA INFILE is the complement of SELECT ... INTO OUTFILE. See 
section 7.11 SELECT syntax. To write data from a database to a file, 
use SELECT ... INTO OUTFILE. To read the file back into the database, 
use LOAD DATA INFILE. The syntax of the FIELDS and LINES clauses is 
the same for both commands. Both clauses are optional, but FIELDS 
must precede LINES if both are specified.
If you specify a  FIELDS clause, each  of its subclauses  (TERMINATED 
BY, [OPTIONALLY] ENCLOSED BY and ESCAPED BY) is also optional, except 
that you must specify at least one of them.
If you don't specify a FIELDS clause, the defaults are the same as if 
you had written this:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
 If you don't specify a LINES clause,  the default is the same as  if 
you had written this:
LINES TERMINATED BY '\n'
In other words, the defaults cause LOAD DATA INFILE to act as follows 
when reading input:
        Look for line boundaries at newlines
        Break lines into fields at tabs
        Do not  expect fields  to be  enclosed within   any quoting 
        characters
        Interpret occurrences of  tab, newline or  `\' preceded  by 
        `\' as literal characters that are part of field values
Conversely, the   defaults cause   SELECT ...  INTO  OUTFILE  to  act   
follows when writing output:
        Write tabs between fields
        Do not enclose fields within any quoting characters
        Use `\' to  escape instances  of tab, newline  or `\'  that 
        occur within field values
        Write newlines at the ends of lines
Note that  to write  FIELDS ESCAPED  BY '\\',  you  must specify  two 
backslashes for the value to be read as a single backslash.
The IGNORE number  LINES option  can be used  to ignore  a header  of 
column names at the start of the file:
mysql> LOAD DATA  INFILE "/tmp/file_name"  into table  test IGNORE  1 
LINES;
When you use SELECT ... INTO OUTFILE in tandem with LOAD  DATA INFILE 
to write data from a database into a file and then read the file back 
into the database later, the field and line handling options for both 
commands must match. Otherwise, LOAD  DATA INFILE will not  interpret 
the contents of the file properly.
Suppose you use SELECT ... INTO  OUTFILE to write a file with  fields 
delimited by commas:
mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'
           FIELDS TERMINATED BY ','
           FROM ...
To read the comma-delimited file back in, the correct statement would 
be:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY ',';
If instead you  tried to read  in the file  with the statement  shown 
below, it wouldn't work because it instructs LOAD DATA INFILE to look 
for tabs between fields:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY '\t';
The likely result is that each  input line would be interpreted as  a 
single field.
LOAD DATA INFILE  can be used  to read  files obtained from  external 
sources, too. For example,  a file in  dBASE format will have  fields 
separated by commas and  enclosed in double  quotes. If lines in  the 
file are terminated by newlines, the command shown  below illustrates 
the field and line handling options you would use to load the file:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';
Any of the field or line handling options may specify an empty string 
(''). If not empty,  the FIELDS [OPTIONALLY]  ENCLOSED BY and  FIELDS 
ESCAPED BY values must be  a single character. The FIELDS  TERMINATED 
BY and LINES TERMINATED BY values may be more than one character. For 
example,   to   write  lines   that   are   terminated  by   carriage 
return-linefeed pairs,  or  to read  a  file containing  such  lines, 
specify a LINES TERMINATED BY '\r\n' clause.
FIELDS [OPTIONALLY]   ENCLOSED BY  controls quoting   of fields.  For 
output (SELECT ... INTO  OUTFILE), if you  omit the word  OPTIONALLY, 
all fields are enclosed by the  ENCLOSED BY character. An example  of 
such output (using a comma as the field delimiter) is shown below:
        "1","a string","100.20"
        "2","a string containing a , comma","102.20"
        "3","a string containing a \" quote","102.20"
        "4","a string containing a \", quote and comma","102.20"
If you specify OPTIONALLY, the ENCLOSED BY character is used  only to 
enclose CHAR and VARCHAR fields:
        1,"a string",100.20
        2,"a string containing a , comma",102.20
        3,"a string containing a \" quote",102.20
        4,"a string containing a \", quote and comma",102.20
Note that occurrences  of the  ENCLOSED BY character  within a  field 
value are escaped by  prefixing them with  the ESCAPED BY  character. 
Also note  that if  you specify   an empty ESCAPED  BY value,   it is 
possible to generate output that cannot be read properly by LOAD DATA 
INFILE. For  example, the  output just  shown above  would appear  as 
shown below if the escape character is empty. Observe that the second 
field in the fourth line contains a comma following the  quote, which 
(erroneously) appears to terminate the field:
        1,"a string",100.20
        2,"a string containing a , comma",102.20
        3,"a string containing a " quote",102.20
        4,"a string containing a ", quote and comma",102.20
For input, the ENCLOSED  BY character, if  present, is stripped  from 
the ends of field values. (This is true whether or not  OPTIONALLY is 
specified;  OPTIONALLY  has  no   effect on   input  interpretation.) 
Occurrences of the ENCLOSED BY  character preceded by the ESCAPED  BY 
character are  interpreted as  part of  the current  field value.  In 
addition, duplicated ENCLOSED BY  characters occurring within  fields 
are interpreted as single ENCLOSED BY characters if the  field itself 
starts with  that  character. For   example, if ENCLOSED   BY '"'  is 
specified, quotes are handled as shown below:
        "The ""BIG"" boss"  -> The "BIG" boss
        The "BIG" boss      -> The "BIG" boss
        The ""BIG"" boss    -> The ""BIG"" boss
FIELDS ESCAPED BY controls how  to write or read special  characters. 
If the FIELDS ESCAPED BY character is not empty, it is used to prefix 
the following characters on output:
        The FIELDS ESCAPED BY character
        The FIELDS [OPTIONALLY] ENCLOSED BY character
        The first character of the  FIELDS TERMINATED BY and  LINES 
        TERMINATED BY values
        ASCII 0  (what is   actually written following  the  escape 
        character is ASCII '0', not a zero-valued byte)
If the  FIELDS  ESCAPED BY   character is empty,   no characters  are 
escaped. It is probably  not a good idea  to specify an empty  escape 
character, particularly if field values  in your data contain any  of 
the characters in the list just given.
For  input,  if  the  FIELDS  ESCAPED  BY  character  is  not  empty, 
occurrences  of  that  character   are stripped   and  the  following 
character is taken literally as part of a field value. The exceptions 
are an escaped `0' or `N' (e.g., \0 or \N if the escape  character is 
`\'). These sequences are interpreted as ASCII 0 (a zero-valued byte) 
and NULL. See below for the rules on NULL handling.
For more information about `\'-escape syntax, see section
7.1 Literals: how to write string and nimbers.
In certain cases, field and line handling options interact:
        If LINES   TERMINATED BY  is an   empty string  and  FIELDS  
        TERMINATED BY is  non-empty, lines are  also terminated  with 
        FIELDS TERMINATED BY.
        If the FIELDS TERMINATED BY  and FIELDS ENCLOSED BY  values 
        are both empty  (''), a fixed-row  (non-delimited) format  is 
        used. With fixed-row format,  no delimiters are used  between 
        fields. Instead, column values are written and read using the 
        ``display'' widths of the columns.  For example, if a  column 
        is declared  as INT(7),  values for  the column   are written 
        using 7-character fields. On input, values for the column are 
        obtained by   reading 7   characters. Fixed-row  format  also 
        affects handling of NULL values; see below.
Handling of NULL  values varies,  depending on the  FIELDS and  LINES 
options you use:
        For the default FIELDS and LINES values, NULL is written as 
        \N for output and \N is read as NULL for input  (assuming the 
        ESCAPED BY character is `\').
        If FIELDS ENCLOSED BY is not empty, a field  containing the 
        literal word NULL as its value is read as a NULL  value (this 
        differs from the word NULL enclosed within FIELDS ENCLOSED BY 
        characters, which is read as the string 'NULL').
        If FIELDS ESCAPED BY is empty, NULL is written as  the word 
        NULL.
        With fixed-row format (which happens when FIELDS TERMINATED 
        BY and FIELDS ENCLOSED BY are both empty), NULL is written as 
        an empty string. Note that  this causes both NULL values  and 
        empty strings   in the  table to   be indistinguishable  when 
        written to  the file  since they  are both  written as  empty 
        strings. If you need  to be able to  tell the two apart  when 
        reading the   file back  in, you   should not  use  fixed-row  
        format.
Some cases are not supported by LOAD DATA INFILE:
        Fixed-size rows (FIELDS TERMINATED  BY and FIELDS  ENCLOSED 
        BY both empty) and BLOB or TEXT columns.
        If you  specify one  separator that  is the  same  as or  a 
        prefix  of  another,  LOAD  DATA  INFILE  won't  be  able  to   
          interpret the  input  properly. For   example, the  following 
        FIELDS clause would cause problems:
        FIELDS TERMINATED BY '"' ENCLOSED BY '"'
        If FIELDS ESCAPED BY is empty, a field value  that contains 
        an occurrence of  FIELDS ENCLOSED BY  or LINES TERMINATED  BY 
        followed by the  FIELDS TERMINATED BY  value will cause  LOAD 
        DATA INFILE to stop reading a  field or line too early.  This 
        happens because LOAD  DATA INFILE  cannot properly  determine 
        where the field or line value ends.
The following example loads all columns of the persondata table:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
No field list is specified, so LOAD DATA INFILE expects input rows to 
contain a field for each table  column. The default FIELDS and  LINES 
values are used.
If you wish to load only some  of a table's columns, specify a  field 
list:
mysql> LOAD DATA INFILE 'persondata.txt'
           INTO TABLE persondata (col1,col2,...);
You must also specify a field list if the order of the fields  in the 
input file  differs from   the order of   the columns in  the  table. 
Otherwise, MySQL cannot tell how to match up input fields  with table 
columns.
If a row has too few fields, the columns for which no input  field is 
present are   set to  default values.   Default value  assignment  is 
described in section  7.6 CREATE TABLE syntax.
An empty field  value is  interpreted differently than  if the  field 
value is missing:
        For string types, the column is set to the empty string.
        For numeric types, the column is set to 0.
        For  date  and  time  types,  the  column  is  set  to  the   
           appropriate ``zero'' value  for the type.  See section  7.2.6 
        Date and time types.
 TIMESTAMP columns are only set to the current date and time if there 
is a NULL value  for the column, or  (for the first TIMESTAMP  column 
only) if the TIMESTAMP column is left out from the field list  when a 
field list is specified.
 If an input row  has too many fields,  the extra fields are  ignored 
and the number of warnings is incremented.
 LOAD DATA INFILE  regards all  input as  strings, so  you can't  use 
numeric values for ENUM  or SET columns the  way you can with  INSERT 
statements. All ENUM and SET values must be specified as strings!
 If you are using the C API, you can get information about  the query 
by calling the API  function mysql_info() when  the LOAD DATA  INFILE 
query finishes. The format of the information string is shown below:
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
 Warnings occur  under  the same  circumstances  as when  values  are 
inserted via the INSERT statement (see section 7.13 INSERT syntax),
except that LOAD DATA INFILE  also generates warnings when there  are 
too few or too  many fields in  the input row.  The warnings are  not 
stored anywhere;  the number   of warnings can   only be used  as  an 
indication if everything went well. If  you get warnings and want  to 
know exactly why you got  them, one way to  do this is to use  SELECT 
... INTO OUTFILE into another file and compare this to  your original 
input file.
 For more information about the efficiency of INSERT versus LOAD DATA 
INFILE and speeding up LOAD DATA INFILE, see section  10.12 How to 
arrange a table to be as fast/small as possible
7.16 UPDATE syntax
UPDATE [LOW_PRIORITY] tbl_name SET 
col_name1=expr1,col_name2=expr2,...
    [WHERE where_definition] [LIMIT #]
 UPDATE updates columns in existing  table rows with new values.  The 
SET clause  indicates which  columns to  modify and  the values  they 
should be given.  The WHERE  clause, if given,  specifies which  rows 
should be updated. Otherwise all rows are updated.
 If you specify the keyword LOW_PRIORITY, execution of the  UPDATE is 
delayed until no other clients are reading from the table.
 If you access a column from  tbl_name in an expression, UPDATE  uses 
the current value of the column. For example, the following statement 
sets the age column to one more than its current value:
mysql> UPDATE persondata SET age=age+1;
 UPDATE assignments are  evaluated from left  to right. For  example, 
the following statement doubles the age column, then increments it:
mysql> UPDATE persondata SET age=age*2, age=age+1;
 If you set  a column to  the value it  currently has, MySQL  notices 
this and doesn't update it.
UPDATE returns  the number  of rows  that were  actually changed.  In 
MySQL 3.22  or later,  the C  API function  mysql_info() returns  the 
number of  rows that   were matched and   updated and the  number  of 
warnings that occurred during the UPDATE.
In MySQL 3.23 you can use LIMIT # to ensure that only a  given number 
of rows are changed.
7.17 USE syntax
USE db_name
The USE db_name statement tells MySQL to use the db_name  database as 
the default  database for  subsequent queries.  The database  remains 
current until the end of the session, or until another  USE statement 
is issued:
mysql> USE db1;
mysql> SELECT count(*) FROM mytable;      # selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable;      # selects from db2.mytable
Making a particular database  current by means  of the USE  statement 
does not preclude you from  accessing tables in other databases.  The 
example below accesses the author table from the db1 database and the 
editor table from the db2 database:
mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
           WHERE author.editor_id = db2.editor.editor_id;
 The USE statement is provided for Sybase compatibility.
7.18 FLUSH syntax (clearing caches)
FLUSH flush_option [,flush_option]
You should use the  FLUSH command if  you want to  clear some of  the 
internal caches  MySQL uses.  To  execute FLUSH,  you must   have the 
reload privilege.
flush_option can be any of the following:
+--------------+----------------------------------------------------+
|  HOSTS       |  Empties the host cache tables. You should         |
|              |  flush the host tables if some of your hosts       |
|              |  change IP number or if you get the error          |
|              |  message Host ... is blocked. When more than       |
|              |  max_connect_errors errors occur in a row for      |
|              |  a given host while connection to the MySQL        |
|              |  server, MySQL assumes something is wrong and      |
|              |  blocks the host from further connection requests. |
|              |  Flushing the host tables allows the host to       |
|              |  attempt to connect again. See section             |
|              |  18.2.3 Host '...' is blicked error.) You can start|
|              |  mysqld with -O max_connection_errors=999999999    |
|              |  to avoid this error message.                      |
+--------------+----------------------------------------------------+
|  LOGS        |  Closes and reopens the standard and update log    |
|              |  files. If you have specified the update log file  |
|              |  without an extension, the extension number of     |
|              |  t he new update log file will be incremented by   |
|              |  o ne relative to the previous file.               |
+--------------+----------------------------------------------------+
|  PRIVILEGES  |  Reloads the privileges from the grant tables      |
|              |  in the mysql database.                            |
+--------------+----------------------------------------------------+
|  TABLES      |  Closes all open tables.                           |
+--------------+----------------------------------------------------+
|  STATUS      |  Resets most status variables to zero.             |
+--------------+----------------------------------------------------+
You can  also  access each   of the  commands shown   above with  the 
mysqladmin utility,  using  the flush-hosts,   flush-logs, reload  or 
flush-tables commands.
7.19 KILL syntax
KILL thread_id
 Each connection to  mysqld runs in  a separate  thread. You can  see 
which threads are running with the SHOW PROCESSLIST command, and kill 
a thread with the KILL thread_id command.
If you have the process privilege, you can see and kill  all threads. 
Otherwise, you can see and kill only your own threads.
 You can  also use  the mysqladmin  processlist and   mysqladmin kill 
commands to examine and kill threads.
7.20 SHOW syntax (Get information about tables, columns,...)
   SHOW DATABASES [LIKE wild]
or SHOW TABLES [FROM db_name] [LIKE wild]
or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW INDEX FROM tbl_name [FROM db_name]
or SHOW STATUS
or SHOW VARIABLES [LIKE wild]
or SHOW PROCESSLIST
or SHOW TABLE STATUS [FROM db_name] [LIKE wild]
SHOW provides  information about  databases, tables,  columns or  the 
server. If the  LIKE wild  part is  used, the  wild string  can be  a 
string that uses the SQL `%' and `_' wildcard characters.
You can use db_name.tbl_name as  an alternative to the tbl_name  FROM 
db_name syntax. These two statements are equivalent:
mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable;
 SHOW DATABASES lists the databases on the MySQL server host. You can 
also get this list using the mysqlshow command.
 SHOW TABLES lists the tables in  a given database. You can also  get 
this list using the mysqlshow db_name command.
Note: If a user  doesn't have any privileges  for a table, the  table 
will not show up in the output from SHOW TABLES or mysqlshow db_name.
SHOW COLUMNS lists the columns in a given table. If the  column types 
are different than  you expect  them to be  based on  a CREATE  TABLE 
statement, note   that MySQL   sometimes changes  column  types.  See 
section 7.6.1 Silent column specification changes.
 The DESCRIBE statement provides information similar to SHOW COLUMNS. 
See section 7.22 DESCRIBE syntax (Get information about columns)
 SHOW TABLE STATUS (new in version 3.23) works likes SHOW STATUS, but 
provides a lot of information about each table. You can also get this 
list using  the mysqlshow   --status db_name command.  The  following 
columns are returned:
+-------------------+--------------------------------------------+-
|  Name             |  Name of the table                         |  
+-------------------+--------------------------------------------+-
|  Type             |  Type of table (NISAM, MyISAM or HEAP)     |  
+-------------------+--------------------------------------------+-
|  Rows             |  Number of rows                            |  
+-------------------+--------------------------------------------+-
|  Avg_row_length   |  Average row length                        |  
+-------------------+--------------------------------------------+-
|  Data_length      |  Length of the data file                   |  
+-------------------+--------------------------------------------+-
|  Max_data_length  |  Max length of the data file               |  
+-------------------+--------------------------------------------+-
|  Index_length     |  Length of the index file                  |  
+-------------------+--------------------------------------------+-
|  Data_free        |  Number of allocated but not used bytes    |  
+-------------------+--------------------------------------------+-
|  Auto_increment   |  Next autoincrement value                  |  
+-------------------+--------------------------------------------+-
|  Create_time      |  When the table was created                |  
+-------------------+--------------------------------------------+-
|  Update_time      |  When the data file was last updated       |  
+-------------------+--------------------------------------------+-
|  Check_time       |  When one last run a check on the table    |  
+-------------------+--------------------------------------------+-
|  Create_options   |  Extra options used with CREATE TABLE      |  
+-------------------+--------------------------------------------+-
|  Comment          |  The comment used when creating the table  |  
|                   |  (or some information why MySQL couldn't   |  
|                   |  access the table information).            |  
+-------------------+--------------------------------------------+-
 SHOW FIELDS is a synonym for SHOW COLUMNS and SHOW KEYS is a synonym 
for SHOW INDEX. You can also  list a table's columns or indexes  with 
mysqlshow db_name tbl_name or mysqlshow -k db_name tbl_name.
SHOW INDEX returns  the index  information in a  format that  closely 
resembles the SQLStatistics call in  ODBC. The following columns  are 
returned:
+---------------+---------------------------------------------------+
|  Table        |  Name of the table                                | 
+---------------+---------------------------------------------------+
|  Non_unique   |  0 if the index can't contain duplicates.         | 
+---------------+---------------------------------------------------+
|  Key_name     |  Name of the index                                | 
+---------------+---------------------------------------------------+
|  Seq_in_index |  Column sequence number in index, starting with 1.| 
+---------------+---------------------------------------------------+
|  Column_name  |  Column name.                                     | 
+---------------+---------------------------------------------------+
|  Collation    |  How the column is sorted in the index.           | 
|               |  In MySQL, this can have values A (Ascending)     | 
|               |  or NULL (Not sorted).                            | 
+---------------+---------------------------------------------------+
|  Cardinality  |  Number of unique values in the index.            | 
|               |  This is updated by running isamchk -a.           | 
+---------------+---------------------------------------------------+
|  Sub_part     |  Number of indexed characters if the column       | 
|               |  is only partly indexed. NULL if the entire       | 
|               |  key is indexed.                                  | 
+---------------+---------------------------------------------------+
SHOW STATUS   provides server   status information  (like  mysqladmin 
extended-status). The output resembles  that shown below, though  the 
format and numbers may differ somewhat:
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| Aborted_clients          | 0      |
| Aborted_connects         | 0      |
| Created_tmp_tables       | 0      |
| Delayed_insert_threads   | 0      |
| Delayed_writes           | 0      |
| Delayed_errors           | 0      |
| Flush_commands           | 2      |
| Handler_delete           | 2      |
| Handler_read_first       | 0      |
| Handler_read_key         | 1      |
| Handler_read_next        | 0      |
| Handler_read_rnd         | 35     |
| Handler_update           | 0      |
| Handler_write            | 2      |
| Key_blocks_used          | 0      |
| Key_read_requests        | 0      |
| Key_reads                | 0      |
| Key_write_requests       | 0      |
| Key_writes               | 0      |
| Max_used_connections     | 1      |
| Not_flushed_key_blocks   | 0      |
| Not_flushed_delayed_rows | 0      |
| Open_tables              | 1      |
| Open_files               | 2      |
| Open_streams             | 0      |
| Opened_tables            | 11     |
| Questions                | 14     |
| Running_threads          | 1      |
| Slow_queries             | 0      |
| Uptime                   | 149111 |
+--------------------------+--------+
The status variables listed above have the following meaning:
+-----------------------+-------------------------------------------+
|  Aborted_clients      |  Number of connections that has been      |
|                       |  aborted because the client has died      |
|                       |  without closing the connection properly. |
+-----------------------+-------------------------------------------+
|  Aborted_connects     |  Number of tries to connect to the MySQL  |
|                       |  server that has failed.                  |
+-----------------------+-------------------------------------------+
|  Created_tmp_tables   |  Number of implicit temporary tables      |
|                       |  that has been created while executing    |
|                       |  statements.                              |
+-----------------------+-------------------------------------------+
|  Delayed_insert       |  Number of delayed insert handler         |
|  _threads             |  threads in use.                          |
+-----------------------+-------------------------------------------+
|  Delayed_writes       |  Number of rows written with              |
|                       |  INSERT DELAYED.                          |
+-----------------------+-------------------------------------------+
|  Delayed_errors       |  Number of rows written with INSERT       |
|                       |  DELAYED for which some error occurred    |
|                       |  (probably duplicate key).                |
+-----------------------+-------------------------------------------+
|  Flush_commands       |  Number of executed FLUSH commands.       |
+-----------------------+-------------------------------------------+
|  Handler_delete       |  Number of requests to delete a row       |
|                       |  from a table.                            |
+-----------------------+-------------------------------------------+
|  Handler_read_first   |  Number of request to read first the      |
|                       |  row in a table.                          |
+-----------------------+-------------------------------------------+
|  Handler_read_key     |  Number of request to read a row based    |
|                       |  on a key.                                |
+-----------------------+-------------------------------------------+
|  Handler_read_next    |  Number of request to read next row       |
|                       |  in key order.                            |
+-----------------------+-------------------------------------------+
|  Handler_read_rnd     |  Number of request to read a row based    |
|                       |  on a fixed position.                     |
+-----------------------+-------------------------------------------+
|  Handler_update       |  Number of requests to update a row       |
|                       |  in a table.                              |
+-----------------------+-------------------------------------------+
|  Handler_write        |  Number of requests to insert a row       |
|                       |  in a table.                              |
+-----------------------+-------------------------------------------+
|  Key_blocks_used      |  The number of used blocks in the         |
|                       |  key cache.                               |
+-----------------------+-------------------------------------------+
|  Key_read_requests    |  The number of request to read a key      |
|                       |  block from the cache.                    |
+-----------------------+-------------------------------------------+
|  Key_reads            |  The number of physical reads of a key    |
|                       |  block from disk.                         |
+-----------------------+-------------------------------------------+
|  Key_write_requests   |  The number of request to write a key     |
|                       |  block to the cache.                      |
+-----------------------+-------------------------------------------+
|  Key_writes           |  The number of physical writes of a key   |
|                       |  block to disk.                           |
+-----------------------+-------------------------------------------+
|  Max_used_connections |  The maximum number of connections        |
|                       |  that has been in use simultaneously.     |
+-----------------------+-------------------------------------------+
|  Not_flushed_key      |  Keys blocks in the key cache that has    |
|  _blocks              |  changed but hasn't yet been flushed      |
|                       |  to disk.                                 |
+-----------------------+-------------------------------------------+
|  Not_flushed_delayed  |  Number of rows waiting to be written     |
|  _rows                |  in INSERT DELAY queues.                  |
+-----------------------+-------------------------------------------+
|  Open_tables          |  Number of tables that are open.          |
+-----------------------+-------------------------------------------+
|  Open_files           |  Number of files that are open.           |
+-----------------------+-------------------------------------------+
|  Open_strems          |  Number of streams that are open          |
|                       |  (used mainly for logging)                |
+-----------------------+-------------------------------------------+
|  Opened_tables        |  Number of tables that has been opened.   |
+-----------------------+-------------------------------------------+
|  Questions            |  Number of questions asked from to the    |
|                       |  server.                                  |
+-----------------------+-------------------------------------------+
|  Running_threads      |  Number of currently open connections.    |
+-----------------------+-------------------------------------------+
|  Slow_queries         |  Number of queries that has taken more    |
|                       |  than long_query_time                     |
+-----------------------+-------------------------------------------+
|  Uptime               |  How many seconds the server has          |
|                       |  been up.                                 |
+-----------------------+-------------------------------------------+
Some comments about the above:
        If Opened_tables is big, then your table_cache  variable is 
        probably too small.
        If key_reads is  big, then your  key_cache is probably  too 
        small.   The  cache   hit   rate  can   be  calculated   with    
              key_reads/key_read_requests.
        If Handler_read_rnd is big, then you have a probably  a lot 
        of queries that requires  MySQL to scan  whole tables or  you 
        have joins that doesn't use keys properly.
SHOW  VARIABLES  shows  the  values  of  the  some  of  MySQL  system 
variables. You can  also get  this information  using the  mysqladmin 
variables command. If the default values are unsuitable, you  can set 
most of these variables using command-line options when mysqld starts 
up. The  output resembles  that shown  below, though  the format  and 
numbers may differ somewhat:
+------------------------+--------------------------+
| Variable_name          | Value                    |
+------------------------+--------------------------+
| back_log               | 5                        |
| connect_timeout        | 5                        |
| basedir                | /my/monty/               |
| datadir                | /my/monty/data/          |
| delayed_insert_limit   | 100                      |
| delayed_insert_timeout | 300                      |
| delayed_queue_size     | 1000                     |
| join_buffer_size       | 131072                   |
| flush_time             | 0                        |
| key_buffer_size        | 1048540                  |
| language               | /my/monty/share/english/ |
| log                    | OFF                      |
| log_update             | OFF                      |
| long_query_time        | 10                       |
| low_priority_updates   | OFF                      |
| max_allowed_packet     | 1048576                  |
| max_connections        | 100                      |
| max_connect_errors     | 10                       |
| max_delayed_threads    | 20                       |
| max_heap_table_size    | 16777216                 |
| max_join_size          | 4294967295               |
| max_sort_length        | 1024                     |
| max_tmp_tables         | 32                       |
| net_buffer_length      | 16384                    |
| port                   | 3306                     |
| protocol-version       | 10                       |
| record_buffer          | 131072                   |
| skip_locking           | ON                       |
| socket                 | /tmp/mysql.sock          |
| sort_buffer            | 2097116                  |
| table_cache            | 64                       |
| thread_stack           | 131072                   |
| tmp_table_size         | 1048576                  |
| tmpdir                 | /machine/tmp/            |
| version                | 3.23.0-alpha-debug       |
| wait_timeout           | 28800                    |
+------------------------+--------------------------+
See section  10.1 Tuning server parame.
SHOW PROCESSLIST shows you  which threads are  running. You can  also 
get this information using the mysqladmin processlist command. If you 
have the process privilege, you  can see all threads. Otherwise,  you 
can see only your own threads. See section 7.19 KILL syntax.
7.21 EXPLAIN syntax (Get information about a SELECT)
EXPLAIN SELECT select_options
When you precede a SELECT  statement with the keyword EXPLAIN,  MySQL 
explains how it would process the SELECT, providing information about 
how tables are joined and in which order.
With the help of EXPLAIN,  you can see when  you must add indexes  to 
tables to get a faster SELECT that uses indexes to find  the records. 
You can also  see if  the optimizer joins  the tables  in an  optimal 
order. To force  the optimizer  to use a  specific join  order for  a 
SELECT statement, add a STRAIGHT_JOIN clause.
For non-simple joins, EXPLAIN returns  a row of information for  each 
table used in  the SELECT  statement. The  tables are  listed in  the 
order  they  would  be  read.   MySQL resolves   all joins   using  a 
single-sweep multi-join method.  This means  that MySQL  reads a  row 
from the first table, then finds a matching row in the  second table, 
then in the third table and so on. When all tables are  processed, it 
outputs the selected  columns and backtracks  through the table  list 
until a table is  found for which there  are more matching rows.  The 
next row is read from this  table and the process continues with  the 
next table.
Output from EXPLAIN includes the following columns:
table   The table to which the row of output refers.
type    The join type. Information about  the various types is  given 
        below.
possible_keys
        The possible_keys column indicates which indexes MySQL  could 
use to find the rows in the table. If this column is     empty, there 
are no relevant indexes.  In this case, you  may  be able to  improve 
the performance of your  query by                 examining the WHERE 
clause to see if it refers to some       column or columns that would 
be suitable for indexing. If     so, create an appropriate index  and 
check the query with     EXPLAIN again. To  see what indexes a  table 
has, use                SHOW INDEX FROM tbl_name.
key     The  key  column  indicates   the key   that  MySQL  actually   
          decided to use. The key is NULL if no index was chosen.
key_len
        The key_len  column  indicates the  length  of the  key  that 
        MySQL decided to use. The length is NULL if the key is  NULL.
ref     The ref column shows which columns or constants  are     used 
with the key to select rows from the table.
rows    The rows column indicates the number of rows  MySQL      must 
examine to execute the query.
Extra   If the Extra column includes the text Only index,  this means 
        that information   is retrieved  from the   table using  only 
        information in the index tree. Normally, this is  much faster 
        than scanning the entire table. If the Extra  column includes 
        the text where  used, it means  that a  WHERE clause will  be 
        used to restrict which rows will be matched against  the next 
        table or sent to the client.
The different join types are listed below, ordered from best to worst 
type:
system
        The table  has only   one row (=   system table). This  is  a  
special case of the const join type.
const   The table has at most one matching row, which will  be   read 
at  the   start of   the  query.   Since  there  is   only one   row,   
       values from the column in this row can be regarded as    constants by 
the rest of the optimizer. const tables are very         fast as they 
are read only once!
eq_ref
        One row will  be read  from this table  for each  combination 
        of rows  from the  previous tables.  This the   best possible 
        join type, other than  the const types.  It is used when  all 
        parts of  an index  are used  by the  join and  the index  is 
        UNIQUE or a PRIMARY KEY.
ref     All rows with matching  index values will  be read from  this 
        table for each combination of rows from the  previous tables. 
        ref is used if  the join uses only  a leftmost prefix of  the 
        key, or if the key is not  UNIQUE or a PRIMARY KEY (in  other 
        words, if the join  cannot select a  single row based on  the 
        key value). If the key that is used matches only a few  rows, 
this join type is good.
range   Only rows that are in a given range will be  retrieved, using 
        an index to select the  rows. The ref column indicates  which 
        index is used.
index   This is the same as ALL,  except that only the index tree  is 
        scanned. This is usually faster  than ALL, as the index  file 
        is usually smaller than the data file.
ALL     A full table scan will be  done for each combination of  rows 
        from the previous tables.  This is normally  not good if  the 
        table is the first table  not marked const, and usually  very 
        bad in all other cases. You normally can avoid ALL  by adding 
        more indexes,  so that  the  row can  be retrieved   based on 
        constant values or column values from earlier tables.
 You can get a good indication of  how good a join is by  multiplying 
all values in the rows column of the EXPLAIN output. This should tell 
you roughly how many  rows MySQL must  examine to execute the  query. 
This  number  is  also  used  when  you  restrict  queries  with  the 
max_join_size variable. See section 10.1 Tuning server parameters.
 The  following   example  shows   how  a   JOIN  can   be  optimized 
progressively using the information provided by EXPLAIN.
 Suppose you have the SELECT statement shown below, that  you examine 
using EXPLAIN:
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
            tt.ProjectReference, tt.EstimatedShipDate,
            tt.ActualShipDate, tt.ClientID,
            tt.ServiceCodes, tt.RepetitiveID,
            tt.CurrentProcess, tt.CurrentDPPerson,
            tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
            et_1.COUNTRY, do.CUSTNAME
        FROM tt, et, et AS et_1, do
        WHERE tt.SubmitTime IS NULL
            AND tt.ActualPC = et.EMPLOYID
            AND tt.AssignedPC = et_1.EMPLOYID
            AND tt.ClientID = do.CUSTNMBR;
For this example, assume that:
        The columns being compared have been declared as follows:
        +---------+--------------+---------------+
        |  Table  |  Column      |  Column type  |  
        +---------+--------------+---------------+
        |  tt     |  ActualPC    |  CHAR(10)     |  
        +---------+--------------+---------------+
        |  tt     |  AssignedPC  |  CHAR(10)     |  
        +---------+--------------+---------------+
        |  tt     |  ClientID    |  CHAR(10)     |  
        +---------+--------------+---------------+
        |  et     |  EMPLOYID    |  CHAR(15)     |  
        +---------+--------------+---------------+
        |  do     |  CUSTNMBR    |  CHAR(15)     |  
        +---------+--------------+---------------+
        
        The tables have the indexes shown below:
        +---------+------------------------------+
        |  Table  |  Index                       |
        +---------+------------------------------+
        |  tt     |  ActualPC                    |
        +---------+------------------------------+
        |  tt     |  AssignedPC                  |
        +---------+------------------------------+
        |  tt     |  ClientID                    |
        +---------+------------------------------+
        |  et     |  EMPLOYID (primary key)      |
        +---------+------------------------------+
        |  do     |  CUSTNMBR (primary key)      |
        +---------+------------------------------+
        The tt.ActualPC values aren't evenly distributed.
 Initially, before any optimizations have been performed, the EXPLAIN 
statement produces the following information:
table type possible_keys                key  key_len ref  rows  Extra
et    ALL  PRIMARY                      NULL NULL    NULL 74
do    ALL  PRIMARY                      NULL NULL    NULL 2135
et_1  ALL  PRIMARY                      NULL NULL    NULL 74
tt    ALL  AssignedPC,ClientID,ActualPC NULL NULL    NULL 3872
      range checked for each record (key map: 35)
Since type is ALL for each table, this output indicates that MySQL is 
doing a full join for all tables!  This will take quite a long  time, 
as the product of the number of rows in each table must  be examined! 
For the case at hand, this is 74 * 2135 * 74 * 3872  = 45,268,558,720 
rows. If the  tables were bigger,  you can only  imagine how long  it 
would take...
One problem here  is that MySQL  can't (yet)  use indexes on  columns 
efficiently if   they are   declared differently.  In  this  context, 
VARCHAR and CHAR are the same  unless they are declared as  different 
lengths. Since tt.ActualPC is declared as CHAR(10) and et.EMPLOYID is 
declared as CHAR(15), there is a length mismatch.
To fix  this disparity  between column  lengths, use  ALTER TABLE  to 
lengthen ActualPC from 10 characters to 15 characters:
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
Now tt.ActualPC and et.EMPLOYID are both VARCHAR(15).
Executing the EXPLAIN statement again produces this result:
+------+------+-----------+-------+----+------+----+----------------+
| table|type  |possible_  | key   |key | ref  |rows| Extra          |
|      |      |keys       |       |_len|      |    |                |
+------+------+-----------+-------+----+------+----+----------------+
| tt   | ALL  |Assigned PC| NULL  |NULL| NULL | 872| where used     |
|      |      |,ClientID  |       |    |      |    |                |
|      |      |,ActualPC  |       |    |      |    |                |
+------+------+-----------+-------+----+------+----+----------------+
| do   | ALL  |  PRIMARY  | NULL  |NULL| NULL |2135| range checked  |
|      |      |           |       |    |      |    | for each       |
+------+------+-----------+-------+----+------+----| record         |
| et_1 | ALL  |  PRIMARY  | NULL  |NULL| NULL | 74 | (key map:1)    |
+------+------+-----------+-------+----+------+----+----------------+
| et   |eq_ref|  PRIMARY  |PRIMARY|15  |tt.Act|  1 |                |
|      |      |           |       |    | ualPC|    |                |
+------+------+-----------+-------+----+------+----+----------------+
 This is not  perfect, but is  much better (the  product of the  rows 
values is now less by a factor of 74). This version is executed  in a 
couple of seconds.
A second  alteration  can be   made to eliminate   the column  length 
mismatches for the  tt.AssignedPC = et_1.EMPLOYID  and tt.ClientID  = 
do.CUSTNMBR comparisons:
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
                      MODIFY ClientID   VARCHAR(15);
Now EXPLAIN produces the output shown below:
+------+------+-----------+-------+----+-------------+-----+-------+
| table|type  |possible_  | key   |key | ref         |rows | Extra |
|      |      |keys       |       |_len|             |     |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| et   |ALL   |PRIMARY    | NULL  |NULL| NULL  74    |     |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| tt   |ref   |AssignedPC,|Actual | 15 | et.EMPLOYID | 52  | where |
|      |      |ClientID,  |PC     |    |             |     | used  |
|      |      |ActualPC   |       |    |             |     |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| et_1 |eq_ref|PRIMARY    |PRIMARY| 15 |tt.AssignedPC|  1  |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| do   |eq_ref|PRIMARY    |PRIMARY| 15 |tt.ClientID  |  1  |       |
+------+------+-----------+-------+----+-------------+-----+-------+
This is ``almost'' as good as it can get.
The remaining problem is that, by default, MySQL assumes  that values 
in the tt.ActualPC column are evenly distributed, and that  isn't the 
case for the tt  table. Fortunately, it is  easy to tell MySQL  about 
this:
shell> isamchk --analyze PATH_TO_MYSQL_DATABASE/tt
shell> mysqladmin refresh
Now the join is ``perfect'', and EXPLAIN produces this result:
+------+------+-----------+-------+----+-------------+-----+-------+
| table|type  |possible_  | key   |key | ref         |rows | Extra |
|      |      |keys       |       |_len|             |     |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| tt   |All   |AssignedPC,| NULL  |NULL|             | 3872| where |
|      |      |ClientID,  |       |    |             |     | used  |
|      |      |ActualPC   |       |    |             |     |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| et   |eq_ref|PRIMARY    |PRIMARY| 15 |tt.ActualPC  |  1  |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| et_1 |eq_ref|PRIMARY    |PRIMARY| 15 |tt.AssignedPC|  1  |       |
+------+------+-----------+-------+----+-------------+-----+-------+
| do   |eq_ref|PRIMARY    |PRIMARY| 15 |tt.ClientID  |  1  |       |
+------+------+-----------+-------+----+-------------+-----+-------+
Note that the rows column in the output from EXPLAIN is an ``educated 
guess'' from  the MySQL  join  optimizer; To  optimize a   query, you 
should check if the numbers are even close to the truth. If  not, you 
may get  better performance  by using  STRAIGHT_JOIN in   your SELECT 
statement and trying to list the  tables in a different order in  the 
FROM clause.
7.22 DESCRIBE syntax (Get information about columns)
{DESCRIBE | DESC} tbl_name {col_name | wild}
DESCRIBE provides information about  a table's columns. col_name  may 
be a column name or a string containing the SQL `%' and  `_' wildcard 
characters.
 If the column types are different  than you expect them to be  based 
on a CREATE TABLE statement, note that MySQL sometimes changes column 
types. See section 7.6.1 Silent column specification changes.
 This statement is provided for Oracle compatibility.
The SHOW statement provides similar information. See section
7.20 SHOW syntax (Get information about table, columns,...)
7.23 LOCK TABLES/UNLOCK TABLES syntax
LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
 LOCK TABLES  locks  tables for  the  current thread.  UNLOCK  TABLES 
releases any locks held  by the current  thread. All tables that  are 
locked by  the current  thread are  automatically unlocked   when the 
thread issues  another LOCK  TABLES, or  when the  connection to  the 
server is closed.
 If a thread obtains  a READ lock  on a table,  that thread (and  all 
other threads) can only  read from the table.  If a thread obtains  a 
WRITE lock on a table, then only the thread holding the lock can READ 
from or WRITE to the table. Other threads are blocked.
 Each thread  waits (without  timing out)  until it  obtains all  the 
locks it has requested.
 WRITE locks normally have higher priority than READ locks, to ensure 
that updates are processed  as soon as  possible. This means that  if 
one thread obtains  a READ lock  and then  another thread requests  a 
WRITE lock, subsequent READ lock  requests will wait until the  WRITE 
thread has gotten the lock and released it. You can  use LOW_PRIORITY 
WRITE locks to  allow other threads  to obtain  READ locks while  the 
thread  is  waiting   for the   WRITE  lock.   You should   only  use 
LOW_PRIORITY WRITE locks if you  are sure that there will  eventually 
be a time when no threads will have a READ lock.
 When you use  LOCK TABLES,  you must lock  all tables  that you  are 
going to use!  If you are  using a  table multiple times  in a  query 
(with aliases),  you must  get a  lock for  each  alias! This  policy 
ensures that table locking is deadlock free.
 Note that you  should NOT lock  any tables that  you are using  with 
INSERT DELAYED. This is because that in this case the INSERT  is done 
by a separate thread.
 Normally, you  don't  have to   lock tables, as   all single  UPDATE 
statements are atomic; no other  thread can interfere with any  other 
currently executing SQL  statement. There  are a few  cases when  you 
would like to lock tables anyway:
        If you  are going  to run  many operations  on  a bunch  of 
        tables, it's much faster to lock the tables you are  going to 
        use. The downside  is, of  course, that no  other thread  can 
        update a READ-locked  table and  no other thread  can read  a 
        WRITE-locked table.
        MySQL doesn't  support a  transaction environment,   so you 
        must use LOCK  TABLES if  you want  to ensure  that no  other 
        thread comes  between a  SELECT and  an UPDATE.   The example 
        shown below requires LOCK TABLES in order to execute safely:
        mysql> LOCK TABLES trans READ, customer WRITE;
        mysql>  select  sum(value)   from trans   where  customer_id=   
                some_id;
        mysql> update customer set total_value
                =sum_from_previous_statement
           where customer_id=some_id;
        mysql> UNLOCK TABLES;
        Without LOCK TABLES,  there is a  chance that another  thread 
        might insert a new row  in the trans table between  execution 
        of the SELECT and UPDATE statements.
 By    using    incremental     updates    (UPDATE    customer    SET 
value=value+new_value) or   the LAST_INSERT_ID()  function,  you  can 
avoid using LOCK TABLES in many cases.
 You can also solve some cases by using the user-level lock functions 
GET_LOCK() and RELEASE_LOCK(). These locks are saved in a  hash table 
in  the   server  and   implemented  with   pthread_mutex_lock()  and 
pthread_mutex_unlock() for high speed. See section 7.3.12 
Miscellaneous functions.
 See section 10,11  How MySQL  locks table, for  more information  on 
locking policy.
7.24 SET OPTION syntax
SET [OPTION] SQL_VALUE_OPTION= value, ...
 SET OPTION sets  various options  that affect the  operation of  the 
server or your client. Any option you set remains in effect until the 
current session ends,  or until  you set  the option  to a  different 
value.
CHARACTER SET character_set_name | DEFAULT
 This maps all strings from and to the client with the given mapping. 
Currently the only option for character_set_name is  cp1251_koi8, but 
you can easily add new mappings by editing the  `sql/convert.cc' file 
in the MySQL source distribution. The default mapping can be restored 
by using a character_set_name value of DEFAULT. Note that  the syntax 
for setting  the CHARACTER  SET option  differs from  the syntax  for 
setting the other options.
PASSWORD = PASSWORD('some password')
 Set the password for  the current user.  Any non-anonymous user  can 
change his own password!
PASSWORD FOR user = PASSWORD('some password')
 Set the password  for a specific  user on  the current server  host. 
Only a user with access to the  mysql database can do this. The  user 
should be given in user@hostname format, where user and  hostname are 
exactly as  they are  listed in   the User and  Host columns   of the 
mysql.user table entry. For  example, if you  had an entry with  User 
and Host fields of 'bob' and '%.loc.gov', you would write:
mysql> SET PASSWORD FOR bob@"%.loc.gov" = PASSWORD("newpass");
SQL_BIG_TABLES = 0 | 1
 If set to 1, all temporary tables are stored on disk rather  than in 
memory. This will be a little slower, but you will not get  the error 
The table tbl_name is full for  big SELECT operations that require  a 
large temporary table. The  default value for  a new connection is  0 
(i.e., use in-memory temporary tables).
SQL_BIG_SELECTS = 0 | 1
 If set to 1, MySQL will abort if a SELECT is attempted that probably 
will take a very long time. This is useful when an  inadvisable WHERE 
statement has been issued.  A big query is  defined as a SELECT  that 
probably will  have  to examine  more  than max_join_size  rows.  The 
default value for a new connection is 0 (which will allow  all SELECT 
statements).
SQL_LOW_PRIORITY_UPDATES = 0 | 1
 If set to  1, all INSERT,  UPDATE and  DELETE statements wait  until 
there is no pending SELECT on the affected table.
SQL_SELECT_LIMIT = value | DEFAULT
 The maximum number of records to return from SELECT statements. If a 
SELECT has a LIMIT clause, the LIMIT takes precedence over  the value 
of SQL_SELECT_LIMIT.   The default  value for   a new  connection  is 
``unlimited''. If you have changed  the limit, the default value  can 
be restored by using a SQL_SELECT_LIMIT value of DEFAULT.
SQL_LOG_OFF = 0 | 1
 If set to 1, no  logging will be done  to the standard log for  this 
client, if the client has the process privilege. This does not affect 
the update log!
SQL_LOG_UPDATE = 0 | 1
 If set to  0, no  logging will  be done to  the update  log for  the 
client, if the client has the process privilege. This does not affect 
the standard log!
TIMESTAMP = timestamp_value | DEFAULT
 Set the  time for  this client.  This is  used to  get the  original 
timestamp if you use the update log to restore rows.
LAST_INSERT_ID = #
 Set the value to be  returned from LAST_INSERT_ID(). This is  stored 
in the update  log when you  use LAST_INSERT_ID()  in a command  that 
updates a table.
INSERT_ID = #
 Set the  value to   be used by   the following INSERT  command  when 
inserting an  AUTO_INCREMENT  value. This  is  mainly used  with  the 
update log.
7.25 GRANT and REVOKE syntax
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    TO user_name [IDENTIFIED BY 'password']
        [, user_name [IDENTIFIED BY 'password'] ...]
    [WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    FROM user_name [, user_name ...]
 GRANT is implemented in  MySQL 3.22.11 or  later. For earlier  MySQL 
versions, the GRANT statement does nothing.
 The GRANT and REVOKE commands  allow system administrators to  grant 
and revoke rights to MySQL users at four privilege levels:
Global level
 Global privileges apply to  all databases on  a given server.  These 
privileges are stored in the mysql.user table.
Database level
 Database privileges apply to all  tables in a given database.  These 
privileges are stored in the mysql.db and mysql.host tables.
Table level
 Table privileges  apply  to all   columns in a   given table.  These 
privileges are stored in the mysql.tables_priv table.
Column level
 Column privileges apply to  single columns in  a given table.  These 
privileges are stored in the mysql.columns_priv table.
For examples of how GRANT works, see section 6.11 Adding new user 
privileges to MySQL.
 For the GRANT and REVOKE  statements, priv_type may be specified  as 
any of the following:
ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE
 ALL  is  a  synonym  for  ALL  PRIVILEGES.  REFERENCES  is  not  yet 
implemented. USAGE is currently a  synonym for ``no privileges''.  It 
can be used when you want to create a user that has no privileges.
To revoke the grant privilege from  a user, use a priv_type value  of 
GRANT OPTION:
REVOKE GRANT OPTION ON ... FROM ...;
The only priv_type  values you can  specify for  a table are  SELECT, 
INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX and ALTER.
The only priv_type values you can specify for a column (that is, when 
you use a column_list clause) are SELECT, INSERT and UPDATE.
 You can set global  privileges by using ON  *.* syntax. You can  set 
database privileges by using ON db_name.* syntax. If you specify ON * 
and you have a current database, you will set the privileges for that 
database. (Warning: If you specify ON * and you{{
}} 
don't{{
}} 
h
a
v
e   a  current  database,  you  will affect the global privileges!)
 In order  to accommodate  granting rights  to users   from arbitrary 
hosts, MySQL  supports specifying  the user_name  value in   the form 
user@host. If you want  to specify a  user string containing  special 
characters (such   as `-'),   or a  host  string  containing  special 
characters or wildcard characters  (such as `%'),  you can quote  the 
user or host name (e.g., 'test-user'@'test-hostname').
 You   can  specify   wildcards   in  the   hostname.  For   example, 
user@"%.loc.gov" applies to user for any host in the  loc.gov domain, 
and  user@"144.155.166.%"  applies  to  user  for  any  host  in  the 
144.155.166 class C subnet.
 The simple form user is a  synonym for user@"%". Note: If you  allow 
anonymous users   to connect   to the  MySQL  server  (which  is  the 
default), you  should  also add  all  local users  as  user@localhost 
because otherwise the anonymous user entry for the local host  in the 
mysql.user table will  be used when  the user tries  to log into  the 
MySQL server from the local  machine! Anonymous users are defined  by 
inserting entries with  User='' into  the mysql.user  table. You  can 
verify if this applies to you by executing this query:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
 For the moment, GRANT only supports host, table, database and column 
names up   to 60  characters long.   A user  name can   be up  to  16 
characters.
 The privileges for a table or column are formed from the  logical OR 
of the privileges at each of the four privilege levels.  For example, 
if the mysql.user  table specifies that  a user  has a global  select 
privilege, this can't be denied by an entry at the database, table or 
column level.
 The privileges for a column can be calculated as follows:
global privileges
        OR (database privileges AND host privileges)
        OR table privileges
        OR column privileges
 In most  cases, you  grant  rights to  a user   at only one  of  the 
privilege levels, so life isn't normally as complicated as  above. :) 
The details  of the   privilege-checking procedure are  presented  in 
section 6 The MySQL access privilege system.
 If you grant  privileges for a  user/hostname combination that  does 
not exist in  the mysql.user  table, an  entry is  added and  remains 
there until deleted with a DELETE command. In other words,  GRANT may 
create user table entries, but REVOKE will not remove them;  you must 
do that explicitly using DELETE.
 In MySQL 3.22.12 or later, if a  new user is created or if you  have 
global grant  privileges, the  user's  password will  be set   to the 
password specified by the IDENTIFIED BY  clause, if one is given.  If 
the user already had a password, it is replaced by the new one.
 Warning: If you create a new  user but do not specify an  IDENTIFIED 
BY clause, the user has no password. This is insecure.
 Passwords can also be set with the SET PASSWORD command. See section 
7.24 SET OPTION syntax.
 If you grant  privileges for a  database, an  entry in the  mysql.db 
table is created if needed. When all privileges for the database have 
been removed with REVOKE, this entry is deleted.
 If a user doesn't have any privileges  on a table, the table is  not 
displayed when the user requests a list of tables (e.g., with  a SHOW 
TABLES statement).
 The WITH GRANT OPTION clause gives  the user the ability to give  to 
other users any privileges  the user has  at the specified  privilege 
level. You should be careful to whom you give the grant privilege, as 
two users with different privileges may be able to join privileges!
 You cannot grant another user  a privilege you don't have  yourself; 
the grant privilege allows you to give away only those privileges you 
possess.
 Be aware  that  when you  grant  a user  the  grant privilege  at  a 
particular privilege level, any privileges the user already possesses 
(or is given in the future!) at that level are also grantable by that 
user. Suppose you grant a user the insert privilege on a database. If 
you then grant the select privilege on the database and  specify WITH 
GRANT OPTION, the user can give  away not only the select  privilege, 
but also insert. If you then  grant the update privilege to the  user 
on the  database, the   user can give   away the insert,  select  and 
update.
 You should not grant  alter privileges to a  normal user. If you  do 
that, the user can  try to subvert  the privilege system by  renaming 
tables!
 Note that if you are using  table or column privileges for even  one 
user, the server examines table  and column privileges for all  users 
and this will slow down MySQL a bit.
 When mysqld starts, all privileges  are read into memory.  Database, 
table and   column privileges  take effect   at once  and  user-level 
privileges take effect the next time the user connects. Modifications 
to the  grant tables   that you perform   using GRANT or  REVOKE  are 
noticed by the  server immediately.  If you modify  the grant  tables 
manually (using INSERT,  UPDATE, etc.),  you should  execute a  FLUSH 
PRIVILEGES statement or run  mysqladmin flush-privileges to tell  the 
server to reload  the grant  tables. See section  6.9 When  privilege 
changes take effect.
The biggest differences between  the ANSI SQL  and MySQL versions  of 
GRANT are:
        ANSI SQL doesn't have  global or database-level  privileges 
        and ANSI SQL doesn't support  all privilege types that  MySQL 
        supports.
        When you drop a table in  ANSI SQL, all privileges for  the 
        table are revoked. If you revoke a privilege in ANSI SQL, all 
        privileges that were granted based on this privilege are also 
        revoked. In   MySQL, privileges   can be  dropped  only  with   
        explicit REVOKE commands or  by manipulating the MySQL  grant 
        tables.
7.26 CREATE INDEX syntax
CREATE [UNIQUE] INDEX index_name ON tbl_name  (col_name[(length]),... 
)
 The CREATE INDEX  statement doesn't  do anything in  MySQL prior  to 
version 3.22. In 3.22  or later, CREATE INDEX  is mapped to an  ALTER 
TABLE statement   to create  indexes. See   section 7.7  ALTER  TABLE 
syntax.
 Normally, you create all  indexes on a table  at the time the  table 
itself is created with CREATE TABLE. See section  7.6 CREATE TABLE 
syn. CREATE INDEX allows you to add indexes to existing tables.
 A column list of the form (col1,col2,...) creates  a multiple-column 
index. Index values  are formed  by concatenating the  values of  the 
given columns.
 For CHAR and VARCHAR columns, indexes  can be created that use  only 
part of a column,  using col_name(length) syntax.  (On BLOB and  TEXT 
columns the length is required). The statement shown below creates an 
index using the first 10 characters of the name column:
mysql> CREATE INDEX part_of_name ON customer (name(10));
 Since most names  usually differ  in the first  10 characters,  this 
index should not be much slower than an index created from the entire 
name column. Also,  using partial  columns for indexes  can make  the 
index file much  smaller, which could  save a lot  of disk space  and 
might also speed up INSERT operations!
 Note that you can only  add a index on  a column that can have  NULL 
values or  on a  BLOB/TEXT column  if you  are  useing MySQL  version 
3.23.2 or newer and are using the MyISAM table type.
 For more information about how MySQL uses indexes, see section
10.4 How MySQL uses inde.
7.27 DROP INDEX syntax
DROP INDEX index_name
DROP INDEX doesn't  do anything in  MySQL prior  to version 3.22.  In 
3.22 or later, DROP  INDEX is mapped to  an ALTER TABLE statement  to 
drop the index. See section  7.7 ALTER TABLE syntax.
7.28 Comment syntax
The MySQL server supports the # to end of line, -- to end of line and 
/* in-line or multiple-line */ comment styles:
mysql> select 1+1;     # This comment continues to the end of line
mysql> select 1+1;     -- This comment continues to the end of line 
mysql> select 1 /* this is an in-line comment */ + 1;
mysql> select 1+
/*
this is a
multiple-line comment
*/
1;
Note that the  -- comment  style requires you  to have  at least  one 
space after the --!
Although the server  understands the comment  syntax just  described, 
there are some limitations on the way that the mysql client parses /* 
... */ comments:
        Single-quote  and  double-quote  characters  are  taken  to 
        indicate the  beginning of  a quoted  string, even   within a 
        comment. If the quote is not matched by a second quote within 
        the comment,   the parser  doesn't realize   the comment  has 
        ended. If you are running  mysql interactively, you can  tell 
        that it  has gotten  confused like  this because   the prompt 
        changes from mysql> to '> or ">.
        A semicolon is taken to indicate the end of the current SQL 
        statement and anything following it to indicate the beginning 
        of the next statement.
 These limitations apply  both when you  run mysql interactively  and 
when you put commands in a file and tell mysql to read its input from 
that file with mysql < some-file.
 MySQL doesn't support the `--' ANSI SQL comment style. See section
5.3.7 '--' as the start of a cc..
7.29 CREATE FUNCTION/DROP FUNCTION syntax
CREATE FUNCTION function_name RETURNS {STRING|REAL|INTEGER}
       SONAME shared_library_name
DROP FUNCTION function_name
 A user-definable function (UDF) is a way to extend MySQL with  a new 
function that works like  native (built in)  MySQL functions such  as 
ABS() and CONCAT().
 CREATE FUNCTION saves the function's  name, type and shared  library 
name in the  mysql.func system table.  You must  have the insert  and 
delete  privileges  for  the   mysql database   to create   and  drop 
functions.
 All active  functions  are reloaded  each  time the  server  starts, 
unless you start mysqld with the --skip-grant-tables option.  In this 
case, UDF initialization  is skipped  and UDFs  are unavailable.  (An 
active function is one that has been loaded with CREATE  FUNCTION and 
not removed with DROP FUNCTION.)
 For instructions on writing user-definable functions, see sectio 
14 Adding new funtion to My. For the UDF mechanism to work, functions 
must be written in C or C++ and your operating system must support 
dynamic loading.
7.30 Is MySQL picky about reserved words?
 A common problem  stems from trying  to create  a table with  column 
names that use the names of datatypes or functions built  into MySQL, 
such as TIMESTAMP or GROUP. You're allowed to do it (for example, ABS 
is an allowed column name), but  whitespace is not allowed between  a 
function name and the `(' when  using functions whose names are  also 
column names.
 The following words are explicitly  reserved in MySQL. Most of  them 
are forbidden   by ANSI  SQL92  as column   and/or table  names  (for 
example, group). A few are reserved  because MySQL needs them and  is 
(currently) using a yacc parser:
+-----------------+--------------+---------------+---------------+
|  action         |  add         |  all          |  alter        |
+-----------------+--------------+---------------+---------------+
|  after          |  and         |  as           |  asc          |
+-----------------+--------------+---------------+---------------+
|  auto_increment |  between     |  bigint       |  bit          |
+-----------------+--------------+---------------+---------------+
|  binary         |  blob        |  bool         |  both         |
+-----------------+--------------+---------------+---------------+
|  by             |  cascade     |  char         |  character    |
+-----------------+--------------+---------------+---------------+
|  change         |  check       |  column       |  columns      |
+-----------------+--------------+---------------+---------------+
|  constraint     |  create      |  cross        |  current_date |
+-----------------+--------------+---------------+---------------+
|  current_time   |  current     |  data         |  database     |
|                 |  _timestamp  |               |               |
+-----------------+--------------+---------------+---------------+
|  databases      |  date        |  datetime     |  day          |
+-----------------+--------------+---------------+---------------+
|  day_hour       |  day_minute  |  day_second   |  dayofmonth   |
+-----------------+--------------+---------------+---------------+
|  dayofweek      |  dayofyear   |  dec          |  decimal      |
+-----------------+--------------+---------------+---------------+
|  default        |  delete      |  desc         |  describe     |
+-----------------+--------------+---------------+---------------+
|  distinct       |  distinctrow |  double       |  drop         |
+-----------------+--------------+---------------+---------------+
|  escaped        |  enclosed    |  enum         |  explain      |
+-----------------+--------------+---------------+---------------+
|  exists         |  fields      |  first        |  float        |
+-----------------+--------------+---------------+---------------+
|  float4         |  float8      |  foreign      |  from         |
+-----------------+--------------+---------------+---------------+
|  for            |  full        |  function     |  grant        |
+-----------------+--------------+---------------+---------------+
|  group          |  having      |  hour         |  hour_minute  |
+-----------------+--------------+---------------+---------------+
|  hour_second    |  ignore      |  in           |  index        |
+-----------------+--------------+---------------+---------------+
|  infile         |  insert      |  int          |  integer      |
+-----------------+--------------+---------------+---------------+
|  interval       |  int1        |  int2         |  int3         |
+-----------------+--------------+---------------+---------------+
|  int4           |  int8        |  into         |  if           |
+-----------------+--------------+---------------+---------------+
|  is             |  join        |  key          |  keys         |
+-----------------+--------------+---------------+---------------+
|  last_insert_id |  leading     |  left         |  like         |
+-----------------+--------------+---------------+---------------+
|  lines          |  limit       |  load         |  lock         |
+-----------------+--------------+---------------+---------------+
|  long           |  longblob    |  longtext     |  low_priority |
+-----------------+--------------+---------------+---------------+
|  match          |  mediumblob  |  mediumtext   |  mediumint    |
+-----------------+--------------+---------------+---------------+
|  middleint      |  minute      |  minute_second|  month        |
+-----------------+--------------+---------------+---------------+
|  monthname      |  natural     |  numeric      |  no           |
+-----------------+--------------+---------------+---------------+
|  not            |  null        |  on           |  option       |
+-----------------+--------------+---------------+---------------+
|  optionally     |  or          |  order        |  outer        |
+-----------------+--------------+---------------+---------------+
|  outfile        |  partial     |  password     |  precision    |
+-----------------+--------------+---------------+---------------+
|  primary        |  procedure   |  processlist  |  privileges   |
+-----------------+--------------+---------------+---------------+
|  quarter        |  read        |  real         |  references   |
+-----------------+--------------+---------------+---------------+
|  rename         |  regexp      |  reverse      |  repeat       |
+-----------------+--------------+---------------+---------------+
|  replace        |  restrict    |  returns      |  rlike        |
+-----------------+--------------+---------------+---------------+
|  second         |  select      |  set          |  show         |
+-----------------+--------------+---------------+---------------+
|  smallint       |  soname      |  sql_big_     |  sql_big_     |
+-----------------+--------------+---------------+---------------+
|                 |              |  tables       |  selects      |
+-----------------+--------------+---------------+---------------+
|  sql_select_    |  sql_low_    |  sql_log_off  |  sql_log_     |
|  limit          |  priority_   |               |  update       |
|                 |  updates     |               |               |
+-----------------+--------------+---------------+---------------+
|  straight_join  |  starting    |  status       |  string       |
+-----------------+--------------+---------------+---------------+
|  table          |  tables      |  terminated   |  text         |
+-----------------+--------------+---------------+---------------+
|  time           |  timestamp   |  tinyblob     |  tinytext     |
+-----------------+--------------+---------------+---------------+
|  tinyint        |  trailing    |  to           |  use          |
+-----------------+--------------+---------------+---------------+
|  using          |  unique      |  unlock       |  unsigned     |
+-----------------+--------------+---------------+---------------+
|  update         |  usage       |  values       |  varchar      |
+-----------------+--------------+---------------+---------------+
|  variables      |  varying     |  varbinary    |  with         |
+-----------------+--------------+---------------+---------------+
|  write          |  where       |  year         |  year_month   |
+-----------------+--------------+---------------+---------------+
|  zerofill       |              |               |               |
+-----------------+--------------+---------------+---------------+
 The following symbols (from the table above) are disallowed  by ANSI 
SQL but allowed by MySQL as column/table names. This is  because some 
of these  names are  very natural   names and a  lot of   people have 
already used them.
        ACTION
        BIT
        DATE
        ENUM
        NO
        TEXT
        TIME
        TIMESTAMP
8 MySQL Tutorial
mysql̶ Ŭ̾Ʈ α ̿Ͽ MySQL    . 
mysql  ͺ̽    ְ   ִ α
 '̳ 'Ȥ  '' Ѵ.
mysql ȭ αμ  ϰ,  ϰ,  
 ȭ鿡 ִ  Ѵ. mysql ġ (batch  mode) 
  ִ: 
̸ Ͽ sql ɹ ־ΰ mysql    ϶ 
ϸ ȴ(ڿ ˾   'mysql -vvv < batch_test.txt'   
ϸ ȴ).
mysql ɼǵ  --help ɼ ٿ ϸ ȴ:
shell> mysql --help
 Ʃ丮 mysql ġǾ    ִ MySQL  
ִٴ  Ѵ.   MySQL ڿ  ϶(
 ڶMySQL   ٸ κ 캼 ʿ䰡  ̴).
 Ʃ丮 ͺ̽ ϰ  ϴ    ٷ
. ̹ ϴ ͺ̽ ϴ Ϳ  ִٸ  
̽  ȿ  ̺       dzʶ 
.
Ʃ丮  ̶ ڼ   ʴ´.    
  ڼ ˰ Ͱŵ MySQL  Ŵ ȴ.
shell>  Ʈ, mysql> MySQL Ʈ Ÿ.
1.  ϱ/
 Ϸ mysql    MySQL  ̸  밳 
 н带  ־  ̴.   α ǻͰ 
 Ϳ ȴٸ ȣƮ ̸   ʿ䰡  ̴(ȣƮ 
,  ̸, н).   ˾Ҵٸ ó    
:
shell> mysql -h host -u user -p
Enter password: ********
******* κ н. 'Enter password' Ʈ ̸  н
带 ָ ȴ. ϸ  Ұ    'mysql>' 
Ʈ    ̴.
shell> mysql -h host -u user -p
Enter password: ********
 Welcome to the MySQL monitor. Commands end with ; or \g.
 Your MySQL connection id is 459 to server version: 3.22.20a-log
Type 'help' for help.
mysql>
'mysql>' Ʈ ǹϴ ٴ غǾ ɾ Է϶ 
̴.
 ġϴ   MySQL  ȣƮ(LOCAL  host) 
  " (anonymous user)"   ְ Ѵ. ̷ 
쿡 ܼ 
shell> mysql 
ó ؼ   ִ. Ͽٸ 'mysql>'  Ʈ
   'QUIT'̶ ļ    ִ:
mysql> QUIT
Bye
CtrlŰ D Ű ÿ     ִ.
̾   κ     ¶   
Ѵ. 'mysql>' Ʈ   ¶  Ÿ.
2.  ϱ(Entering Queries)
  Ͽ   ӵ  Ȯ. ̷  Ѵٰ 
۾ ͺ̽  ͵ ϴ  ƴ ¶  
 Ѵ.  Ȳ  ͺ̽ȿ ̺ ,  ̺ 
ڷḦ ø, ̺  ڷḦ   ͺٴ ϴ  ణ
̶    ߿ϴ. ̹  ɾ Է ⺻ Ģ 
    ˾ .     mysql ϴ 
ͼ  ̴.
Ʒ MySQL   ¥ ϴ ɾ  δ. 'mysql>' 
Ʈ    .  Ű ģ.
mysql> SELECT version(), current_date;
+-----------+-------------+
|     version()     |     current_date      |
+-----------+-------------+
|   3.22.20a-log   |    1999-03-19      |
+-----------+-------------+
1 row in set (0.01 sec)
mysql>
 κ mysql   ͵   ִ:
  SQL   ڿ ݷ(;) ̷ (ݷ 
ʿ ܰ ֱϴ. QUIT   ϳ. ߿ ̰Ϳ   
 ϰڴ).
   , mysql       ǰ 
ϰ,   ְ ٽ    Ʈ('mysqld>') 
.
 mysql ̺ (  ̷)  ش. ù 
   Ѷ  ִ.   °  ʹ    
. ,     ̽ ̺    ̸
.   ó ̺  ƴ ǥ(expression)   
   ǥ ȴ.
 mysql     ð(뷫    ) 
 ش.    ð Ȯ   ƴϴ. ֳϸ   ð 
wall clock time(CPU ð ƴϴ)̶  Ͱ     Ʈũ 
Ͽ  ð  ޱ ̴(    
 κ Ÿ ʰڴ).
Ű('' մϴ. ̸  ̶     
 ̸Դϴ) 빮ڷ ϴ, ҹڷ ϴ . Ʒ    
  ϴ:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> SELECT version(), current_date;
mysql> seLect vErSiOn(), current_DATE;
ٸ  ϳ   .
 mysql    ̴:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------------+
| SIN(PI()/4) | (4+1)*5) |
+-------------+----------+
|  0.707107   |    25    |
+-------------+----------+
ݱ  ɾ  ªҰ,   ¥. ٿ   
  ִ.   ݷ ⸸ ϸ ȴ:
mysql> SELECT version(); SELECT now();
+---------------+
| version()     |
+---------------+
| 3.22.20a -log |
+---------------+
+---------------------+
| now()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
ɾ ٿ   ؾ߸ ϴ  ƴϴ.      
ٿ ı  ִ. mysql ݷ      
  аѴ(mysql    Է   δ: Է 
  ݷ   Ѵ).
      :
mysql> SELECT     -> user()     -> ,     -> current_date;
+--------------------+--------------+
| user()             | current_date |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+
 Է  ù Էϰ Ű   Ʈ 'mysql>'
 '->' ٲ  ָ϶. ̰    ϼ ʾ
,  
 Է ٸٶ mysql  п ˸ ̴.  Ʈ 
 
ģ ȳڴ.   п ˷ ش.  Ʈ ˷
 ͵   mysql  ٸ  ִ     
.ɾ Է  Ϸ \c ָ ȴ:
mysql> SELECT     -> user()     -> \cmysql>
Ʈ ȭ  . \c  ģ 'mysql>' ٲ.   ɾ 
Ƶ غ Ǿٴ  ˸ ̴.
 ǥ ġ  Ʈ  ǹ̸  ̴.
+------------+------------------------------------------------------+
|  Ʈ  |  ǹ                                                |  
+------------+------------------------------------------------------+
|  mysql>    |      غ Ǿ.                  |  
+------------+------------------------------------------------------+
|  ->        |  ɾ  ٿ     ٸ     |  
|            |   ǹ.                                        |  
+------------+------------------------------------------------------+
|  '>        |   Է Ÿ.  ' ϴ ڿ  |  
|            |  ϴ ̶  Ÿ. (ڿ Է       |  
|            |   ڿ  Է   ' ٿ  )     |  
+------------+------------------------------------------------------+
|  ">        |  '> .  ̴ ڿ ' ƴ϶ "      |  
|            |  θٴ ̴.                                    |  
+------------+------------------------------------------------------+
ݷ ̴  ؾ 쿬  Ȥ Ǽ  ٿ  ġ 
 Է   ִ.     mysql Է   ٸ
:
mysql> SELECT user()
    ->
̷  mysql ݷ ٸ ִ ̴(   
   Էߴٰ  mysql   ʴ. ݷ  
 ̴). Ʈ ٲ  ġ ä Ѵٸ  
   ð    ִ. ݷ  ־   
ϼϸ     ̴:
mysql> SELECT user()
    -> ;
+--------------------+
| user()             |
+--------------------+
| joesmith@localhost |
+--------------------+
'> "> ڿ  ߿ Ÿ Ʈ̴.  MySQL 
ڵ  '  "  ѷθ ڿ ȴ(  'hello', "goodbye"
̴).   ٿ  ڿ Է  ִ.'>   "> 
Ʈ Ÿ ̰ ' " ϴ ڿ ϴ ɾ  
־ ݴ '  "      ʾҴٴ  ǹϴ  ̴. 
 ٿ  ڿ Է  .  ڿ  
 Էϰ  ϴ 찡  ɱ? ״  ʴ. κ 
, '>  "> Ʈ ݴ '   "  Ծٰ ˷ִ ǹ 
̴.    :
mysql> SELECT  * FROM  my_table WHERE  name =  "Smith And  age <  30;       
">
  SELECT  Էϰ Ű ġ  ٸص ƹ 
    ̴. " ƹ    ϱ?" ̻ϰ 
  "> Ʈ ³ ǹ̸  .  ڿ 
 ο ȣ Ծٴ   ˸ ִ.     ߸ 
ִ. "Smith  "  ̴.
,  ؾ ұ?
    ϴ ̴.    \c ĥ 
. ֳϸ \c " Էϱ   ڿ Ϻη    
̱ ̴.  "\c Էϸ ȴ:
mysql> SELECT  * FROM  my_table WHERE  name =  "Smith AND  age <  30;       
"> "\cmysql>
Ʈ mysql> ǵ .  ̰ " ɾ   غ 
" ̴. 
'> "> ǹϴ ٸ ϴ  ߿ϴ. ߸Ͽ ݴ ο 
ȣ Ծ   Էϴ ͵  õǴ ϰ  ̱ 
̴(QUIT Եȴ).   ϱ  ݴ  ο
ȣ  Ѵٴ  ̰ ſ ȥ  ̴.
3.  ̽  ϱ
ɾ Է  ˾  ̽      
.
 ֿϵ Űٰ  .
ֿϵ  ؼ    ΰ ϰ  ̴. 
 ̽   ȿ ̺   ϴ  
־θ ȴ.  ϸ ̺ ڷḦ ͼ ֿϵ   
    ˾   ִ.    ̷ ͵
Ͽ     ٷ :
  ̽ 
 ̺ 
 ̺ ڷ ֱ
 ̺ ڷ  
  ̺ ϱ 
  ̽  ̸   menagerie(''̶ ̴)   . 
menagerie  ̽ ſ ϳ  Ȱ   
̽ ϴ°찡 ִ.     ϴ   
̽  ϴ γ ֿϵ ġ   ܵξ ϴ 
ǻ翡  Ǿ   ִ.
SHOW  Ͽ       ̽     
ִ:
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+
   ٸ  ִ.  mysql, test ͺ̽  
   ̴. mysql ͺ̽       
ִ ߿ ͺ̴̽. test  ״ ϱ   ִ 
ͺ̽. test ͺ̽ ִٸ  ó ؼ    
:
mysql> USE test
Database changed
QUITó USE  ݷ ʿ ʴٴ  (ݷ
  . ׳ ϰ   ݷ  ٰ 
 δ ͵ ). USE    ٿ ؾ Ѵٴ ͵ ݵ
 . test ͺ̽    ̰   
.   ͺ̽( 쿣 test)    ִ 
  ̶     ڷ ٸ   
  ϴ. ̰     ִٴ  ̴. 
 MySQL ڿ и ͺ̽    
ûؾ Ѵ. ⼭ menagerie . ڴ   ɹ
  ʿ䰡 ִ:
mysql> GRANT ALL ON menagerie.* TO your_mysql_name;
your_mysql_name    MySQL  ġؾ Ѵ.
3.1 ͺ̽  ϱ
ڰ     ͺ̽   ־ٸ װ 
׳ ϸ ȴ.    ó Ͽ ռ   
ָ ȴ:
mysql> CREATE DATABASE menagerie;
н ͺ̽ ̸ ҹڸ Ѵ(SQL Ű  
 ʴ).    ͺ̽ ̸    'menagerie'  ؾ 
Menagerie, MENAGERIE, meNaGerIE  ȵȴ. ̺ ̸ 
 ҹڸ Ѵ. ͺ̽ ٰ ϰڴٰ ˸ 
 ƴϴ.  ϰڴٰؾ Ѵ:
mysql> USE menagerie
Database changed
ͺ̽ ѹ      use   ̿Ͽ 
  ̽ ؾ Ѵ. 翬  ƴұ? ٸ 
δ mysql   ͺ̽ ̸  ־ ȴ:
shell> mysql -h host -u user -p menagerie
Enter password: ********
⼭ menagerie н ƴϴ. ȥ . н带  
  ٷ -p ڿ ٿ  ־ Ѵ(    Ȼ 
ٶ   ƴϴ. н尡 ڱ״ ȭ鿡 ̱ 
̴.   ʸӷ ִٸ   ΰ? н尡 ڱ
 ȭ鿡 ٴ   ϴ.     ڶ 
-p ڿ н带  ִ ""   ̴.  MySQL ڵ
  ̷ ?). н尡 ƴ϶  ͺ̸̴̽.
3.2 ̺ 
ͺ̽   .   Ŀ  ó
mysql> SHOW TABLES;
Empty set (0.00 sec)
ͺ̽  ִ. 翬ϴ.   µ  ִ  
  . SHOW TABLES;   õ ͺ̽ ִ  ̺ 
̴ ̴.  ߿ϰ ư    ͺ̽ 
  ΰ̴.  ̺ ʿϰ  ȿ   ڷ
 ־  ؾ Ѵ.
⼭   ֿ    ڵ带 ξ  ̴. 
pet ̶̺ ̸ .  ̺ ֿ  ̸, (
 ̸ ɰ̴), , ( )   Էϰ 
 ̴. ̴? ̵ ʿ   ð   ϴ  
̹Ƿ ̿     ־  ̴.   
 ؾ Ѵ. ̷ Ȳ ̸ ο ΰ ؾ Ѵٴ 
 ͺ̽     ƴұ Ѵ. ̴  ð 
 ϹǷ  صΰ   ¥ ̷κ  ϸ 
 ̴. MySQL   ƾ ϹǷ ̰ 
  ƴϴ. ̴   δ   ΰ 
 ִ:
 ٰ ֿ   ̸ ˷ִ Ͽ   ִ(
 ̶...   , ̰ ٸ    
 ִ. 
   ?   ī带  ϴ   
ʿ䰡  ?).
  ¥  ٸ ¥ ε ̸    ִ.  
    ֿ       ̴. 
   μ ٸ ͵鵵   ְ   
. ϴ.
CREATE TABLE  ̺  ڷ    ִ:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), 
    -> species VARCHAR(20), sex CHAR(2), birth DATE, death DATE);
CREATE TABLE  ̺ ̸  ְ ȣ ȿ  ̸  
 ڷ ¦ Ͽ ǥ Ͽ  ָ ȴ. 
name,  owner,  species,  sex,birth    ̸̸,  VARCHAR(20), 
CHAR(2), DATE ڷ̴. ڷ̶  ״ ڷ  ̴. 
 ڿ  ְ, ¥    ְ,  ϼ ִ. ǥ   
̺  :
pet TABLE
       1   2   3    4   5   6
̸  name owner species sex  birth death
 ڷḦ ԷϴĿ  ٸ  "밨"   
ó   ִ.
 name    owner   species  sex  birth     death
----------------------------------------------
밨   ȫ浿          1998-3-4   NULL
VARCHAR ̰ ϴ ڿ Ѵ. ̸, ,   ̰ 
  ڿ  ڷ     ̴.  VARCHAR 
 鿡 , ̴ ݵ    ʿ䵵  20   
ʿ䵵 . 1 255 ̸   ִ. ϰ   ָ
ȴ(߿ ALTER TABLE    ִ).  ̺  
 ͺ̽ ̺ Ͽ ߰Ǿ° Ȯ:
mysql> SHOW TABLES;
+--------------------+
|Tables in menagerie |
+--------------------+
| pet                |
+--------------------+
̺ Ѵ  Ȯϱ ؼ DESCRIBE  
:
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
| owner   | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
| species | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
| sex     | char(2)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
| birth   |  date       | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
| death   |  date       | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
Filed κа Type κ   ̸ ڷ Ȯ. DESCRIBE
    ִ. ̺   ̸   ڷ ؾ 
 ϸ ϴ.
3.3 ̺ ڷḦ ־ .
̺  Ŀ  ̺ ڷḦ  ־  Ѵ. LOAD  DATA Ȥ 
insert  ϸ ȴ.
ֿ  ڷᰡ  ٰ (MySQL YYYY-MM-DD   
¥ 䱸Ѵ).
name    owner   species sex     birth           death     
-----------------------------------------
Fluffy  Harold  cat     f       1993-02-04
Claws   Gwen    cat     m       1994-03-17
Buffy   Harold  dog     f       1989-05-13
Fang    Benny   dog     m       1990-08-27
Bowser  Dianne  dog     m       1998-08-31      1995-07-29
Chirpy  Gwen    bird    f       1998-09-11
Whistler        Gwen    bird            1997-12-09
Slim    Benny   snake   m       1996-04-29
  ̺ ϹǷ ̸  Ͽ     ڷḦ 
 ΰ Ͽ о ̺ ä  ̴.
pet.txt (̸ ƹ̵ )  ٿ ϳ  
ڵ带 ϸ ȴ.  ó:
# cat pet.txt
Fluffy  Harold  cat     f       1993-02-04
- -
  Ű ϳ ϸ CREATE TABLE     
  ؾ Ѵ. ص Ǵ (   ¥ ) 
ؼ NULL    ִ. ؽƮ Ͽ NULL  Ÿ 
ؼ \N ̶ ָ ȴ.   Whistler    
̴.
Whistler        Gwen    bird \N 1997-12-09 \N
pet.txt  εϱ ؼ ó LOAD DATA   Ѵ:
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  :
LOAD DATA LOCAL INFILE "̸" INTO TABLE ̸̺;
ѹ   ڵ带 ߰ϰ    ̴.  CREATE TABLE 
 Ͽ        ָ ȴ.   
´ ڷ ̴:
mysql> insert into pet
    ->  values('Puffball',  'Diane',  'hamster',  'f',  '1999-03-30', 
NULL);
ڿ  ¥  ǥ '  οϿ.    NULL 
Է  ִ(\N̶  ȵȴ). 
3.4 ̺κ  ˻ .
SELECT  ϸ ȴ. Ϲ   :
SELECT <˻> FROM <̺> WHERE <˻>
<˻>    ˸ ̴.    ǥ 
Ͽ      ǹϴ *   ִ. WHERE κ
    ִ. WHERE    ˻  ش. ˻ 
 ʴ  ˻ ܵȴ.
3.4.1   ˻.
  SELECT  ·  ó   ִ:
mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  |species  | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+
̷  SELECT ϴ   ̺ ü     
 ϴ.   ʱ   ġ ÷    ÷ 
Ȯ   ִ.    ,    ߸
  ִ:
Bower ڰ ں ʴ.  ڿ ¾?!
Ȯ  birth 1989-08-31 Ǿ  ˼ ־ٰ  ϸ ̸ 
 ĥ?
ΰ    ִ:
  pet.txt Ͽ Ѵ. ̺  pet.txt ٽ 
о δ:
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL infile "pet.txt" into TABLE pet;
 ̷ ϸ  3.3   insert ̿Ͽ  Է 
Puffballؼ ٽ Էؾ Ѵ.
 ϰ ٶ ?
 ߸  Ѵ. UPDATE  Ѵ:
mysql> UPDATE pet SET birth="1989-08-31" WHERE name="Bowser";
   ֵ, ü ̺    .     
̷  ʴ´. ̺ ũⰡ Ŀ   ΰ?   
 ˻       ΰ?   Ư  
ϴ ڷ鸸 ̾Ƽ   ̴.
3.4.2 ־ ǿ ´ Ư ุ ˻ .
 ̺ Ư 鸸 ̾Ƴ   ִ.    Bower 
  ٲ  Ȯϱ  Bower ڵ常 ̾Ƴ  
:
mysql> SELECT * FROM pet WHERE name = "Bower";
+--------+-------+---------+-----+------------+------------+
| name   | owner | species | sex | birth      | death      |
+--------+-------+---------+-----+------------+------------+
| Bowser | Diane | dog     | m   | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+-----+------------+------------+
birth   1998  ƴ 1989 ùٸ   Ȯ 
 ִ.
ڿ  ҹڸ ϴ  .  "bowser",  "BOWSER" 
  ڿ ǹѴ( "Bowser" ߴ). 
ؼ   ټ  ִ.   1998 Ŀ ¾  
 ˰ ʹٸ birth   ˻ϸ ȴ:
mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"
+----------+-------+---------+-----+------------+------+
| name     | owner | species | sex | birth      |death |
+----------+-------+---------+-----+------------+------+
| Chirp y  | Gwen  | bird    | f   | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f   | 1999-03-30 | NULL |
+----------+-------+---------+-----+------------+------+
    ִ:
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+----------+--------+---------+-----+------------+-------+
| name     | owner  | species | sex | birth      | death |
+----------+--------+---------+-----+------------+-------+
| Buffy    | Harold | dog     | f   | 1989-05-13 | NULL  |
+----------+--------+---------+-----+------------+-------+
  ̸鼭   ˻ϴ ̴.   AND  
Ͽ OR   ִ:
mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+
AND OR    ִ. ̷     ǵ
 ȣ   :
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
    -> OR (species = "dog" AND sex = "f");
+-------+--------+--------+-----+------------+-------+
| name  | owner  |species | sex | birth      | death |
+-------+--------+--------+-----+------------+-------+
| Claws | Gwen   | cat    | m   | 1994-03-17 | NULL  |
| Buffy | Harold | dog    | f   | 1989-05-13 | NULL  |
+-------+--------+--------+-----+------------+-------+
3.4.3 Ư  ϱ
̺  ü  ٴ " Ÿ" 鸸   ʹٸ 
 ϴ   ̸ ó ϸ ȴ(Ʒ  name, birth 
  ̴):
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
ָ   :
mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+
 ߺ  ִ.
ߺ   :
mysql> SELECT distinct owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+
distinct Ű带 ϸ ȴ.
WHERE  ̿Ͽ  ð     ִ.   
 ̿ ؼ ̸, ,  ˰    ó SELECT
   ִ:
mysql> SELECT name, species, birth FROM pet
    -> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
|Bowser  | dog     | 1989-08-31 |
+--------+---------+------------+
3.4.4  ϱ
ݱ     ĵǾ  ʾ    
̴. 
 ĵȴٸ ϴ ڷḦ ξ   ˾   ִ.  ϱ 
ؼ ORDER BY  ϸ  ȴ. Ʒ     
̴.
mysql> SELECT name, birth FROM pet ORDER BY birth;  
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
 Ϸ desc Ű带  ̸ ڿ ش:
mysql> SELECT name, birth FROM pet ORDER BY birth desc;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+
ϳ  ؼ ƴ϶   ؼ   ִ.  
   ̸ ϰ    Ϸ  ϵ  
 ( ʰ ¾ ;   )   Ϸ  ó 
Ѵ:
mysql> SELECT name, species, birth  FROM pet ORDER BY species,  birth 
DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+
DESC Ű ٷ  տ  ̸(birth) ȴٴ   
. species   ĵȴ.
3.4.5 ¥ MySQL ¥ ٷ  Լ  ش.
ֿ  ̰  Ǵ  Ϸ  ¥   ¥
 ϰ,  ¥ ϼ ȯ  ,    ϼ   365Ϸ 
 ָ  ̴:
mysql> SELECT name, (to_days(now())-to_days(birth))/365 FROM pet;
+----------+-------------------------------------+
| name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
+----------+-------------------------------------+
| Fluffy   |                                6.15 |
| Claws    |                                5.04 |
| Buffy    |                                9.88 |
| Fang     |                                8.59 |
| Bowser   |                                9.58 |
| Chirpy   |                                0.55 |
| Whistler |                                1.30 |
| Slim     |                                2.92 |
| Puffball |                                0.00 |
+----------+-------------------------------------+
⼭ ΰ   .  ̸ Ȥ     
Ǿ 
ڰ, ̿ شϴ  ǥ ״   ٴ "age"
 ϴ   ̴:
mysql> SELECT name, (to_days(now())-to_days(birth))/365 as age 
    -> FROM pet ORDER BY name;
̼ Ϸ ORDER BY name  ORDER BY age  ָ ȴ.
 ̵   ˾   ִ:
mysql> SELECT name, (to_days(death)-to_days(birth))/365 as age 
    -> FROM pet WHERE death is not null ORDER BY age;
now() death ϸ ȴ. ⼭       
Ѵٴ  ǹϱ  death ʵ尡 null ƴ  츦 
  ־ .   death is not nulló  
־ Ѵ. death != null ó ־ ȵȴ. null  
   . ߿   ٽ ٷ ̴.
    ˷   ؾ ұ? ̷    
MySQL ¥ ,  ϴ Լ Ѵ:
year(), month, day().month()  ˾ :
mysql> SELECT name, birth, month(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+
month  شϴ   ȯ ָ,     1 12
̴. 
 ³ ؼ 1   ָ ȴ:
mysql> SELECT name, birth FROM pet WHERE month(birth) = 10;
  ִ. 12   13   ־ ϳ?  13̶ 
. 
     ο ǽ   Ѵ. 
   ҰѴ:
 month(date_add(now(), interval 1 month));
now()  ¥  ð  ȯ ش.  1̶ Ⱓ   
ְ  ٲٸ ذȴ.
 mod(month(now()), 12) + 1;mod   ٸ    
 ȯϴ Լ̴. ù ° ڸ ι° ڷ   ȯ
. ⼭    month(now()) 12      Ÿ 
 1  ش. ̹    12̶ 12  0̹Ƿ 
 1   1 ³   ִ. SQL  
 :
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MOD(MONTH(NOW()),12) + 1;
3.4.6 null   NULL Ư ̴.
ͼ    ȥ ̴.  NULL ǹϴ  ٴ "
,  ", "   Ȯ " ǹѴ. 
̰ ٸ  ٸ ȴ. NULL     
  .   NULL =, <, != ̿Ͽ ϴ  ǹ
 . Ȯ   Ȯ     ΰ?  
:
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL     | NULL      | NULL     | NULL     |
+----------+-----------+----------+----------+
  Ȯ  Ȯ   Ȯ ȴ. ǹ̰ 
.  ϸ ǹ̰ ִ:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0         | 1             |
+-----------+---------------+
MySQL   0  1 Ÿ.
3.4.7  ġ
 ġ  ſ  ̴.   ϰ ϴ 
 Ͽ ˻  ְ ִ ̱ ̴.
MySQL ǥ SQL  Ӹƴ϶ н ϴ  ǥĿ 
ϴ  ġ ɵ Ѵ.
SQL _    ڸ ǹϸ, %   (0 
 ) Ų. SQL  ҹڸ  ʴ´. LIKE 
  شٴ  . Ʒ  :
b ϴ ̸ ؼ ˻ :
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+-----+------------+-----------+
| name   | owner  | species | sex | birth      | death      |
+--------+--------+---------+-----+------------+-----------+
| Buffy  | Harold | dog     | f   | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m   | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+-----+------------+-----------+
fy  ̸ ؼ ˻ :
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+-----+------------+-------+
| name   | owner  | species | sex | birth      | death |
+--------+--------+---------+-----+------------+-------+
| Fluffy | Harold | cat     | f   | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f   | 1989-05-13 | NULL  |
+--------+--------+---------+-----+------------+-------+
w ϴ ̸ ˻ :
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
Ȯϰ 5 ڷ ̷ ̸ ؼ ˻ ?
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+-----+------------+-------+
| name  | owner  | species | sex | birth      | death    |
+-------+--------+---------+-----+------------+-------+
| Claws | Gwen   | cat     | m   | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f   | 1989-05-13 | NULL  |
+-------+--------+---------+-----+------------+-------+
 5  ش. 
 ǥ  ġ  ˾ .
ǥĿ Ǵ               
        .                        ϳ
        *                       տ   0 ̻ ݺ
        ^                       ڿ ó
        $                       ڿ 
        [,]                     ȣ ڵ鿡 ġ
        {,}                     ݺ Ÿ .  n ݺ  
                                {n} ´.
⼭ SQL  ü   ġؾ "ġѴ"   ǥ 
  κа ġص "ġѴ" Ѵٴ  ؾ Ѵ. 
 , SELECT * FROM pet WHERE name REGEXP "ffy"; SELECT * FROM 
pet WHERE name LIKE "ffy";  ٸ  ´.
 a b c ϳ  Ű ǥ [abc]̴.   ־ ǥ
  ִ. ǥ ҹڸ Ѵ.   빮ڴ ҹ
ڴ  ĺ   ϳ Ű ǥ [a-zA-Z] ؾ  
. * 0 ̻ ڵ̶ ߴ. x*  x, xx, xxx ...   ش
. [0-9]* 7, 12,  345, 678   ̸    Ÿ. 
^abc  ó abc ϴ   abc$ abc   ڿ 
ǹѴ.  ǥ   LIKE REGEXP  Ѵ.  
 .
̸ ҹ b Ȥ 빮 B ϴ  ˻:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+--------+--------+---------+-----+------------+------------+
| name   | owner  | species | sex | birth      | death      |
+--------+--------+---------+-----+------------+------------+
| Buffy  | Harold | dog     | f   | 1989-05-13 | NULL          |
| Bowser | Diane  | dog     | m   | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+-----+------------+------------+
̸ fy  ($ Ѵ):
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+-----+------------+-------+
| name   | owner  | species | sex | birth      | death |
+--------+--------+---------+-----+------------+-------+
| Fluffy | Harold | cat     | f   | 1993-02-04 | NULL     |
| Buffy  | Harold | dog     | f   | 1989-05-13 | NULL     |
+--------+--------+---------+-----+------------+-------+
Ȯϰ 5 ڷ ̸    ǥ ġѴ:
        ^.....$ 
̰ ݺ ڸ ̿Ͽ ó   ִ.
        ^.{5}$
3.4.8  
  ֿ  ̳ ߴ  ˾Ƴ  ?
̿   count()Լ  ϸ Ǹ ϰ   ο 
ָ ȴ. 
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+
 ְ  ֿϵ   ó ϸ Ȯ   ִ:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |       2  |
| Diane  |       2  |
| Gwen   |       3  |
| Harold |       2  |
+--------+----------+
 owner  ڵ ѵ    GROUP BY      
ָ϶. ̷       ̴.
mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR    1140    at    line    1:    Mixing    of    GROUP    columns 
(MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() GROUP BY Ϳ   Ư  οϴ   
 ִ.  鵵 :
  شϴ  :
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+
   :
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+
NULL " " ǹ̴.     :
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  |COUNT(*)  |
+---------+------+----------+
| bird    | NULL |       1  |
| bird    | f    |       1  |
| cat     | f    |       1  |
| cat     | m    |       1  |
| dog     | f    |       1  |
| dog     | m    |       2  |
| hamster | f    |       1  |
| snake   | m    |       1  |
+---------+------+----------+
ٷ  ʹ , Ư    ؼ     
.   쿡      :
mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE species = "dog" OR  species = "cat"        -> GROUP BY 
species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+
3.5 ̺  ϱ
pet ̺ ֿϵ     ִ. ǻ翡 ġ   
 Ƚ   ¥  ǵ鿡  ٸ   ϰ
ʹٸ  ̺ʿ ̴. ̺    䱸
 ̴: 
 ش  ̸  ־  Ѵ.  ֿ  Ͼ 
 кؾ ϱ ̴.
  Ͼ  ˱  ¥  ʿϴ.   
  ʿ䰡 ִ.
  зϷ   Ÿ ʵ嵵    ̴.
̿   Ͽ,  ó ̺  :
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
     -> type VARCHAR(15), remark VARCHAR(255));
pet ̺  ó Ϸκ  ̺ ø. event.txt
 ó  ִٰ .
Fluffy  1995-05-15      litter  4 kittens, 3 female, 1 male  
Buffy   1993-06-23      litter  5 puppies, 2 female, 3 male  
Buffy   1994-06-19      litter  3 puppies, 3 female  
Chirpy  1999-03-21      vet     needed beak straightened
Slim    1997-08-03      vet     broken rib  
Bowser  1991-10-12      kennelFang      1991-10-12      kennel
Fang    1998-08-28      birthday        Gave him a new chew toy  
Claws   1998-03-17      birthday        Gave him a new flea collar  
Whistler        1998-12-09      birthday        First birthday
 ó ̺ ä:
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
ݱ pet ̺ ٷ鼭  event ̺    
Ǹ     ̴.       ϴ
?     ̸  ˷  ؾ ϴ°?  event 
̺    Ҵ      ̶簡, 
ֶ簡 ϴ   pet ̺  ؼ ˾   Ѵ.   
SELECT      ̺ ʿϴ:
mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age,
    -> remark FROM pet, event
    -> WHERE pet.name = event.name AND type = "litter";
+--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy  | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy  | 5.10 | 3 puppies, 3 female         |
+--------+------+-----------------------------+
 κ  ˾ ξ   ִ:
 FROM   ̺   ־ Ѵ. ̰͵ ηκ
  ʿϱ ̴.
  ̺  ̾    ̺ ڵ尡 ٸ 
̺ ڵ  ġϴ   ־ Ѵ. ⼭  
̺   name ʵ带   Ƿ  ̰ ̿ϸ   ȴ.  
WHERE pet.name =  event.name  ν   ̺  
  شϴ ڵ忡 ؼ Ǹ ϰ ȴ.  ٸٸ 
̰ .
  ̺  name ʵ带   Ƿ  ̺ ϴ  
 ϱ   ≮̺>.<ʵ̸>    ־
.  ̺ ̸ʵ ̸  Ͽ  ش.   
̺  .    ̺ ؼ ó   
ʿ䰡   ִ.    ư  ¦  ַ 
 ؾ ϴ°?  ̺ ؼ    ٸ ˻ؾ 
Ѵ.    :
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
    -> FROM pet AS p1, pet AS p2
    -> WHERE p1.species =  p2.species AND p1.sex  = "f" AND p2.sex  = 
"m";
+--------+------+--------+------+---------+
| name   | sex  | name   | sex  | species |
+--------+------+--------+------+---------+
| Fluffy | f    | Claws  | m    | cat     |
| Buffy  | f    | Fang   | m    | dog     |
| Buffy  | f    | Bowser | m    | dog     |
+--------+------+--------+------+---------+
3.6 ġ (ϰ ó ) ϱ
ݱ ȭ Ͽ. Ǹ   ְ    
 ۾̾. ۾  θ Ͽ    Ѳ ó
  ִ. ̷ ϴ  ۾ ġ ۾̶ Ѵٴ   ˾ 
.    Ѵ:
shell> mysql < batch-file
۾      ǥ Է  ȴ.  ȣƮ  
 ,н带 Է ʿ䰡  ߰  ش:
shell> mysql -h host -u user -p < batch-file
Enter password: ********
 ġ 忡   ۼϴ  ٷ ũƮ 
ϴ ̴.   ⺻    ȭ   ʹ  ٸ.  SELECT 
DISTINCT species FROM  pet   ȭİ ġ 忡  
 .    ٸ.ȭ:
+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+
ġ :speciesbirdcatdoghamstersnake
ġ 忡 ȭ 忡     ϸ  mysql 
 -t ɼ ָ ȴ.  Ǵ ɾ ¿ ϰ 
ٸ -vvv ٿ.
ٸ   ֱ淡 ġ 带 ұ?     
ξ.
 Ǹ  Ѵٸ ũƮ  δ     Ź 
ٽ  ־ִ   ش.
 ̹ ۼ ũƮ Ͽ    ְ ο  ũƮ 
ۼ  ִ  ִ.
  ٿ ġ ſ  Ǹ   ġ 尡  
̴.
Ǽ   ȭ  ٽ  ־ ־ Ѵ.  ġ 
϶ ϸ   ָ ȴ.   MySQL readline ̺귯
(丮  ̺귯) ϹǷ ȭ    
ٽ ɾ  ִ  ũ   ִ. 
    ٸ ġ Ű ( 
 ټ  ִ α Īϴ Ī)     
̴.  ó:
shell> mysqlk < batch-file | less
   ٸ Ϸ   ִ.    ߰ ۾ 
 Ȱ  ִ.
shell> mysql < batch-file > mysql.out
 ۼ ũƮ ٸ    ִ. ٸ   
ۼ ũƮ      ִ.
  ۾ ݻ ġ忡   ִ.  ð 
  ۾   cron ̿Ͽ ġ忡 ó   ۿ 
.
9. mysql  (functions)
9.1 mysql ϴ 
 mysqld      Ÿ   ֽϴ. :  Czech, 
Dutch, English(⺻), Ÿ  (** Ÿ  Ŵ  . ѱ, 
Ϻ   ⼭ ֽϴ. 9.1.1  ϼ. **)
 mysqld Ư  Ϸ --language=lang Ǵ -L  lang ɼ
 ϸ ˴ϴ.
> # mysqld--language=swedish
Ǵ 
# mysqld --language=/usr/local/share/swedish
  ҹڷ ǥմϴ.
    (⺻) 'mysql_base_dir/share/LANGUAGE/'  ֽ
.
      ƮϷ 'errmsg.txt'     ϰ 
'errmsg.sys'      մϴ.
# comp_err errmsg.txt errmsg.sys
 mysql ο  ̵ϸ ο 'errmsg.txt'  
    ľ մϴ.
9.1.1 Ϳ  ϴ  
 ⺻ mysql ISO-8859-1 (Latin 1)   մϴ.   
ڼ ̱  ϴ  Դϴ.
 ڼ ̸  ڼ   ִ   SELECT  
ORDER BY  GROUP BY     ĵǴ մϴ.
 Ҷ configure --with-charset=charset ɼ Ͽ 
 ٲ  ֽϴ. ڼ  4.7.1  ϼ.
(** ѱ ϱ ؼ   κ ߿մϴ. 츮  Ҷ 
ڼ sjis ٲپ ָ ˴ϴ. sjis Ϻ 2Ʈ    
ϴ. ̷ ؾ   ǰ ǥ   ֽϴ. 
**)  
9.1.2 ο ڼ ߰
**  **
9.1.3 ƼƮ  
Ƽ ̽ ڼ  _MB ũθ   ֽϴ.
**  **
9.2 Ʈ α
 mysqld   --log-update=file_name ɼ  ϸ mysqld 
Ÿ Ʈ  sql  ϴ α  մϴ. 
 data 丮(**  mysql ġ 丮  data 丮 **)
 ϵǸ  file_name.# ·   ˴ϴ. # mysqladmin  refresh   
mysqladmin flush -logs, FLUSH LOGS , Ǵ   Ҷ 
˴ϴ.
--log    -l ɼ   ϸ   ̸  'hostname.log'  Ǹ, 
restart refreshes ص ο α   ʽϴ. 
 mysql.server ũƮ -l ɼ mysql  մϴ. 
production enviroment(?) Ͽ Ҷ     ʿϸ 
mysql.server -l ɼ   ֽϴ.
 Ʈ α״ ̼  Ÿ Ʈ  α 
 ϴ.  WHERE  UPDATE DELETE  شϴ 
带 ã ϸ α Ͽ  ʽϴ.  ̹ ϴ 
 Ҷ Update  õ˴ϴ.
 Ʈ α Ͽ  ͺ̽  ƮϷ      
ϸ ˴ϴ. (α  'file_name.#' ¶ )
# ls -1 -t -r file_name.[0-9]* | xargs cat | mysql
 ls Ȯ   α    մϴ.
 ̰ ͺ̽ ջ    Ϸ   ϸ, 
 ջ  ð ̿ Ͼ Ʈ ٽ Ҷ(redo) 
  ֽϴ.
  ٸ ȣƮ ̷ ͺ̽      
ͺ̽  ȭ Ҷ Ʈ α   ֽϴ.
9.3 mysql ̺ ִ ũ
 mysql ü ̺ ִ ũⰡ  4G̸  ý    
 ũ   ֽϴ.     2G  Դϴ.  ֶ 
2.5.1 4G̸, ֶ 2.6 1000G  Դϴ.  
 ũ  4G̰ų, (MYSQL )  ý Դϴ. 4G ̻
 Ȯϱ   mysql ٲ Դϴ. η F ϼ.
 Ŵ ̺ б  ϸ  ̺ ϳ   
 pack_isam     ֽϴ. pack_isam Ϲ  ̺ 
ּ 50%  Ͽ ȿ  ū ̺   ֽϴ. 12.3 
[pack_isam] ϼ.
 ٸ ַ MERGE ̺귯 ԵǾ  identical  ̺ 
 ϳ     ֽϴ. (⼭  Identical   ̺ 
identical ÷  ٴ  ǹմϴ.)   MERGE 
  ʱ   ̺  (collection) ˻ϴ
   ֽϴ.   ϳ  ε ߰ 
ϴ.
(**  б  ̺ mysql ̼ ϰ  
   ֽϴ.  б⸸ ϴ      б 
 ̺   ϴ. **)
10. mysql ִ   
10.1  ũ 
mysqld  ϴ ⺻  ũ     ִ.
shell> mysqld --help
   mysqld ɼ ϰ   ش. µǴ 
 ⺻ ϰ   ϴ.
Possible variables for option --set-variable (-O) are:
back_log              current value: 5
connect_timeout       current value: 5
join_buffer           current value: 131072
key_buffer            current value: 1048540
long_query_time       current value: 10
max_allowed_packet    current value: 1048576
max_connections       current value: 90
max_connect_errors    current value: 10
max_join_size         current value: 4294967295
max_sort_length       current value: 1024
net_buffer_length     current value: 16384
record_buffer         current value: 131072
sort_buffer           current value: 2097116
table_cache           current value: 64
tmp_table_size        current value: 1048576
thread_stack          current value: 131072
wait_timeout          current value: 28800
mysqld   ̸         
ִ.
shell> mysqladmin variables
 ɼ ؿ Ѵ.   ũ, ,  ũ  Ʈ̴. 
'K'(ųιƮ)  'M'(ްƮ) տ  ٿ     ִ. 
  16M 16 ްƮ Ų. ҹڴ  ʴ´. 
16M  16m .
-back_log 
mysql   ִ ִ  û . ̰ main  mysql 尡 
ſ ª ð ſ   û    Ѵ. ̶ 
 尡  üũϰ ο 带 ϴµ  ణ ð
 ɸ.(  ª ð) back_log   mysql  
ο û ϴ  ߱  ª ð    
û Ƶΰ ִ Ѵ. ſ ª ð ſ    
ɶ   Ѿ Ѵ.
ٸ    tcp/ip   listen queue ũ̴.  
ü ̷ ť ũ Ѱ谡  ִ. Unix system call  listen(2) 
Ŵ ڼ  ִ. back_log Ѱ ü  
 Ȯغ. back_log ִ밪   ȿ . 
-connect_timeout 
Bad handshake ϱ   Ŷ mysql   ٸ 
.()
-join_buffer 
(ε  ʴ )  full-join ϴ   ũ. 
۴  ̺ ̿  full-join ѹ Ҵ ȴ. ε 
߰    ۸  Ű full join ӵ  ų 
 ִ. (Ϲ   ϴ   ε ߰
ϴ ̴)
-key_buffer 
ε  ۸ǰ   忡 Ѵ. Ű ۴  ε 
 ϴ  ũ̴. ε  ̺  delete 
insert ۾  ϸ Ű ۰ Ű  .    
  LOCK TABLES . [Lock Tables] .
-max_allowed_packet 
 Ŷ ִ ũ.  ۴ net_buffer_length  Ʈ ʱȭ
 ʿϸ ִ  Ŷ Ʈ ų   ִ.⺻ ū 
Ŷ  ۴. Ŵ BLOB ÷ Ѵٸ   Ѿ 
. ڰ ϴ ִ blobŭ ũ ؾ Ѵ. 
 
-max_connections 
 Ŭ̾Ʈ .  mysqld ʿϴ   (descriptor) 
ڸŭ  ÷ Ѵ. ؿ  ũ ѿ    
.
-max_connect_errors 
ȣƮ ִ  ̻ interrupted      
  ȣƮ blockȭȴ. FLUSH HOSTS  ȣƮ block 
  ִ.
-max_join_size 
ִ  ũ̻ ũ д  ϸ  .  
ڰ where   ʰ ð  ɸ鼭  鸸 
带 д  Ϸ ϸ   Ѵ.
-max_sort_length 
BLOB TEXT  Ҷ ϴ Ʈ . (    ù
° max_sort_length Ʈ ȴ.  õȴ)
-net_buffer_length 
ǿ  ۰ ʱȭǴ  ũ. Ϲ ٲ   ſ 
     Ǵ ǿ °   ִ. (
 Ŭ̾Ʈ   sql   ̴. ǹ   ũ⸦ 
 ۴ ڵ max_allowed_packet Ʈ Ѵ) 
-record_buffer 
 ˻ ϴ  忡  ˻ ̺ Ҵϴ   ũ
.  ˻  ϸ   Ѿ Ѵ.
-sort_buffer 
 ʿ  忡 Ҵϴ  ũ. order by   group by 
۷̼  Ϸ   Ų. 16.4 [ӽ ] .
-table_cache 
 忡   ִ  ̺ . mysqld ʿ ϴ   
ũ ڸŭ   Ѷ. mysql    
 ΰ  ũͰ ʿϴ.  ũ    
Ѵ. ̺ ij  ۵ϴ 10.6 [̺ ij] 
.
 
-tmp_table_size 
ӽ ̺    mysql "The Table tbl_name is full"̶
   . ſ  group by Ǹ ϸ    
Ѿ Ѵ.
-thread_stack 
   . creash-me test(** :  ͺ̽ 
ġŷ ϴ ƮԴϴ. ״ ͺ̽ )   
     ִ. ⺻ Ϲ  ũ. 
11 [ġũ] 
-wait_timeout 
   Ȱ(activity)  ٸ ð().
table_cache  max_connections     ִ ִ    
 ģ.   Ű ýۿ   ũ
 per-process  Ѱ ø  ִ. (** ... imposed  by your 
operating system on the per-process number of open  file descriptors. 
 ̻ϹǷ  )
  ýۿ  Ѱ踦 ų ִ. ̷ Ϸ  
ۿ  Ѱ踦 ȭŰ  ſ پϹǷ  ü  
ؾ Ѵ.
table_cache  max_connections  谡 ִ.   200 
  ּ 200 * n  ̺ ij  Ѵ. ⼭  n 
 ̺ ִ ̴.
mysql ſ  ˰ ϱ  Ϲδ ſ  
          ȴ.
   ̺  ߰ Ŭ̾Ʈ ִ
  Ѵٸ   Ѵ.
shell> safe_mysqld -O key_buffer=16M -O table_cache=128 \
           -O sort_buffer=4M -O record_buffer=1M &
      Ѵ.
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \
           -O record_buffer=100k &
Ǵ: 
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \
           -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
ſ     mysqld  Ḷ ּ   
ϵ  ʾҴٸ "swapping problems"   ̴.
mysqld ɼ ٲپ װ  شϴ νϽ 
 ģٴ  .
ɼ ٲپ ȿ     غ.
shell> mysqld -O key_buffer=32m --help
 --help ɼ   .    Ŀǵ 
ο  ɼ ȿ ¿ ݿ  ̴. 
10.2    < ȭ>
Ʒ ϴ  mysqld   ϴ   
 Ÿ ִ.   õ   ̸ ־.
- Ű ( key_buffer)  忡 Ѵ.   
ϴ ٸ ۴ ʿѴ Ҵ ȴ.
-     帶 Ư   Ѵ. (64k,   
thread_stack) ,  ( net_buffer_length), result   ( 
net_buffer_length)   .      ۿ   result   ۴   ʿҶ 
max_allowed_packet   ȴ. ǰ    
ǹ 繮  Ҵ ȴ. (** When a query is running  a copy 
of the current query string is also alloced.) 
-    ⺻  Ѵ.
-     ȵȴ. ( ̺ ϰ.   
 ٸ ̴̾߱) ֳϸ 4GB 32Ʈ   κ 
 ̺  ũⰡ ʱ ̴. 츮 64Ʈ  ּ  
 ý    츮     Ϲ  
߰ ̴.
- ̺  ˻ ϴ  û read ۿ  Ҵ ȴ. 
( record_buffer)
-   ѹ  Ǹ κ  ӽ ̺ 
 ʰ  ȴ. κ ̺   (HEAP) ̴̺. 
Ŵ  ڵ带 ų BLOB ÷  ӽ ̺ ũ
  ȴ.      ̺  tmp_table_size 
ʰ "The table tbl_name  is full"̶    ̴. 
 Ͼȿ ʿҶ ڵ  (HEAP) ̺ ũ 
(NISAM) ̺ ٲٵ ĥ ̴.    ذϱ ؼ 
mysqld tmp_table_size ɼ Ͽ  ӽ ̺ ũ⸦  ̰ų 
Ŭ̾Ʈ α SQL_BIG_TABLES  sql ɼ Ͽ  
. 7.24 SET OPTION  .
mysql 3.20 ӽ ̺  ִ ũ record_buffer*16̴.  3.20 
 ϰ  ִٸ record_buffer   Ѿ   Ѵ.  
mysqld   --big-tables ɼ Ͽ  ӽ ̺ 
ũ     ӵ  ģ.
-  ϴ κ û   ۿ ϳ ΰ ӽ   
ҴѴ. 16.4 [ӽ ] Ѵ.
 
- κ ¡(parsing)    ̷.  
ۿ  overhead  ʿ Ϲ     Ҵ(slow 
memory allocation) freeing(  ) õȴ.    
  Ŵ ڿ Ҵ ȴ.( mallloc()  free() )
-  ε  ѹ   Ǵ 忡  
 ѹ .   帶 ̺ ,   ÷ 
 , 3 * n    ũⰡ Ҵȴ.  ( n ִ ڵ  ̸ 
BLOB ÷ ش ʴ´) BLOB BLOB  ̿ 5 8 
Ʈ   Ѵ.
- BLOB ÷   ̺ ۴ Ŵ BLOB    ֵ 
 Ŀ. ̺ ˻ϸ  ۴ ִ BLOB ŭ  ۰ 
Ҵ ȴ.
-   ̺ ̺ ڵ鷯 ij Ǹ  FIFO 
 ȴ. Ϲ ij 64 Ʈ ´. ÿ ΰ   
忡 ̺ ϸ ij ̺  Ʈ Ѵ. 10.6 
[̺ ij] Ѵ.
- mysqladmin flush-tables   ʴ  ̺  ݰ 
 Ǵ 尡      ̺ ݴ´ٰ  ǥ
. ̰ ȿ   Ѵ. 
ps  ٸ ý Ȳ α mysqld    ϰ 
ٰ  ̴. ̰ ٸ  ּ  -ö 
.   ֶ ps  û  ʴ  
ϴ  Ѵ. ̰ swap -s ̿ 밡   üũ
Ͽ ȮҼ ִ. 츮 mysqld      α
 ؼ mysqld   .
10.3 ӵ   ġ /ũ  
                                        <Ͻ ȭϱ>
 Ʈ κ  mysql ġũ   Ǿ 
ٸ  ýۿ Ͻִ  ִ. 
static ũ Ҷ    ӵ   ִ. ͺ
 ϱ  TCP/IPٴ н  ϸ    
  ִ. 
 pgcc -O6 ϸ  . 'sql_yacc.cc'  ɼ
 Ϸ gcc/pgcc       ʿ
ϱ  180M  ʿϴ.  mysql Ҷ libstdc++ 
̺귯  ʱ  CXX=gcc ؾ Ѵ.
- pgcc ϰ δ -O6 ɼ ϸ mysqld   gcc 
 ͺ 11% .
-  ũϸ (-static  ʰ) 13% .
    If you connect using TCP/IP rather than Unix sockets,  the result 
is 7.5% slower.
- н  ϴ ͺ tcp/ip ϴ  7.5% .
- On a Sun sparcstation 10, gcc 2.7.3 is 13% faster than Sun  Pro C++ 
4.2. 
- On Solaris 2.5.1, MIT-pthreads is 8-12% slower than  Solaris native 
threads. (**   .  ϱ... **)
TcX  mysql   pgcc ϵǾ   
ũǾ.
10.4 How MySQL uses indexes
prefix- and   end-space compressed.  See section   7.26 CREATE  INDEX 
syntax (Compatibility function). 
 ε(PRIMARY, UNIQUE and INDEX())  B-trees  ȴ. 
 ڵ   (?) ȴ. 7.26 [ε ] . 
ε  : 
- WHERE  شϴ ڵ   ã
-  Ҷ ٸ ̺ ڵ 
- Ư Ű MAX()  MIN()  ã
- ̳ ȭҶ ε Ű ϸ ̺ ϰų ȭ
Ѵ. Ű  DESC   ε д´.
-  쿡  Ͽ  ʰ  ´.   ̺
 ϴ  ÷ ̰ Ư Ű Ǿ  ӵ 
ε Ʈ    ִ.
  .
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
 ÷ ε col1  col2  شϴ ڵ带   
  ִ.  и  ÷ ε col1  col2    ȭ
  ε   ڵ带  Ȯϰ ڵ带 
   ε ϵ Ѵ.
̺  ÷ ε ٸ ȭⰡ ڵ带  ãµ  
εŰ   ִ.     ÷ ε(col1,  col2, 
col3) ٸ (col1), (col1,col2) (col1,col2,col3) ε 
 ˻   ִ.  
MySQL can't use a partial index if the columns don't form  a leftmost 
prefix of the index. 
Suppose you have the SELECT statements shown below: 
(** ؼ  ȵǴµ  ø      **)
mysql> SELECT * FROM tbl_name WHERE col1=val1;
mysql> SELECT * FROM tbl_name WHERE col2=val2;
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
If an index exists  on (col1,col2,col3), only  the first query  shown 
above uses the index.
The second and third queries  do involve indexed columns, but  (col2) 
and (col2,col3) are not leftmost prefixes of (col1,col2,col3). 
ε (col1,col2,col3) ִٸ    ù°  Ǹ 
 Ѵ. ι°  °  ε ÷  ԵǾ 
 (col2)  (col2,col3) (col1,col2,col3) ε ش  ʴ
.
MySQL also uses indexes for LIKE comparisons if the argument  to LIKE 
is a constant string  that doesn't start  with a wildcard  character. 
For example, the following SELECT stat ements use indexes: 
mysql  LIKE μ ϵī ڷ  ʴ   
̶ LIKE  ε Ѵ.    SELECT 
 ε Ѵ.
mysql> select * from tbl_name where key_col LIKE "Patrick%";
mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";
ù° 忡 "Patrick" <= key_col  < "Patricl"    ڵ常 
ȴ. ι° 忡 "Pat" <= key_col < "Pau"   ڵ常 
ȴ. 
 SELECT  ε  ʴ´:
mysql> select * from tbl_name where key_col LIKE "%Patrick%";
mysql> select * from tbl_name where key_col LIKE other_col;
ù° 忡 LIKE  ϵī ڷ ϰ ִ.  ι° 
忡 LIKE   ƴϴ.
10.5 WHERE  ȭϱ
(̹    ϰ  ʴ. mysql   ȭ
 ִ.)
In general, when you want to make a slow SELECT ... WHERE faster, the 
first thing to  check is whether  or not  you can add  an index.  All 
references between   different tables  should usually   be done  with 
indexes. You can use the  EXPLAIN command to determine which  indexes 
are  used  for  a  SELECT.  See  section  7.21  EXPLAIN  syntax  (Get 
information about a SELECT). 
Ϲ  SELECT ... WHERE   Ϸ    Ȯ
    ε ߰ ̴.  ٸ ̺̿   ۷
(references ) Ϲ ε  ȴ. SELECT   
 ε ϴ ϱ  EXPLAIN    ִ. 
7.21 [Explain] .
mysql ϴ ȭ  .
- ʿ Ծ 
       ((a AND b) AND c OR (((a AND b) AND (c AND d))))
    -> (a AND b ANDc) OR (a AND b AND c AND d)
- (folding)
       (a b>5 AND b=c AND a=5
-   (   ʿ)
       (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
    -> B=5 OR B=6
- ε Ǵ  ǥ ѹ ȴ.
 (Constant expressions used by indexes are evaluated only once.) 
- WHERE    ̺ COUNT(*) ̺     
´. 
 ̺  NOT NULL ǥ ̿  ȴ.  
- ȿ   ǥ ̸ ŵȴ. mysql  Ұϰ ش
 ڵ尡  SELECT   Ѵ.
- GROUP BY   (COUNT(), MIN() ...)    HAVING
 WHERE  .
(** HAVING  ε  . Ƿ   HAVING
  ʴ° ӵ鿡  **) 
-   ο  WHERE  ϰ   ڵ带 
ϵ ϰ WHERE  .
- mysql Ϲ ּ  ڵ带 ã  ε  Ѵ. 
=, >, >=, <, <=, BETWEEN   'something%' ó   ϵī 
 ʴ LIKE   Ͽ     ε  Ѵ. 
(** 10.4  Ͽ  like  Ҷ ϵī  ϴ 
like  ϸ ε  ʴ´.  ܾθ ϴ 
÷ ڷḦ ã   ̴. **)
- Any index that doesn't span all  AND levels in the WHERE clause  is 
not used to optimize the query. 
 WHERE  ε Ѵ.: 
... WHERE index_part1=1 AND index_part2=2
... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 
*/
... WHERE index_part1='hello' AND index_part_3=5
          /* optimized like "index_part1='hello'" */
 WHERE  ε  ʴ´.: 
... WHERE index_part2=1  AND index_part3=2   /* index_part_1  is not 
used */
... WHERE index=1 OR A=10                  /* No index */
... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows 
*/
- ǿ ٸ ̺   ̺  д´.   
  .
         ̺̳ 1 ڵ常 ִ ̺
        WHERE  UNIQUE ε  PRIMARY KEY  ϰ   
        ε  ǥε ̺ 
         ̺  ̺ ȴ.
    mysql> SELECT * FROM t WHERE primary_key=1;
    mysql> SELECT * FROM t1,t2
               WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
-  ɼ õϿ ̺ ϴµ     ã
´. (ORDER BY GROUP BY  ÷  ̺   
 Ҷ  ̺  õȴ)
- ORDER BY  ٸ GROUP BY   , Ǵ ORDER BY  GROUP BY
  ť ù° ̺ ƴ ٸ ̺ ÷  ϰ 
 ӻ ̺ .
-  ̺ ε ã ڵ 30%̸ ϴ (best) ε 
ȴ.  ε   ̺ ˻ ȴ.
-  쿡 mysql   ȸ ʰ ε ڵ
   ִ. ε   ÷ ڶ Ǹ ó
µ  ε Ʈ Ѵ.
-  ڵ尡 µDZ  HAVING   ʴ ڵ dzʶڴ.
 ſ   ̴:
mysql> SELECT COUNT(*) FROM tbl_name;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
mysql> SELECT MAX(key_part2) FROM tbl_name
           WHERE key_part_1=constant;
mysql> SELECT ... FROM tbl_name
           ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM tbl_name
           ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
 Ŀ ε Ʈ Ͽ  Ѵ.(ε  ÷ 
ڶ ):
mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM tbl_name
           WHERE key_part1=val1 and key_part2=val2;
mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
 Ǵ    ʰ     
 ε Ѵ:
mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
mysql> SELECT  ... FROM  tbl_name ORDER  BY key_part1  DESC,key_part2 
DESC,...
10.6 ̺  ݴ 
open ̺ ij table_cache  ִ밪 Ŀ  ִ.  (⺻ 
64 ;   mysqld -0 table_cache=#  ٲ  ִ) ij  
á,  ٸ 尡 ̺    , Ǵ  mysqladmin 
refresh  mysqladmin  flush-tables Ҷ ϰ  ̺ 
  ʴ´.
̺ ij     ij Ʈ ϵ ϱ   
  Ѵ.
-   ߴ    ʴ ̺ ݴ´.
- ij  á   ̺   ο ̺   
Ѵٸ ij ʿ ŭ ӽ Ȯȴ.
- ij ӽ Ȯ ̰ ̺     Ȳ 
 ̺ ݰ ij Ѵ.
̺  ú ٶ .  ̺  ϴ 
ΰ 尡 ְų  ǿ ̺ ι  ϸ(with AS) 
̺ ι  Ѵٴ  ǹ̴. ̺ ù°   ΰ 
 ũ . ; ߰ ̺  ϳ  
ũ  ̴. ó 濡 ϴ ߰  ũ
 ε Ͽ ȴ. ;   ũʹ  忡  
.
10.6.1 ͺ̽   ̺ 鶧 
丮   ִٸ open, close   create ۷̼ 
 ̴.  ٸ  ̺ SELECT   ϸ ̺ 
ij    ణ overhead  ̴. ֳĸ  ̺ 
ִٸ ٸ ̺  ϱ ̴. ̺ ij ũ ؼ 
 带   ִ.
10.7  ̺  
mysqladmin status       ̴:
Uptime: 426  Running  threads: 1  Questions:  11082 Reloads:  1  Open 
tables: 12
 6̺ ߴµ ̷  Ȳ ̴.
mysql Ƽ带 Ѵ.  ÿ  ̺   
Ǹ   ִ.  Ͽ Ͽ ٸ Ȳ   ΰ 
   ̱  ̺  ú 帶 
 ȴ. ̰ Ÿ Ͽ ణ  ϳ ߰ 
 ũ Ѵ.  忡 ε  ȴ.
10.8 ͺ̽ ̺ ɺ ũ 
ͺ̽ 丮 ̺ ͺ̽ ٸ ġ  ű 
ο ġ ɺ ũ   ִ. ̷ ϴ    
찡 ִ.   ͺ̽    Ͻý 
ű  .
mysql ̺ ɺ ũǾٴ  ϸ ɺ ũ 
Ű ̺    ִ. realpath() call  ϴ  
ýۿ ۵Ѵ. (ּ  ֶ realpath()  
) realpath()  ʴ  ýۿ ÿ  ο  ɺ 
ũ ο ϸ ȵȴ. ̷ 쿡 Ʈ Ŀ ̺ 
  ִ.
mysql ⺻ ͺ̽ ũ  ʴ´.  ͺ̽
 ɺ ũ  ʴ ۵   ̴. mysql  
丮 db1 ͺ̽ ְ db1 Ű db2 ɺ  ũ 
ٰ غ:
shell> cd /path/to/datadir
shell> ln -s db1 db2
 db1 tbl_a ̺  ִٸ db2 tbl_a Ÿ  ̴. 
 尡 db1.tbl_a Ʈϰ ٸ 尡 db2.tbl_a 
Ʈϸ   ̴.
   ʿϸ , `mysys/mf_format.c'   ڵ带 
ؾ Ѵ.: 
if (!lstat(to,&stat_buff))  /* Check if it's a symbolic link */
    if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff))
 ڵ带   Ѵ : 
if (realpath(to,buff))
10.9 ̺  Ŵ 
mysql   deadlock-free  ̴.  Ǹ Ҷ  ѹ 
 ʿ  ûϰ    ̺   ɾ 
Ѵ.
WRITE  ϴ   :
- ̺    ̺ write  Ǵ. 
- ̷ 찡 ƴ϶ write  ť  ûѴ.
READ  ϴ   :
- ̺ write    ̺ read  Ǵ.
- ̷ 찡 ƴ϶ read  ť  ûѴ.
 Ǿ   write  ť 忡     
  read  ť 忡 Ѵ.
̺ Ʈ  ϸ SELECT    ̻ Ʈ   
 ٸٴ  ǹѴ.
̷  ذϱ  ̺ INSERT   SELECT ۷̼ 
 ϴ 쿡   ϸ ȴ. ӽ ̺ ڵ带 
ϰ ѹ ӽ ̺  ̺ ڵ带 ƮѴ.
  :
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;
   쿡 SELECT   켱 ְ ʹٸ  INSERT  ɼǿ 
LOW_PRIORITY or HIGH_PRIORITY ɼ   ִ. 7.13 [Insert] 
. (** LOW_PRIORITY ϸ Ŭ̾Ʈ ̺    
 INSERT   ̷. **)
 ť ϱ  `mysys/thr_lock.c'  ŷ ڵ带 ٲ   
. ̷  write  read   켱   ø
̼ǿ   ִ.
10.10 ̺  ۰ 迭ϴ  
                                <** ̺ ȭ **>
 ̺ ִǼ       ִ 
ũ̴:
-  NOT NULL ÷ Ѵ. ӵ    ÷ 1 
Ʈ   ִ.
- default    ϴ. ԷµǴ  ⺻ ٸ   Ȯ
ϰ    Էµȴ.  INSERT    ù°   TIMESTAMP  ÷̳ 
AUTO-INCREAMENT   ÷       Է   ʿ䰡    .   18.4.49 
[mysql_insert_id()] .
-  ̺ ۰    integer Ÿ . 
  MEDIUMINT   INT  .
-   ÷ ٸ(VARCHAR,  TEXT or BLOB columns),    
ڵ  ȴ.   ӵ   (~) 
Ǵ   . 10.14 [Row format] .
- mysql Ǹ ȿ ȭϱ     Է
 isamchk --analyze . ̷ ϸ     
 ڸ Ű  ε  ƮѴ. ( unique ε
  1̴) 
- ε  ε   Ÿ Ϸ   isamchk --sort-index 
--sort-records=1  .(if you want to sort on index 1). 
ε  ĵ  ڵ带 б  unique ε ٸ 
̷ ϴ  ӵ  ϴ   ̴.
- INSERT      .   SELECT 
 ξ . Ÿ ̺ Է  LOAD DATA INFILE 
.  INSERT  ϴ ͺ  20 . 7.15 [Load] 
.
 ε  ̺ Ÿ ԷҶ    ϸ 
ӵ ų  ִ.
1. mysql̳ Perl  CREATE TABLE ̺ .
2. mysqladmin flush-tables . (**  ̺   **)
3. isamchk --keys-used=0  /path/to/db/tbl_name . ̺   
ε  Ѵ. 
4. LOAD DATA INFILE  ̿ ̺ Ÿ Է.
5. pack_isam  ְ ̺ ϱ ϸ pack_isam .
6. isamchk -r -q /path/to/db/tbl_name  ̿ ε ٽ .
7. mysqladmin flush-tables .
- LODA DATA INFILE  INSERT     ӵ  Ű  ۸ 
Ų. mysqld safe_mysqld -O key_buffer=# ɼ  ϸ 
ȴ.   16M dz  ٸ Ǹ ̴.
- ٸ α Ͽ Ÿ ؽƮ Ϸ Ҷ SELECT ... 
INTO OUTFILE  . 7.15 [LOAD DATA INFILE] .
-  ٷ insert update   LOCK TABLE  Ͽ 
   ɸ ӵ  ų   ִ.  LOAD DATA   INFILE  
SELECT ...INTO OUTFILE  ̱  LOCK TABLE  ϸ 
ȴ. 7.23 [LOCK TABLES/UNLOCK TABLES] . 
̺   ȭǾ  Ϸ '.ISM'  Ͽ  isamchk 
-evi  Ѵ. 1
3 [Maintenance] .
10.11 INSERT  ӵ  ġ κ 
                                <** insert ȭ **>
insert ϴ ð   ȴ:
    Connect: (3) 
    Sending query to server: (2) 
    Parsing query: (2) 
    Inserting record: (1 x size of record) 
    Inserting indexes: (1 x indexes) 
    Close: (1) 
()  ð̴. ̰ ̺ Ҷ ʱ  overhead
 ϰ  ʴ. ( ú Ǵ Ǹ )
The size of the table slows down the insertion of indexes by N  log N 
(B-trees).
̺ ũ N log N(B-trees)  ε Է . (**
  ̻. ̺ Ŀ  ε   ٴ ̰ 
**)
 
̺  ɰų insert     Ͽ  Է ӵ
    ִ.    ϸ  insert  5 
 ӵ .
mysql> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;
ֿ ӵ ̴  INSERT  Ϸǰ  Ŀ ѹ ε 
۰   .    ٸ  INSERT    
 ε  ÷  ̴.     Էϸ 
 ʿ.
ŷ    Ʈ  ð   ִ.    
忡  ð   ִ.(ֳĸ   ٸ 
̴)
 :
thread 1 does 1000 inserts
thread 2, 3, and 4 does 1 insert
thread 5 does 1000 inserts
   2, ,3 4 1 5  ĥ ̴.   
 2,3,4 Ƹ 1̳ 5     ̴.    ð 
40% .
INSERT, UPDATE, DELETE ۷̼ mysql ſ .   
 ٿ 5  ̻ insert update    ߰ϸ   
   ִ. ٿ ſ  ڷḦ ԷѴٸ ٸ 忡 
̺ ϵ ϱ   ( 1000ٸ) UNLOCK  TABLES 
ϴ LOCK TABLES ϸ ȴ. ̷ ϸ      
. (**  Է ϰ ߰  Ǯٰ ٽ  Ŵ   
**)
 LOAD DATA INFILE   .
10.12 DELETE  ӵ  ġ κ 
                                <** DELETE  ȭ **>
ڵ带 ϴ ð Ȯ ε ڿ Ѵ. ڵ带 
   ε ij ũ⸦ ų  ִ. ⺻  ε ij
 1M ̴;   ϱ  Ǿ Ѵ.(   
 ִٸ 16M )
10.13 mysql ִ ӵ  
ġŷ ! mysql ġũ Ʈ  α  
 ִ. (Ϲ 'sql-bench' 丮 )   Ը¿ ° 
. ̷ ϸ   ذ  ִ ٸ ذå ã 
  ſ   ذå Ʈ  ִ.
- mysqld  ɼ .   ӵ .
  10.1 [MySQL parameters] .
- SELECT  ӵ  ϱ  ε . 
10.4 [MySQL indexes] .
-  ȿ ÷ Ÿ ȭ.    NOT NULL
 ÷ . 10.10 [Table efficiency] .
- --skip-locking ɼSQL û  ŷ ش. ӵ 
    Ѵ:
         isamchk  ̺  üũϰų ϱ    mysqladmin 
                flush-tables       ̺   ÷ؾ  Ѵ. 
(isamchk -d             tbl_name  ȴ. ֳϸ ̰  
 ̺   ֱ ̴)
         ÿ  ΰ mysql   ̺ ƮϷ 
Ѵٸ    Ͽ ΰ mysql   ȵȴ.
        --skip-locking ɼ  MIT-pthreads Ҷ  ⺻̴. 
ֳĸ  ÷ MIT-pthreads flock() ϰ    
ʱ ̴.
- Ʈ  ִٸ Ʈ ̷ ߿ .  
Ʈ ϴ  ѹ ϳ Ʈϴ ͺ  .
- FreeBSD ýۿ MIT-pthreads   FreeBSD 3.0  
 Ʈ ϴ° . ̷ ϸ н   ϴ 
 ϸ(FreBSD н   MIT-pthreads TCP/IP   
ϴ ͺ )   Ű (intergrated?)Ǿ
 Ѵ.
- ̺̳ ÷ ܰ踦 üũϴ GRANT  ߸.
10.14 ο ˰ ٸ  ΰ? 
                 VARCHAR/CHAR ؾ ϴ°?
mysql  SQL VARCHAR Ÿ . ״ mysql  ڵ带 
ϰ ̰ VARCHAR ķƮϴµ   ִ.
̺ VARCHAR, BLOB, TEXT ÷   row  size Ѵ. 
ܿ  row size Ѵ. CHAR  VARCHAR  ÷ ø
  ϰ ȴ; Ѵ trailing space  ÷ 
 ŵȴ.
isamchk -d  ̿ ̺ ϴ  üũ  ִ.
(-d  "̺ " ǹ)
mysql  ٸ ̺   ִ; , ̳, 
.
  ̺
- ⺻ . ̺ VARCHAR, BLOB, TEXT ÷   .
-  CHAR, NUMERIC, DECIMAL  ÷ ÷ ̿ space-padded  ̴. 
(** space-padded ̶ ؾ  ָŸȣؼ **)
- ſ 
- ijϱ 
- ջ   . ֳĸ  ̿ ڵ尡  ġϱ 
.
-   ڵ尡 ų  ýۿ   ø 
ġ ʴ´ٸ (isamchk ̿) ȭ ʿ.
-  ̳ ̺  ũ  ʿ Ѵ. 
̳ ̺
- ̺ VARCHAR, BLOB, TEXT ÷ ϰ   .
-  ڿ ÷ ̳ϴ.(4   ̸  ڿ  
)
- ÷ ڿ ÷ ų ('')  ÷ 0(NULL  
 ÷   ƴϴ)   Ÿ Ʈ  ڵ  տ 
ȴ. ڿ ÷ trailing space   zero ̸ 
ų  ÷ zero   Ʈ  ǥõǰ ũ 
 ʴ´.   ڴ ڳ뿡  Ʈŭ ߰Ǿ 
ȴ.
-    ̺ ũ  .
-  ̸ Ȯϴ    Ʈϸ   ȭ 
̴. ̷        isamchk -r   ؾ 
Ѵ. (?) isamchk -ei tbl_name .
- ջ  ƴ. ֳĸ ڵ尡   ȭǰ ũ
()  ̴.
- ̳  ̺ Ǵ   :
    3
    + (number of columns + 7) / 8
    + (number of char columns)
    + packed size of numeric columns
    + length of strings
    + (number of NULL columns + 7) / 8
 ũ 6 Ʈ  ִ. ̳ ڵ Ʈ ڵ尡 
þ ũȴ.  ο ũ ּ 20Ʈ  ̸, 
  Ȯ Ƹ   ũ  ̴. װ ƴ϶  ٸ 
ũ  ̴. isamchk -ed     ũ ִ  üũ 
 ִ.  ũ isamchk -r    ִ.(** ?? **)
 
There is a  penalty of 6  bytes for  each link. A  dynamic record  is 
linked whenever an update causes  an enlargement of the record.  Each 
new link will  be at  least 20 bytes,  so the  next enlargement  will 
probably go in the same link. If not, there will be another link. You 
may check how many links there are with isamchk -ed. All links may be 
removed with isamchk -r. 
GC
- б  ̺ pack_isam ƿƼ   ִ. Ȯ mysql 
      뵵 pack_isam   
 ־.
-  ڵ  mysql ǿ Ƿ pack_isam   
 pack_isam  ̺   ִ. (̺   ÷
 Ǿ ִ)
- ſ  ũ 뷮 . 
-  ڵ   ȴ.( ſ    overhead) 
ڵ  ̺  ū  ڵ忡  (1-3 Ʈ)  ȴ. 
 ÷ ٸ  ȴ.  Ÿ  :
         Ϲ  ÷ ٸ Huffman ̴̺.
         Suffic  
         Prefix  
         0   ڴ 1Ʈ .
         integer ÷    ٸ, ÷ ִ 
 Ÿ  ȴ.   BIGINT ÷    0 255
      TINIINT ÷(1Ʈ) ȴ.
         ÷   θ Ǿ ִٸ, ÷ Ÿ 
ENUM     ȯȴ.
         ÷    Ͽ Ѵ.
-  ̳ ̳   ̺ ٷ   ִ.   BLOB 
TEXT ÷ ٷ  .
- isamchk    ִ.
mysql ٸ ε Ÿ  Ѵ.  Ϲ Ÿ  NISAM
. ̰ B-tree ε̸  Ű  Ͽ (Ű +4)*0.67 
ε  ũ⸦ 밭   ִ. (̰  Ű ĵ 
 Էµ   ̴)
String indexes are  space compressed. If  the first  index part is  a 
string, it will  also be prefix  compressed. Space compression  makes 
the index file  smaller if the  string column has  a lot of  trailing 
space or is  a VARCHAR column  that is  not always used  to the  full 
length. Prefix compression helps  if there are  many strings with  an 
identical prefix. 
ڿ ε  ȴ.  ù° ε κ  ڿ̶, 
prefix ȴ. 
ڿ ÷ ٷ trailing  space ų    ̸ 
 ʴ VARCHAR ÷  space  ε   ۰ 
. prefix   ڿ  prefix   ϴ. 
{{
}}
11. mysql ġũ Ʈ
 mysql ġũ Ʈ( crash-me)    
  Ѵ.   ۼ  ʾҴ. μ 
 'bench' 丮 ڵ  캸ƾ Ѵ.(  
 캼  ִ. 
̰ ڿ  ־ SQL   Ǵ ƴ  ˷
ִ ġũ̴.
crash-me   Ǹ  Ͽ ͺ̽ ϴ  ɰ 
ɷ, ѻ  ϴ α̴.     
Ѵ:
         ϴ ÷ Ÿ
         ϴ ε 
         ϴ 
          ִ ũ
         VARCHAR ÷ ִ ũ
12. mysql ƿƼ
12.1 پ mysql α 
mysql client ̺귯 Ͽ   ϴ  mysql Ŭ
̾Ʈ  ȯ  Ѵ:
+-------------------+--------------------------------------------+
|  Name             |  Description                               |  
+-------------------+--------------------------------------------+
|  MYSQL_UNIX_PORT  |  ⺻ . ȣƮ     |  
+-------------------+--------------------------------------------+
|  MYSQL_TCP_PORT   |  ⺻ TCP/IP port                          |  
+-------------------+--------------------------------------------+
|  MYSQL_PWD        |  ⺻ н                             |  
+-------------------+--------------------------------------------+
|  MYSQL_DEBUG      |    Debug-trace ɼ              |  
+-------------------+--------------------------------------------+
|  TMPDIR           |  ӽ ̺/ Ǵ 丮      |  
+-------------------+--------------------------------------------+
MYSQL_PWD  ϴ  ȿ ϴ. 6.2 [Connecting] .
'mysql' Ŭ̾Ʈ   丮 ȯ  ϱ  
MYSQL_HISTFILE ̶  Ѵ.
 MYSQL α ſ پ ɼ ִ.   MYSQL 
 --help ɼ Ѵ. --help ɼ ̿ α پ
 ɼǿ      ִ.  , mysql --help   
.
Ʒ  mysql α ؼ ϰ ִ:
isamchk : mysql ̺   , , ȭ,  ƿƼ.   
 ֱ   忡 ڼ ϰ ִ. 13 .
make_binary_release :  ϵ mysql  ̳ʸ    . ٸ 
myql  Ǹ   ftp.tcx.e '/pub/mysql/Incoming'   ø
.
msql2mysql : msql α mysql ȯϴ  ũƮ.   
 ٷ   ȯҶ  ̴.
mysql :  SQL . (GNU readline ȣȯ) ȣȭ  ȭ
   ִ. ȭ ϴ ,    ƽŰ-
̺  µȴ. ȭ  ,    
  µȴ. (     ɼ ̿  ٲ 
 ִ)   ũƮ   ִ:
shell> mysql database < script.sql > output.tab
Ŭ̾Ʈ  ؼ   --quick ɼ  
.            mysql_store_result()   
mysql_use_result() Ѵ.
mysqlaccess : host, user, database     ũƮ.
mysqladmin : ͺ̽   ,  ̺  ε, ũ 
̺ ÷,  α      ϴ  ڿ  ƿƼ. 
mysqladmin   , μ, (status)  Ȯ 
 ִ.
mysqlbug : mysql  Ʈ ũƮ. mysql  ˸   
 ũƮ.
mysqld : SQL .  ǰ ־ Ѵ.
mysqldump : mysql ͺ̽ SQL  ̳   е 
ؽ Ϸ ϴ ƿƼ. 
mysqlimport : LOAD DATA INFILE  ؽƮ  ڷḦ ̺ 
Էϴ ƿƼ. 12.2 .
mysqlshow : ͺ̽, ̺, ÷ ε   
mysql_install_db : ⺻  MYSQL  ̺ .  ó ġ
 ȴ.
replace : msql2mysql Ǵ ƿƼ̴.  پϰ  
  ִ. ̳ ǥ Է  ڿ ü  ִ.    
ڿ Īϱ  ѵ Ȳ ýۿ (**  ??) 
 üϴµ   ִ.    ɾ  Ͽ a
 b üѴ:
shell> replace a b b a -- file1 file2 ...
safe_mysqld : mysqld   ϴ ũƮ.     
ϰ α Ͽ   ϴ     å 
.
12. 2 ؽƮ Ͽ  Է(?)ϱ
mysqlimport   ̽ LOAD DATA INFILE sql  
. κ ɼ LOAD DATA INFILE  ϴ. 7.15 [Load] .
  Ѵ:
shell> mysqlimport [options] filename ...
  ؽƮ Ͽ Ͽ, mysqlimport ̸ Ȯ
ڸ Ѵ.
     ̺   ϴµ  Ѵ. 
  vkdlfdlfmadl 'patient.txt', 'patient.text', 'patient'  
 patient ̺ ̸ Էµ ̴.
mysqlimport   ɼ Ѵ:
-C, --compress : , Ŭ̾Ʈ  ϸ /Ŭ̾Ʈ 
̿   Ѵ
-#, --debug[=option_string] : α  ()
-d, --delete : ؽƮ Ͽ Էϱ  ̺ 
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
        : LODA DATA INFILE  ɼǰ    ɼ
-f, --force :  .ؽƮ   ̺ , ٸ 
ִ    ó(if  a table  for a  text  file doesn't  exist, 
continue processing any remaining files)  ɼ   , ̺
  ´
--help :  
-h host_name, --host=host_name :  ȣƮ mysql   Ÿ 
Է. ⺻ localhost
-i, --ignore : --replace ɼ  .
-l, --lock-tables : ؽƮ Ϸ óϱ   ̺  
 Ǵ.    ̺ ȭ  ִ.
-L, --local : Ŭ̾Ʈ Է  .  ⺻, localhost
 ϸ ؽƮ   ִٰ ȴ.
-pyour_pass, --password[=your_pass] :    ϴ  
ȣ. '=your_pass'   ̳ο йȣ 
-P port_num, --port=port_num : ȣƮ   ϴ  TCP/IP 
. (localhost ƴ ȣƮ   .    н 
 ϴ )
-r, --replace : --replace  --ignore ɼ unique key  ڵ尡 
ߺǾ    쿡 ȴ.  --replcae     ,   
unique key   ִ ڵ带 üѴ. --ignore    
, unique key    ڵ ȴ.  ɼ    
ʴ´ٸ, ߺǴ Ű  ߰ߵǸ  ϰ ؽƮ   
 κ  ȴ.
-s, --silent : ħ .    .
-S /path/to/socket, --socket=/path/to/socket : ȣƮ(⺻ ȣƮ
)   ϴ  .
-u user_name, --user=user_name :    ϴ mysql 
 ̸. ⺻ н α ̸.
-v, --verbose : Verbose .  α      
.
-V, --version :   .
12.3 mysql  б  ̺ 
**  κ  . ϰ Ұ մϴ **
pack_isam  10 ̼ ̻  ϰų extended support    
   ִ ߰ ƿƼ. ̳ʸθ ϹǷ  Ư ÷
  .  40%-70% ̴.   ϹǷ
(mmap()) mmap() ۵   . ϰ  б 
 ̺ Ǹ BLOB Į  Ѵ.
   ִ mysql  б   ̺  
 д  ϴ. Ÿ ڼ  Ŵ .
13. ̺   ļ  isamchk ϱ
ͺ̽ ̺   , ̺ ,    ȭ 
 isamchk ƿƼ   ִ.     isamchk 
ϴ(ɼǿ     ), ̺  ȹ   
 ,  isamchk پ  ϱ  isamchk 
ϴ  ϰ ִ.
13.1 isamchk ɾ 
isamchk    Ѵ:
shell> isamchk [options] tbl_name
ɼ  isamchk        Ѵ.  Ʒ  Ѵ. 
(isamchk --help  ɼ      ִ) ɼ   , 
isamchk  ̺ Ѵ.     ϰų Ư 
۾ ʿϸ Ʒ ϴµ ɼ Ѵ.
tbl_name ϱ ϴ ͺ̽ ̴̺. ͺ̽ 
丮 ƴ ٸ  isamchk ϸ,  θ ؾ 
. ֳϸ isamchk ͺ̽ ġ ؼ   ϱ 
̴. , isamchk ۾Ϸ  ͺ̽ 丮  
 ƴ Ű  ʴ´; ͺ̽ ̺ شϴ  
ٸ  ϰ װ  ۾   ִ.
Ѵٸ isamchk   ̺    ִ.  
̸ ε  ̸('.ISM'  )     ̷ 
 '*.ISM'  Ͽ 丮   ̺    ִ. 
  ͺ̽ 丮 ִٸ    丮  
̺   ִ:
shell> isamchk *.ISM
If you  are not  in the  database directory,  you can  check all  the 
tables there by specifying the path to the directory:
ͺ̽ 丮  , 丮 θ Ͽ   
̺   ִ.
shell> isamchk /path/to/database_dir/*.ISM
 mysql data 丮 θ  ϵ ī带  Ͽ  
ͺ̽  ̺   ִ:
shell> isamchk /path/to/datadir/*/*.ISM
isamchk  ɼ Ѵ:
-a, --analyze
 Analyze the distribution of keys. This will make some joins in MySQL 
faster. Ű  м. mysql Ư   .
-#, --debug=debug_options
 Output   debug    log.   The    debug_options   string    often   is 
'd:t:o,filename'.
  α . debug_options ڴ  'd:t:o,filename' ̴.
-d, --description
 ̺  
-e, --extend-check
 ̺ ſ ϰ .  Ư 쿡 ʿϴ. Ϲ
 isamchk  ɼ    ã  ִ.
-f, --force
 Overwrite old temporary files.  If you use  -f when checking  tables 
(running isamchk without -r), isamchk will automatically restart with 
-r on any table for which an error occurs during checking.   
 ӽ   .   ̺ Ҷ -f  ϸ(-r   
isamchk ) isamchk ϴ   ϴ ̺ 
 -r ɼ Ѵ.
--help
  .
-i, --information
   ̺   .
-k #, --keys-used=#
 Used with -r. Tell the NISAM table handler to update only  the first 
# indexes. Higher-numbered indexes are deactivated. This can  be used 
to get  faster inserts!  Deactivated indexes  can be   reactivated by 
using isamchk 
-r.
-r  Բ . NISAM  ̺ ڵ鷯 ù # ε  Ʈ϶ 
 ˷ش. Higher-numberd(?)  ε ȴ. ̰  insert 
 Ҷ Ѵ!  ε isamchk -r  Ͽ Ȱȭ
ȴ.
-l, --no-symlinks
Ҷ ɺ ũ  ʴ´. Ϲ isamchk  ɺ 
ũ Ű ̺ Ѵ.
-q, --quick
 ϱ  -r  Բ . Ϲ  Ÿ  
ǵ帮 ʴ´; ι° -q Ͽ  Ÿ  ϵ 
  ִ.
-r, --recover
 .  ʴ unique  Ű ϰ     
.
-o, --safe-recover
 .    ; -r Ͽ ϴ  ͺ 
.  -r ٷ    쿡   ִ.
(** -r ٷ      ڳ... **)
-O var=option, --set-variable var=option
 .   Ʒ .
-s, --silent
ħ .     Ѵ. ΰ  -s(-ss) ϸ  
isamchk ſ ϰ ۾   ִ.
-S, --sort-index
 Sort index blocks. This speeds up "read-next" in applications.
ε  . ø̼ǿ "read-next" ӵ .(??)
-R index_num, --sort-records=index_num
ε  ڵ带 .  ۾ ϸ Ÿ ߽ų  ְ 
 ε  SELECT  ORDER BY ۾ ӵ ų  ִ. 
(ó ϴ ð ſ  !) ̺ ε ȣ  ã 
 SHOW INDEX Ѵ. SHOW INDEX isamchk ϴ Ͱ 
  ̺ ε ش. ε 1  Ͽ ȣ
 Ű.
-u, --unpack
 Unpack a table that was packed with pack_isam.
pack_isam   ̺  .
-v, --verbose
Verbose .  . -d  -e  Բ    ִ.  
-v (-vv, -vvv)Ͽ  ڼϰ   ִ.
-V, --version   isamchk  .
-w, --wait
̺  ɷ  ٸ.
--set-variable (-O) ɼ     :
keybuffer             default value: 520192
readbuffer            default value: 262136
writebuffer           default value: 262136
sortbuffer            default value: 2097144
sort_key_blocks       default value: 16
decode_bits           default value: 9
13.2 isamchk  
Memory allocation is important when you run isamchk. isamchk  uses no 
more memory than you specify with the -O options. If you are going to 
use isamchk on  very large files,  you should  first decide how  much 
memory you want it to use. The default is to use only about 3M to fix 
things. By  using  larger values,   you can get   isamchk to  operate 
faster. For example,  if you have  more than 32M  RAM, you could  use 
options such as  these (in addition  to any  other options you  might 
specify):
 Ҵ isamchk   ߿ϴ.isamchk -O ɼǿ 
  ̻    ʴ´. ſ ū Ͽ  isamchk 
Ϸ ϸ,       ؾ Ѵ. 
⺻  ġµ 3M Ѵ.       
isamchk   ִ.   32M ̻    ִٸ 
  ɼ   ִ. (ڰ  ɼǿ ߰Ͽ):
shell> isamchk -O sortbuffer=16M -O keybuffer=16M \
           -O readbuffer=1M -O writebuffer=1M ...
-O sortbuffer=16M  ϸ κ 쿡 ϴ.
Be aware  that isamchk  uses  temporary files  in TMPDIR.   If TMPDIR 
points to a  memory file  system, you may  easily get  out of  memory 
errors.
isamchk  TMPDIR ӽ  Ѵٴ Ϳ .  TMPDIR
   ý Ųٸ       
.
13. 3 ̺  
 涧 ٸ ͺ  ̺ ϴ  . 
 ȹ Ͽ isamchk -s   ̺    ִ. 
-s ɼ ϸ isamchk ħ  ۵ ϸ    
  Ѵ.
 Ҷ ̺ ϴ ͵  ̴.    
Ʈ ߿ ý    Ϲ    
̺(̰ "expected crashed  table"̶ Ѵ) ؾ  Ѵ. 
  '.pid' (μ ID)   Ŀ  ִٸ  ֱ 
24ð        ̺   ϱ   safe_mysqld 
isamchk ϴ Ʈ ߰ؾ Ѵ.('.pid'  mysqld  
Ҷ  Ϲ mysqld ɶ ŵȴ. ý  
Ҷ '.pid'  ִٴ   mysqld   Ǿٴ 
 Ÿ.)
  Ʈ ֱٿ  ð '.pid' Ϻ ֱ ̺ 
ϴ ̴.
 Ϲ ý ߿  ̺   ִ. TcX
 'crontab' Ͽ   Ͽ Ͽ ѹ 츮 
߿ ̺ ϵ cron ۾ :
35 0 * * 0 /path/to/isamchk -s /path/to/datadir/*/*.ISM
̷ ϸ ջ ̺   Ͽ ʿҶ ̺ 
ϰ   ִ.
⵿ 츮  ϰ ̺ ջ(ϵ  ƴ 
    ̺) 찡  츮 ϸε 
ϴ. (̰  ̴)
츮ŭ mysql  ŷڸ   ֱ 24ð  Ʈ 
 ̺   㸶 isamchk -s    õѴ.
13.4 ̺  
̺   踦   Ʒ   . ڿ 
ڼϰ    ̴.
isamchk -d tbl_name
̺      "describe() " isamchk  
. mysql  --skip-locking ɼ   ϸ, isamchk 
 Ǵ  Ʈ ̺     Ѵ. 
 isamchk describe 忡 ̺  ϱ  
Ÿ   .
isamchk -d -v tbl_name
isamchk ϴ Ϳ   ڼ   -v ɼ ߰
Ͽ verbose    ִ.
isamchk -eis tbl_name
̺  ߿  ش. ü ̺   о ϱ 
 ӵ .
isamchk -eiv tbl_name
-eiv     ǰ ִ  ش.
isamchk -d  :
ISAM file:     company.ISM
Data records:           1403698  Deleted blocks:         0
Recordlength:               226
Record format: Fixed length
table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text
isamchk -d -v  :
ISAM file:     company.ISM
Isam-version:  2
Creation time: 1996-08-28 11:44:22
Recover time:  1997-01-12 18:35:29
Data records:           1403698  Deleted blocks:              0
Datafile: Parts:        1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226
Record format: Fixed length
table description:
Key Start Len Index   Type                       Root Blocksize 
Rec/key
1   2     8   unique  double                 15845376      1024       
1
2   15    10   multip. text packed  stripped  25062400      1024        
2
3   219   8   multip. double                 40907776      1024      
73
4   63    10   multip. text packed  stripped  48097280      1024        
5
5   167   2   multip.  unsigned short        55200768      1024     
4840
6   177   4   multip.  unsigned long         65145856      1024     
1346
7   155   4   multip. text                   75090944      1024    
4995
8   138   4   multip.  unsigned long         85036032      1024       
87
9   177   4   multip.  unsigned long         96481280      1024      
178
    193   1           text
Example of isamchk -eis  :
Checking ISAM file: company.ISM
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%
Records:          1403698    M.recordlength:     226    Packed:        
     0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:  
 1.00
Recordblocks:     1403698    Deleteblocks:         0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0
User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
isamchk -eiv  :
Checking ISAM file: company.ISM
Data records: 1403698   Deleted blocks:       0
- check file-size
- check delete-chain
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
- check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
- check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%
- check records and index references
[LOTS OF ROW NUMBERS DELETED]
Records:          1403698    M.recordlength:     226    Packed:        
     0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:  
 1.00
Recordblocks:     1403698    Deleteblocks:         0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0
User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798
    ̺ Ÿ ε  ũ̴:
-rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 company.ISD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.ISM
isamchk ϴ  ŸԿ    Ʒ .  "keyfile" 
ε ̴. "Record" "row"  ̴.
ISAM file
        ISAM (index)  ̸.
Isam-version
        ISAM  .   2.
Creation time
        Ÿ   ð.
Recover time
        ε/Ÿ  ֱٿ  ð.
Data records
        ̺ ִ ڵ .
Deleted blocks
          ϰ ִ  . ̷  ̱   
̺          ȭ   ִ. 13.5.3 [ȭ] .
Datafile: Parts
         ڵ  ,   Ÿ  ִ 
˸.           ȭ ڵ尡   ȭ ̺ Data 
records  .
Deleted data
        ȸ   Ÿ Ʈ . ̷  ֱ 
           ̺ ȭ  ִ. 13.5.3 [ȭ] .
Datafile pointer
        Ÿ   ũ Ʈ. Ϲ 2,3,4,5 
Ʈ̴.          κ ̺ 2Ʈ  Ѵ.  
 mysql              .  ̺ ̴ 
ڵ ּ(address)̴.           ̺ ̴ Ʈ ּ
.
Keyfile pointer
        ε   ũ Ʈ. Ϲ 1,2,3 Ʈ
.            ̺ 2Ʈ  Ѵ.   ũ
 mysql             ȴ.   ̴ּ.
Max datafile length
        ̺  (.ISD ) ִ ũ. Ʈ.
Max keyfile length
        ̺ key file(.ISM )  ִ ũ. Ʈ.
Recordlength
         ڵ尡 ϰ ִ . Ʈ.
Record format
        ̺ ڵ带 ϴµ  .    
          ̸ ϰ ִ. 
        ٸ  Compressed  Packed ̴.
table description
        ̺  Ű .  Ű  ڼ   
:
Key
        Ű .
Start
        Where in the record this index part starts.
        ڵ忡 ε ϴ ġ.
Len
 How long this index part is. For packed numbers, this  should always 
be the full length of the column. For strings, it may be shorter than 
the full length of the indexed column, because you can index a prefix 
of a string column.
        ε κ . For  packed numbers(  ڸ  ??? 
 ̻..), ÷ ѱ̰ Ǿ Ѵ. ڿ ε 
  ̺ ۾ƾ Ѵ. ֳϸ ڿ ÷ տ ε....
Index
         ε       ִ   Ÿ
.
Type
        ε κ  Ÿ. packed, stripped, empty  ɼ 
              NISAM Ÿ Ÿ̴.
Root
        Ʈ ε  ּ.
Blocksize
         ε  ũ.⺻ 1024̴.     
              ִ.
Rec/key
 This is a statistical value used by the optimizer. It tells how many 
records there are per value for this  key. A unique key always has  a 
value of 1. This may be updated  after a table is loaded (or  greatly 
changed) with isamchk -a.  If this is not  updated at all, a  default 
value of 30 is given.
        ȭ(optimizer) ϴ   .  It tells  how 
many records there are per value  for this key. unique Ű   1 
 .   isamchk -a ̺ ε Ŀ(Ǵ ſ  
Ǿ) Ʈȴ.  Ʈ  ⺻  30 
־.
 ù° , 9° Ű κκ  Ƽ-Ʈ Ű̴.
Keyblocks used
 What percentage of the keyblocks are  used. Since the table used  in 
the examples had just been  reorganized with isamchk, the values  are 
very high (very near the theoretical maximum).
        Ű ϰ ִ .(%)  ̺ isamchk  
ȭ(reorganize)Ǿ   ſ .(̷ ִ밪  
 )
Packed
MySQL tries to pack keys with a common suffix. This can only  be used 
for CHAR/VARCHAR/DECIM
AL keys. For long strings  like names, this can significantly  reduce 
the space  used.  In the  third  example above,  the  4th key  is  10 
characters long and a 60% reduction in space is achieved.
....  ̸  long ڿ    δ.   
°  4° Ű 10  long ̰ 60%  پ.
(**   ȵǴµ ̻簰  ٿ ڿ   
   ̰ **)
Max levels
        How deep the B-tree for this  key is. Large tables with  long 
keys get high values.
Records
        ̺ ڵ.
M.recordlength
         ڵ .  渮 ڵ ̺    
 ̿ .
Packed
        MySQL strips spaces from the end of strings. The Packed value 
indicates the percentage savings achieved by doing this.
mysql ڳ  Ѵ.Packed value ̷ ؼ  
  Ѵ.
Recordspace used
        Ÿ  ϴ  .
Empty space
        Ÿ   ʴ  .
Blocks/Record
        ڵ  .(, ȭ ڵ尡  ũ  
Ǿ ִ) - ̺  1̴.     1
  ؾѴ.   ʹ Ŀ isamchk ̺ ȭ
(reorganize)ؾ Ѵ. 13.5.3 [Optimizaiton] .
Recordblocks
        ϴ (ũ).  ˿ ̰ ڵ .
Deleteblocks
         (ũ).
Recorddata
        Ÿ  ϴ Ʈ.
Deleted data
         Ͽ ( ʴ) Ʈ.
Lost space
        ڵ尡 ſ ª ̷ ƮǸ ణ   Ұ 
.   ̷  bytes հ̴.
Linkdata
         ̺    ,ڵ   ͷ  ũ
.Linkdata ̷ Ϳ ϴ   ̴.
pack_isam ̺ , isamchk -d   ̺  ÷ 
 ߰  Ѵ.̷     ǹϴ
 ؼ 12.3 [pack_isam] .
13.5 ļ  isamchk ϱ.
mysql Ÿ ϴµ ϴ   ϰ  Ʈ
Ǿ.  ͺ̽ ̺ ջ  ִ ܺ Ȳ 
 ִ:
  ߿ mysqld μ .
 ġ ϰ ǻͰ ˴ٿǾ 
        ( , ǻ   )
 ϵ 
̹  mysql ͺ̽ data ջ üũϰ ̿ ó
ϴ  ؼ Ѵ.
ջ  ۾   ͺ̽  ̺ tbl_name ͺ
 丮  Ͽ Ѵٴ Ϳ ؼ ϰ ִ   
ϴ: 
                    뵵
`tbl_name.frm'            ̺ () 
`tbl_name.ISD'            Ÿ 
`tbl_name.ISM'           ε 
  Ÿ پ   ջ Ѵ.   κ 
 Ÿ ϰ ε Ͽ .
isamchk '.ISD' (Ÿ)  纹  ۾  Ѵ.  
'.ISD'  ϰ ο    ̸ ٲٸ鼭 
 ۾ ģ. --quick ɼ ϸ isamchk ӽ  '.ISD' 
  ʴ´.  '.ISD'  Ȯϴٰ Ͽ  '.ISD' 
 մ  ʰ ο   ε ϸ Ѵ.  isamchk  ڵ 
'ISD'  ջǾ Ȯϰ ջǾ   ۾ 
Ƿ --quick ɼ ϴ  ϴ. ΰ -quick ɼ 
  ִ. ̷  Ư (ߺ Ű ) Ҹ   
 '.ISD'  Ͽ  ذϷ Ѵ.Ϲ  ΰ 
--quick ɼ ϴ   ۾ ϱ  ũ   
  쿡 ϴ. ̷  isamchk  ϱ ּ 
  ƾ Ѵ.
13.5.1   ̺  
̺ ϱ    Ѵ:
:
isamchk tbl_name
          99.99% ߰  ִ.    ߰ ϴ 
 Ÿ ϰ õ ջ̴.(Ϲ   ʴ´) 
̺ ϰ Ѵٸ Ϲδ ƹ ɼ  ʰų -s  
--silent ɼ ־ isamchk ϴ ̴. 
isamchk -e tbl_name
         ɼ    ϰ Ѵ.( -e   "extended 
check"  ǹѴ)  Ű Ȯ ڵ带 Ű  ִ 
.It does a check-read of every key for each row to verify that they 
indeed point to the correct row.  Ű  ū  ̺ ð
  ɸ. isamchk Ϲ ù°  ߰ϸ  
.      Ѵٸ, --verbose (-v) ɼ ߰   
ִ.  ɼ ߰ϸ isamchk  ִ 20    
  Ѵ. Ϲδ  isamchk (̺ ̸  ܿ ƹ 
μ ) ϴ.
isamchk -e -i tbl_name
         ɰ .  -i ɼ ̸  isamchk  
踦 Ѵ.
13.5.2 ̺ 
ջ ̺ ¡Ĵ Ϲ ǰ ڱ ǰ    
 :
`tbl_name.frm' is locked against change
Can't find file `tbl_name.ISM' (Errcode: ###)
Got error ### from table handler (Error 135 is an exception in this 
case)
Unexpected end of file
Record file is crashed
̷ , ̺ ľ Ѵ. isamchk Ϲ ߸   
ϰ κ ģ.
  Ʒ ϴ´ 4ܰ谡 ִ.ϱ    
Ÿ̽ 丮 ̵ϰ(cd   ̿) ̺   ۹̼ 
Ȯؾ Ѵ. mysqld   մ н ڰ   ִ 
Ȯؾ Ѵ. ( ۾ Ϸ . ֳϸ Ϸ Ͽ 
ؾ ϱ ̴)  ؾ Ѵٸ Ͽ    
 Ѵ.
1ܰ : ̺ 
isamchk *.ISM Ǵ ( ð ִٸ isamchk -e  *.ISM). ʿ 
   -s (silent) ɼ Ѵ.
isamchk  ִٰ ˸ ̺ ľ Ѵ.  ̷ ̺ 
 2ܰ Ѿ.
ϸ鼭   (out of memory  ) Ǵ  isamchk 
 ߾  3ܰ Ѿ.
2ܰ :   
 isamchk -r -r tbl_name  õѴ. (-r -q "   " 
ǹ) ̰ Ÿ  մ  ʰ ε    õѴ. 
Ÿ   Ǿ ְ  ũ Ÿ ϳ  Ȯ 
ġ Ű ִٸ, Ȱϰ  ۵ ϰ ̺ ĥ  ̴.(If 
the data file contains everything that it should and the delete links 
point at the correct locations within the data file, this should work 
and the table is fixed.)  ̺ ġ. װ ƴ϶   
 Ѵ:
        1. ϱ  Ÿ   
        2. isamchk -r tbl_name .(-r   " " ǹ)   
Ÿ  Ͽ Ȯ  ڵ  ڵ带 ϰ ε
   籸Ѵ.
        3.   ϸ, isamchk --safe_recover tbl_name 
.     Safe recovery     ϸ  Ϲ  
      쿡   ִ.(  )
ϸ鼭   (out of memory  ) Ǵ  isamchk 
 ߾  3ܰ Ѿ.
3ܰ :  
ε  ù 16k  ıǰų Ȯ    
 , Ǵ ε   쿡 ̹ ܰ ´. ̰ 
ο ε   Ѵ.   :
        1. Ÿ   ҷ ̵.
        2.  ο()  Ÿ  ε        table 
description    :
                shell> mysql db_name
                mysql> DELETE FROM tbl_name;
                mysql> quit
        3.  Ÿ  Ӱ   Ϸ . (
  Ÿ  ο Ϸ ű ; ߸Ǿ  纻
  ϱ  ̴)
2ܰ . isamchk -r -q   ۵  ̴.  ( 
 Ǹ ȵȴ. This shouldn't be an endless loop).
4ܰ : ſ  
description    ջ   Ծ 쿡 ̹  ܰ  ´. 
description  ̺  Ŀ   ʱ , ̷
   ܼ ȵȴ.
        1.  description   3ܰ Ѿ.  
 ε            ְ 2ܰ  Ѿ.    
isamchk -r   ؾ Ѵ.
        2.   Ȯ  ̺   ˰ 
ٸ,          ͺ̽ ̺ 纻 . ο 
Ÿ    ϰ ٸ ͺ̽ description  ε 
 ջ   ͺ̽ ű. ̷ ϸ ο  description  
ε        Ÿ ϸ  ִ.  2ܰ 
 ε          籸Ѵ.
13.5.3 ̺ ȭ
ڵ带 ϰų ̵ ϸ鼭   ȭ ڵ带   
ʿϰ   ϱ     isamchk  
:
        shell> isamchk -r tbl_name
SQL OPTIMIZE TABLE  ̿Ͽ    ̺ ȭ   
ִ. OPTIMIZE TABLE   isamchk  .
 isamchk ̺  ų  ִ   ɼ  
 ִ:
-S, --sort-index
        high-low  ε Ʈ  . ˻ ȭϰ Ű
          ̺ ˻  Ѵ.
-R index_num, --sort-records=index_num
        ε  ڵ带 . Ÿ ȭϰ   ε 
ϴ        SELECT   ORDER BY  ۷̼ ӵ  Ų. 
(ó      ϴ ð û !) ̺ ε ȣ 
ȮϷ      SHOW INDEX ϸ Ǹ, SHOW INDEX isamchk 
  ˻ϴ  ̺ ε ش. ε  1
 ȣ  Ű.
-a, --analyze
        ̺ Ű  м. ߿ ̺ ڵ带  
            Ų.
14 Adding new functions
                                                 to MySQL
There are two ways to add new functions to MySQL:
You can add  the function through  the user-definable function  (UDF) 
interface. User-definable functions are added and removed dynamically 
using the CREATE FUNCTION and DROP FUNCTION statements. See section
7.29 CREATE FUNCTION/DROP FUNCTION syntax.
You can  add the  function as  a native  (built  in) MySQL  function. 
Native functions  are  compiled into  the  mysqld server  and  become 
available on a permanent basis.
Each method has advantages and disadvantages:
If you write a user-definable  function, you must install the  object 
file in addition to the server  itself. If you compile your  function 
into the server, you don't need to do that.
You can add  UDFs to  a binary MySQL  distribution. Native  functions 
require you to modify a source distribution.
If you upgrade your MySQL distribution, you can continue to  use your 
previously-installed UDFs. For native functions, you must repeat your 
modifications each time you upgrade.
Whichever method you use to add new functions, they may be  used just 
like native functions such as ABS() or SOUNDEX().
14.1 Adding a new user-definable function
For the UDF mechanism to work, functions must be written in C  or C++ 
and your operating  system must  support dynamic  loading. The  MySQL 
source distribution includes a file `sql/udf_example.cc' that defines 
5 new functions. Consult this file to see how UDF calling conventions 
work.
For each function that you want to use in SQL statements,  you should 
define corresponding C (or C++)  functions. In the discussion  below, 
the name ``xxx'' is used for an example function name. To distinquish 
between SQL   and C/C++  usage, XXX()   (uppercase) indicates  a  SQL 
function call, and xxx() (lowercase) indicates a C/C++ function call.
The C/C++ functions  that you  write to implement  the inferface  for 
XXX() are:
xxx() (required)
 The main function. This  is where the  function result is  computed. 
The correspondence between the SQL type and return type of your C/C++ 
function is shown below:
+------------+--------------+
|  SQL type  |  C/C++ type  |  
+------------+--------------+
|  STRING    |  char *      |  
+------------+--------------+
|  INTEGER   |  long long   |  
+------------+--------------+
|  REAL      |  double      |  
+------------+--------------+
xxx_init() (optional)
 The initialization function for xxx(). It can be used to:
Check the number of arguments to XXX()
Check that the arguments are  of a required type, or,  alternatively, 
tell MySQL to coerce  arguments to the types  you want when the  main 
function is called Allocate any memory required by the main function
Specify the maximum length of the result
Specify (for REAL functions) the maximum number of decimals
Specify whether or not the result can be NULL
xxx_deinit() (optional)
 The deinitialization function  for xxx(). It  should deallocate  any 
memory allocated by the initialization function.
When a SQL  statement invokes XXX(),  MySQL calls the  initialization 
function xxx_init() to  let it  perform any required  setup, such  as 
argument checking  or memory   allocation. If xxx_init()  returns  an 
error, the SQL  statement is aborted  with an  error message and  the 
main and deinitialization  functions are not  called. Otherwise,  the 
main function xxx() is called once for each row. After all  rows have 
been processed, the deinitialization function xxx_deinit() is  called 
so it can perform any required cleanup.
All functions must be  thread-safe (not just  the main function,  but 
the initialization  and  deinitialization functions   as well).  This 
means that  you are  not allowed  to allocate  any  global or  static 
variables that change! If you need memory, you should allocate  it in 
xxx_init() and free it in xxx_deinit().
14.1.1 UDF calling sequences
The main function should  be declared as  shown below. Note that  the 
return type  and parameters  differ, depending  on whether   you will 
declare the SQL function XXX() to  return STRING, INTEGER or REAL  in 
the CREATE FUNCTION statement:
For STRING functions:
char *xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *result, unsigned long *length,
              char *is_null, char *error);
For INTEGER functions:
long long xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);
For REAL functions:
double xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);
The initialization and deinitialization  functions are declared  like 
this:
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void xxx_deinit(UDF_INIT *initid);
The initid parameter is passed to all three functions. It points to a 
UDF_INIT structure that  is used to  communicate information  between 
functions. The   UDF_INIT structure  members are   listed below.  The 
initialization function should fill in any members that it  wishes to 
change. (To use the default for a member, leave it unchanged.)
my_bool maybe_null
xxx_init() should set maybe_null to 1  if xxx() can return NULL.  The 
default value is 1 if any of the arguments are declared maybe_null.
unsigned int decimals
 Number of  decimals. The  default  value is  the maximum   number of 
decimals in the arguments passed to the main function.  (For example, 
if the function is passed 1.34,  1.345 and 1.3, the default would  be 
3, since 1.345 has 3 decimals.
unsigned int max_length
 The maximum length of the  string result. The default value  differs 
depending on the result type  of the function. For string  functions, 
the default  is  the length   of the longest   argument. For  integer 
functions, the default is 21 digits. For real functions,  the default 
is 13 plus the number of decimals indicated by initid->decimals. (For 
numeric functions,  the length  includes any  sign or   decimal point 
characters.)
char *ptr
 A pointer  that the   function can use   for its own  purposes.  For 
example, functions   can use   initid->ptr to  communicate  allocated 
memory between  functions. In   xxx_init(), allocate the  memory  and 
assign it to this pointer:
initid->ptr = allocated_memory;
In xxx() and xxx_deinit(), refer to initid->ptr to use  or deallocate 
the memory.
14.1.2 Argument processing
The args  parameter points  to  a UDF_ARGS  structure which   has the 
members listed below:
unsigned int arg_count
 The number  of arguments.  Check this  value in   the initialization 
function if you  want your function  to be  called with a  particular 
number of arguments. For example:
if (args->arg_count != 2)
{
    strcpy(message,"XXX() requires two arguments");
    return 1;
}
enum Item_result *arg_type
 The  types  for   each argument.   The  possible   type values   are 
STRING_RESULT,  INT_RESULT   and REAL_RESULT.   To   make sure   that 
arguments are of a given  type and return an  error if they are  not, 
check the arg_type array in the initialization function. For example:
if (args->arg_type[0] != STRING_RESULT
      && args->arg_type[1] != INT_RESULT)
{
    strcpy(message,"XXX() requires a string and an integer");
    return 1;
}
As an alternative  to requiring  your function's arguments  to be  of 
particular types, you can use the initialization function to  set the 
arg_type elements to the types you want. This causes MySQL  to coerce 
arguments to those  types for  each call  to xxx().  For example,  to 
specify coercion of the first two arguments to string and integer, do 
this in xxx_init():
args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;
char **args
args->args communicates  information to  the initialization  function 
about the general nature  of the arguments  your function was  called 
with. For a constant argument i, args->args[i] points to the argument 
value. (See   below for  instructions  on how   to access  the  value 
properly.)  For  a  non-constant  argument,  args->args[i]  is  0.  A 
constant argument is an expression that uses only constants,  such as 
3 or 4*7-2  or SIN(3.14).  A non-constant argument  is an  expression 
that refers to values that may change from row to row, such as column 
names or functions that are  called with non-constant arguments.  For 
each invocation of the main function, args->args contains  the actual 
arguments that are passed for the row currently being processed.
Functions can refer to an argument i as follows:
An argument of type STRING_RESULT is given as a string pointer plus a 
length, to allow handling of binary data or data of arbitrary length. 
The string contents  are available  as args->args[i]  and the  string 
length is args->lengths[i].  You should not  assume that strings  are 
null-terminated.
For an argument of type INT_RESULT, you must cast args->args[i]  to a 
long long value:
long long int_val;
int_val = *((long long*) args->args[i]);
For an argument of type REAL_RESULT, you must cast args->args[i] to a 
double value:
double    real_val;
real_val = *((double*) args->args[i]);
unsigned long *lengths
 For the  initialization function,  the lengths  array indicates  the 
maximum string length for each  argument. For each invocation of  the 
main function,  lengths contains  the actual  lengths of   any string 
arguments that are passed for the row currently being  processed. For 
arguments of types INT_RESULT or REAL_RESULT, lengths  still contains 
the maximum   length of   the argument  (as  for  the  initialization 
function).
14.1.3 Return values and error handling
The initialization function should return 0 if no error  occurred and 
1  otherwise.  If   an error   occurs,  xxx_init()   should store   a 
null-terminated error message in  the message parameter. The  message 
will   be   returned  to   the   client.   The   message  buffer   is 
MYSQL_ERRMSG_SIZE characters long,  but you  should try  to keep  the 
message to less than  80 characters so  that it fits  the width of  a 
standard terminal screen.
The return value of  the main function  xxx() is the function  value, 
for long long and double functions. For string functions,  the string 
is returned in the result and length arguments. result is a buffer at 
least 255 bytes  long. Set these  to the contents  and length of  the 
return value. For example:
memcpy(result, "result string", 13);
*length = 13;
The string function return value normally also points to the result.
To indicate a return value of NULL in the main function,  set is_null 
to 1:
*is_null = 1;
To indicate  an error  return in  the main  function,  set the  error 
parameter to 1:
*error = 1;
If xxx() sets *error to 1 for any row, the function value is NULL for 
the current   row and   for any  subsequent  rows  processed  by  the 
statement in which XXX() was invoked. (xxx() will not even  be called 
for subsequent rows.) Note: In  MySQL versions prior to 3.22.10,  you 
should set both *error and *is_null:
*error = 1;
*is_null = 1;
14.1.4 Compiling and installing user-definable functions
Files implementing UDFs must  be compiled and  installed on the  host 
where the  server  runs. This   process is described   below for  the 
example UDF  file  `udf_example.cc' that  is  included in  the  MySQL 
source distribution. This file contains the following functions:
metaphon() returns a metaphon string of the string argument.  This is 
something like a soundex string, but it's more tuned for English.
myfunc_double() returns the sum of the ASCII values of the characters 
in its arguments, divided by the sum of the length of its arguments.
myfunc_int() returns the sum of the length of its arguments.
lookup() returns the IP number for a hostname.
reverse_lookup() returns the hostname for an IP number.  The function 
may be called with a string "xxx.xxx.xxx.xxx" or four numbers.
A dynamically-loadable file should be  compiled as a sharable  object 
file, using a command something like this:
shell> gcc -shared -o udf_example.so myfunc.cc
You can easily find out the correct compiler options for  your system 
by running this command in the  `sql' directory of your MySQL  source 
tree:
shell> make udf_example.o
You should  run  a compile   command similar  to the   one that  make 
displays, except that you should remove the -c option near the end of 
the line and add -o udf_example.so to  the end of the line. (On  some 
systems, you may need to leave the -c on the command.)
Once you compile a shared object containing UDFs, you must install it 
and   tell  MySQL   about  it.   Compiling  a   shared   object  from 
`udf_example.cc'    produces   a    file    named   something    like 
`udf_example.so' (the exact name may vary from platform to platform). 
Copy this file to some directory searched by ld, such  as `/usr/lib'. 
On many   systems, you  can set   the LD_LIBRARY  or  LD_LIBRARY_PATH 
environment variable to point  at the directory  where you have  your 
UDF function files. The  dopen manual page  tells you which  variable 
you should use on your system. You should set this in mysql.server or 
safe_mysqld and restart mysqld.
After the library is installed, notify mysqld about the new functions 
with these commands:
mysql>    CREATE   FUNCTION    metaphon    RETURNS   STRING    SONAME 
"udf_example.so";
mysql>   CREATE   FUNCTION    myfunc_double   RETURNS   REAL   SONAME 
"udf_example.so";
mysql>   CREATE   FUNCTION    myfunc_int   RETURNS   INTEGER   SONAME 
"udf_example.so";
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
mysql>   CREATE  FUNCTION   reverse_lookup   RETURNS  STRING   SONAME 
"udf_example.so";
Functions can be deleted using DROP FUNCTION:
mysql> DROP FUNCTION metaphon;
mysql> DROP FUNCTION myfunc_double;
mysql> DROP FUNCTION myfunc_int;
mysql> DROP FUNCTION lookup;
mysql> DROP FUNCTION reverse_lookup;
The CREATE FUNCTION  and DROP FUNCTION  statements update the  system 
table func  in the  mysql  database. The  function's name,   type and 
shared library name are saved in the table. You must have  the insert 
and delete  privileges for  the  mysql database  to create   and drop 
functions.
You should not use CREATE FUNCTION to add a function that has already 
been created. If you need to reinstall a function, you  should remove 
it with DROP FUNCTION and then reinstall it with CREATE FUNCTION. You 
would need to do this, for example, if you recompile a new version of 
your function, so  that mysqld  gets the new  version. Otherwise  the 
server will continue to use the old version.
Active functions are reloaded each time the server starts, unless you 
start mysqld with the --skip-grant-tables  option. In this case,  UDF 
initialization is   skipped and   UDFs are  unavailable.  (An  active 
function is one  that has been  loaded with  CREATE FUNCTION and  not 
removed with DROP FUNCTION.)
14.2 Adding a new native function
The procedure for adding  a new native  function is described  below. 
Note that you cannot  add native functions  to a binary  distribution 
since the procedure  involves modifying MySQL  source code. You  must 
compile MySQL yourself from a source distribution. Also note  that if 
you migrate to another version of MySQL (e.g., when a new  version is 
released), you   will need  to  repeat the   procedure with  the  new 
version.
To add a new native MySQL function, follow these steps:
Add one  line  to `lex.h'   that defines  the function   name in  the 
sql_functions[] array.
Add two lines to `sql_yacc.yy'. One indicates the preprocessor symbol 
that yacc should define (this should be added at the beginning of the 
file). Then define the function  parameters and add an ``item''  with 
these parameters to  the simple_expr  parsing rule.  For an  example, 
check all occurrences of SOUNDEX in `sql_yacc.yy' to see how  this is 
done.
In `item_func.h', declare  a class inheriting  from Item_num_func  or 
Item_str_func, depending on whether your function returns a number or 
a string.
In `item_func.cc', add one  of the following declarations,  depending 
on whether you are defining a numeric or string function:
double   Item_func_newname::val()
longlong Item_func_newname::val_int()
String  *Item_func_newname::Str(String *str)
You should probably also define the following function:
void Item_func_newname::fix_length_and_dec()
This function should at least calculate max_length based on the given 
arguments.  max_length  is  the  maximum  number  of  characters  the 
function may return. This function should also set maybe_null =  0 if 
the main function can't return a  NULL value. The function can  check 
if any of  the function  arguments can  return NULL  by checking  the 
arguments maybe_null variable.
All functions must be thread-safe.
For string functions, there are some additional considerations  to be 
aware of:
The String *str argument provides a string buffer that may be used to 
hold the result.
The function should return the string that holds the result.
All current  string  functions try  to  avoid allocating  any  memory 
unless absolutely necessary!
15. mysql ODBC 
mysql MyODBC α  ODBC   Ѵ.
15.1 MyODBC  ϴ ü
MyODBC  95 NT 32Ʈ ODBC(2.50)  0 ̴̹. 
   3.x   α ֱ ٶ.
(** ,  ɷ¾ȵ **)
15.2 MyODBC  ִ 
ODBC  ,   Admndemo.exe,  C++-,  Centura   Team  Developer 
(formerly Gupta SQL/Windows), ݵǻ(ֶ), ũŻ  Ʈ, 
, ,  iHTML, FileMaker  Pro, ,   Notes  4.5/4.6, 
SBSS, perl DBD-ODBC, Ķ, Ŀ, VC++, ־  
õǾ. 
MyODBC   ۵ϴ ٸ  ø̼  myodbc@tcx.se   
  ּ~ (**   ־ μ **)
 εġ, ODBC Ŵ α ϰ MyODBC α ؼ 
˰ ʹ. ̷    ̳ ̴µ   
̴.
MyODBC log   MyODBC / ȭ 'Trace  MyODBC' 
ǿ üũ Ѵ. 
α״ `c:\myodbc.log'  ϵ ̴.  ɼ   ۵Ϸ 
MYSQL2.DLL  ƴ϶ MYSQL.DLL  ؾ Ѵٴ  !
15.3 MyODBC   ۵ϴ α
κ α myodbc   ۵Ѵ.  Ʒ   Ͽ 
ִ  츮  Ͽų ٸ    ۵Ѵٰ 
Ȯ  ̴::
ʹ  ۵Ѵ:
        - ̺ ̸Ӹ Ű ؾ Ѵ.
        - Ʈ DZ ϴ  ̺ timestamp   
  .
        - double float ʵ常 ؾ Ѵ. single floats   
 ϸ         Ѵ.
        - mysql   'Return matching rows' ɼ ʵ忡 üũ 
.
        - NT  BLOB ÷ OLE OBJECTS  Ѵ.  
        MEMO ÷  ϸ ALTER  TABLE  ̿ ÷  TEXT 
         ٲ.
 
 ۵Ѵ   ִ:
        dates    CONCAT() Լ Ͽ string 
      select  . 
         :
        select      CONCAT(rise_time),     CONCAT(set_time)      from 
sunrise_sunset;
ڿμ   97 time   νĵ ̴.
  CONCAT()  ODBC ÷ "string  type" 
 ̴ ̴. CONCAT()   , ODBC ÷ time  Ÿ 
νϸ  ̰ ϴµ Ѵ.
̰        .    ڵ  ڿ
(string) time ȯѴ. ҽ ؽƮ ̶    ̴. 
 ҽ  ÷ Ȯ Ÿ ϴ ODBC ̶ и
  ̴.
 odbcadmin
ODBC Ʈ α.
 
DBE 3.2        ؾ Ѵ. mysql      'Don't 
optimize column width' ɼ ʵ忡 üũ Ѵ.
,  myodbc   ODBC ϰ BDE  ϱ  
   ڵ尡 ִ. (BDE     
    ִ BDE  Alias  ʿ Ѵ) : (Thanks  to 
Bryan Brunton bryan@flesherfab.com for this)
fReg:= TRegistry.Create;
          fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
          fReg.WriteString('Database', 'Documents');
          fReg.WriteString('Description', ' ');
          fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
          fReg.WriteString('Flag', '1');
          fReg.WriteString('Password', ");
          fReg.WriteString('Port', ' ');
          fReg.WriteString('Server', 'xmark');
          fReg.WriteString('User', 'winuser');
          fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC  Data  Sources', 
True);
          fReg.WriteString('DocumentsFab', 'MySQL');
          fReg.CloseKey;
          fReg.Free;
          Memo1.Lines.Add('DATABASE NAME=');
          Memo1.Lines.Add('USER NAME=');
          Memo1.Lines.Add('ODBC DSN=DocumentsFab');
          Memo1.Lines.Add('OPEN MODE=READ/WRITE');
          Memo1.Lines.Add('BATCH COUNT=200');
          Memo1.Lines.Add('LANGDRIVER=');
          Memo1.Lines.Add('MAX ROWS=-1');
          Memo1.Lines.Add('SCHEMA CACHE DIR=');
          Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
          Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
          Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
          Memo1.Lines.Add('SQLQRYMODE=');
          Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
          Memo1.Lines.Add('ENABLE BCD=FALSE');
          Memo1.Lines.Add('ROWSET SIZE=20');
          Memo1.Lines.Add('BLOBS TO CACHE=64');
          Memo1.Lines.Add('BLOB SIZE=32');
          AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
 C++
BDE 3.0  ߴ. ϰ ˷  ̺  Ű 
   ʵ尡 Ʈ ʴ´.  BDE   ƴ  
 index PRIMARY  ̸Ӹ Ű ν ϴ  
δ.
 Tested with BDE 3.0. The only  known problem is that when the  table 
schema changes, query fields  are not updated.  BDE however does  not 
seem to recognize primary keys,  only the index PRIMARY, though  this 
has not been a problem.
 ־ 
̺ Ʈ ϰ Ϸ  ̺ ̸Ӹ Ű  ؾ 
Ѵ.
(**  κ    ps Ͽ µ Ʈ  ֳ... 
**)
15.4 ODBC  α  
 95  ̸ ϴ Ϳ   ִ:
-  IP ּ .
-'lmhosts' Ͽ   ߰:
        ip hostname
 
        194.216.84.21 my
- DNS Ͽ PC 
"ODBC setup"  ä :
Windows DSN name:   taejun
Description:        This is my love database
MySql Database:     love
Server:             194.216.84.21
User:               taejun
Password:           my_password
Port:
 DSN ̸ ʵ   ODBC ¾  ̴.
ODBC ¾ ȭ鿡 , , н,  ʵ忡   ʿ
 .   صθ    õ   ⺻ 
ȴ.   ٲ  ִ.
Ʈ ȣ ־ , ⺻ Ʈ(3306) ȴ.
15.5 ODBC AUTO_INCREMENT ÷  
Ϲ  INSERT    ڵ Ǵ ID    
  ̴ִ.   ODBC            ִ.   (auto   
AUTO_INCREMENT ʵ ):
INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();
Ǵ, ٸ ̺ ID ԷѴٸ     ִ:
INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
ٸ ODBC ø̼(ּ ̿ ) ϰ  ϱ 
  Ǹ Ӱ Էµ  ãµ   ִ:
SELECT * FROM tbl_name WHERE auto IS NULL;
17. Ϲ  ذ 
17. 1. ͺ̽ (?)
ͺ̽ ϴ  Ϲ  Ʈ α ̿ϴ 
̴. 9.2 [The update log] .   ͷ ۵ϴ ͺ
̽ ϳ(Ͱ  ) ̺ ۵ϴ ٸ  ϳ 
ͺ̽   ʿϴ.  ̺긦   ƮϷ     mysql   < 
update_log ϸ ȴ. ̵ ͺ̽ ´ ȣƮ, , 
 ɼ Ѵ.  Է°  ͺ̽  
Ʈ α Ѵ.
̺   ٸ,  縦   ( 
 ð  ) ̺  Էµǰų    ãƳ   
TIMESTAMP ÷   ְ ̷Ǵ ͺ̽  ڷ
 縦 Ѵ.
Ʈ α(for deletes) timestamps(on both sides)   
 ΰ  Ʈϴ ý   ִ.  ̷ 
 ΰ ends(?)   Ϳ 浹    ־
 Ѵ. Ƹ   ƮǾ ϱ     
ϰ  ̴.
It is  possible to  make a  two-way updating  system  using both  the 
update log (for deletes) and timestamps (on both sides). But  in that 
case you must  be able to  handle conflicts when  the same data  have 
been changed in both ends. You probably want to keep the  old version 
to help with deciding what has been updated.
  () SQL ̷ , ͺ̽ 
Ʈϴ 忡  Լ ؼ ȵȴ;   
ͺ̽   ȯ   ִ:
     DATABASE()
     GET_LOCK() and RELEASE_LOCK()
     RAND()
     USER(), SYSTEM_USER() or SESSION_USER()
     VERSION()
timestamp ʿ 쿡 ̷Ǵ       time 
Լ ϰ   ִ. LAST_INSERT_ID()  ϰ  
 ִ.
All time functions are safe to use,  as the timestamp is sent to  the 
mirror if needed. 
LAST_INSERT_ID() is also safe to use.
17.2 ͺ̽ 
mysql ̺ Ϸ DZ   ϱⰡ .  ϰ  
۾    õ ̺   LOCK TABLES  .  7.23  [LOCK 
TABLES/UNLOCK TABLES syntax] .  б   ʿϴ; 
ͺ̽ 丮  纻   ȿ ٸ  忡 
̺ Ǹ      ִ.  SQL    ϰ  Ѵٸ 
SELECT INTO OUTFILE   ִ.
ͺ̽ ϴ ٸ  mysqldump α ϴ  
̴:
ͺ̽  Ǯ  :
     
shell> mysqldump --tab=/path/to/some/dir --lock-tables --opt
       Ʈ    ʴ  ϰ    ̺  
(`*.frm', `*.ISD' , `*.ISM' )   ִ. mysqld ǰ 
 ߾ Ѵ.  --log-update ɼ ٽ . 
''hostname.n'   α   ̴. n mysqladmin 
refresh, mysqladmin flush-logs, the FLUSH LOGS , Ǵ  
Ҷ ϴ ̴. ̷  α   ̿ mysqldump
 ϰ  ͺ̽ ȭ  ()ϴµ ʿ 
   ִ. 
     
ϰ Ѵٸ,  isamchk  -r  ̺ .   
 99.9%  ȴ. isamchk ϸ   
:
       
      mysqldump  Ѵ.
     Ʈ α Ʈ ٽ ϱ    
Ѵ:
     
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls Ȯ  α  µ ȴ.
 SELECT * INTO OUTFILE 'file_name' FROM tbl_name  ̿ 
      ڵ尡  ߺǴ   ϱ   LOAD 
DATA INFILE 'file_name' REPLACE ...   ̿   ִ. ̰
 ̺ PRIMARY Ű  UNIQUE Ű ʿϴ. REPLACE  Ű 
ο ڵ忡 unique Ű     ڵ尡 ߺǴ   
 ڵ带 ο ڵ üѴ.
17.3  ӽſ  mysqld  ϱ
 ӽſ   ϱ   ִ.   ,  
 ״ ΰ ο mysql  ϴ 찡   
. Ǵ ٸ 鿡  mysql ġ ϱ ϴ ͳ 
   ִ.
  ϱ ϸ,    ٸ TCP/IP Ʈ  
Ϸ ؼ   TCP/IP Ʈ    û
 ʵ   ִ.
̹ ϰ ִ  ⺻ Ʈ  Ϸ Ǿ  ִٰ 
غ.     ο  :
shell> ./configure  --with-tcp-port=port_number \
             --with-unix-socket=file_name \
             --prefix=/usr/local/mysql-3.22.9
⼭ port_number file_name ⺻ Ʈ     ο
 ϸ, --prefix   ġǾ ִ mysql ٸ 
 ؾ Ѵ.
Here port_number and file_name should  be different than the  default 
port number and socket file  pathname, and the --prefix value  should 
specify an installation directory different than the one  under which 
the existing MySQL installation is located.
   ǰ ִ mysql  ϰ   Ȯ 
 ִ:
shell>; mysqladmin -h hostname --port port_number variables
ϰ ִ Ʈ ǰ ִ mysql  ִٸ,  ̸ 
 mysql  ߿      ִ.  mysqld 
 ϰ Ű   ý ʱȭ  ũƮ(Ϲ 
''mysql.server') ؾ Ѵ.
ٸ Ʈ   ϱ  ο mysql   
 ʿ . 
safe_mysqld   ɼ Ʈ    ִ:
shell>; /path/to/safe_mysqld --socket=file-name --port=file-name
 ͺ̽ 丮 α ϵ ϸ鼭   ٸ 
 ϰ Ѵٸ, safe_mysqld  --log  --log-update   ̿
 α  ̸  ־ Ѵ.      
 α Ͽ  Ϸ  ̴.
 : Ϲ  ͺ̽ ڷḦ Ʈϴ ΰ 
 ؼ ȵȴ! ü fault-free ý  ŷ(locking)
  ʴ´ٸ,       ̴.
(** fault-free Ȯ  ڱ. Ƹ   Ŵµ 
 ִٸ   ϴ  Դϴ. **)
ι     ٸ   ͺ̽  丮   ϱ  ϸ 
safe_mysqld  --datadir=path ɼ   ִ.
ٸ Ʈ  mysql   ϱ Ѵٸ    
  ִ:
           Ŭ̾Ʈ     ɼ     .   --host 
'hostname'         --port=port-numer    or   [--host    localhost] 
--socket=file-name.
         C  α mysql    Ʈ   
ڸ  .
            Ŭ̾Ʈ   ϱ        MYSQL_UNIX_PORT        
                      MYSQL_TCP_PORT ȯ  . Ϲ Ư 
̳        Ʈ ϸ,  'login' Ͽ ȯ   . 
12.1 [Programs]         .
         Ȩ 丮 '.my.cnf' Ͽ ⺻ ϰ TCP/IP  
.   4.15.4 [Option files] .
18 MySQL client tools 
                                                and APIs
18.1 MySQL C API
C API ڵ MYSQL  Բ Ǹ, ̰ mysqlclient  ̺귯 
ԵǾ C α Ͽ ͺ̽   ֵ 
. MySQL ҽ    Ŭ̾Ʈ  C ڵǾ ,  C 
API ϴ    ã    Ŭ̾Ʈ ڵ
   ִ.
18.2 C API datatypes
+--------------------+---------------------------------------------+
|          |                                         |
+--------------------+---------------------------------------------+
| MYSQL              |  ̽ ϳ  ٷ      |
|                    | üμ   MySQL Լ鿡       |
|                    | ȴ.                                   |
+--------------------+---------------------------------------------+
| MYSQL_RES          |  ϴ ǵ(SELECT, SHOW,          |
|                    | DESCRIBE, EXPLAIN)  ǥϴ        |
|                    | üμ   μ ϵǴ    |
|                    |   (result set)̶ θ.  |
+--------------------+---------------------------------------------+
| MYSQL_ROW          |    ǥϴ  ̴.  |
|                    |  ̰ counted byte string         |
|                    | 迭 Ǿ ִ. ʵ尪          |
|                    |    ִ 쿡  ο  |
|                    | null Ʈ    ֱ     |
|                    |    null-terminated string |
|                    | ٷ  .                               |
|                    |  mysql_fetch_row() Լ ȣ        |
|                    | ν   ִ.                    |
+--------------------+---------------------------------------------+
| MYSQL_FIELD        | ʵ , , ũ  ʵ忡       |
|                    |  ϴ ü̴.  ü     |
|                    |  Ʒ  ȴ.          |
|                    |  ʵ忡 Ͽ mysql_fetch_field()    |
|                    | Լ ȣν  ʵ忡  MYSQL_   |
|                    | FIELD ü    ִ. ʵ忡    |
|                    | ִ    ü        |
|                    | ƴϸ,  ʹ MYSQL_ROW ü    |
|                    |  ȴ.                              |
+--------------------+---------------------------------------------+
| MYSQL_FIELD_OFFSET | MySQL ʵ Ʈ             |
|                    | (offset) ǥϴ type-safe ̴      |
|                    | (mysql_field_seek() Լ ȴ).     |
|                    | Offset   ʵ ̸        |
|                    | 0 Ѵ.                             |
+--------------------+---------------------------------------------+
| my_ulonglong       |  , mysql_affected_rows(),         |
|                    | mysql_num_rows(), mysql_insert_id()         |
|                    | Լ Ǵ ̴.                 |
|                    |   0 1.84e19           |
|                    |   ִ.  ýۿ             |
|                    | my_ulonglong   ϴµ         |
|                    |    ִµ,  쿡      |
|                    | ϱ ؼ ̰ unsigned long      |
|                    |  ȯ  '%lu' Ʈ       |
|                    |Ѵ.    :             |
|                    |                                             |
|                    |printf (Number of rows: %lu\n",              |
|                    |(unsigned long) mysql_num_rows(result));     |
+--------------------+---------------------------------------------+
MYSQL_FIELD ü    :
char * name     - ʵ ̸
char * table
        -  ʵ尡  ʵ(calculated field) ƴ ,   
带   ִ ̺ ̸.  ʵ  NULL   
char * def
        -  ʵ Ʈ (mysql_list_fields() Լ ϴ  
쿡        ȴ)
enum enum_field_types type
        - ʵ (type). ʵ    ̺  ߿  ϳ
.
+-----------------------+-------------------------------------------+
|  Type value           |  Type meaning                             |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_TINY       |  TYNYINT field                            |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_SHORT      |  SMALLINT field                           |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_LONG       |  INTEGER field                            |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_INT24      |  MEDIUMINT field                          |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_LONGLONG   |  BIGINT field                             |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_DECIMAL    |  DECIMAL or NUMERIC field                 |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_FLOAT      |  FLOAT field                              |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_DOUBLE     |  DOUBLE or REAL field                     |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_TIMESTAMP  |  TIMESTAMP field                          |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_DATE       |  DATE field                               |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_TIME       |  TIME field                               |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_DATETIME   |  DATETIME field                           |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_YEAR       |  YEAR field                               |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_STRING     |  String (CHAR or VARCHAR) field           |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_BLOD       |  BLOD or TEXT field (use max_length       |  
|                       |  to dete rmine the maximum length)        |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_SET        |  SET field                                |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_ENUM       |  ENUM field                               |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_NULL       |  NULL-type field                          |  
+-----------------------+-------------------------------------------+
|  FILE_TYPE_CHAR       |  Deprecated: use FIELD_TYPE_TINY instead  |  
+-----------------------+-------------------------------------------+
 
IS_NUM() ũ(macro) ̿Ͽ  ʵ尡 (numeric  type)ΰ 
Ʈ  ִ. 
IS_NUM() İ(type value)  μ Ѱ   ʵ尡  ̸ 
'TRUE' Ѵ:
if (IS_NUM(field->type)) {
    printf("Field is numeric\n");
}
unsigned int length 
        - ʵ (width)
unsigned int max_length 
        -  ¿  ʵ ִ (maximum width). 
mysql_list_fields() Լ ϴ    ʵ ִ 
 ȴ.
unsigned int flags 
        - ʵ忡  Different bit-flags. ÷  0  Ȥ  
Ʈ  (bit set) ߿ ϳ̴.
+-----------------------+------------------------------------------+
|    ÷           |                                      |  
+-----------------------+------------------------------------------+
|  NOT_NULL_FLAG        |  Field can't be NULL                     |  
+-----------------------+------------------------------------------+
|  PRI_KEY_FLAG         |  Field is part of a primary key          |  
+-----------------------+------------------------------------------+
|  UNIQUE_KEY_FLAG      |  Field is part of a unique key           |  
+-----------------------+------------------------------------------+
|  MULTIPLE_KEY_FLAG    |  Field is part of a key                  |  
+-----------------------+------------------------------------------+
|  UNSIGNED_FLAG        |  Field has the UNSIGNED attribute        |  
+-----------------------+------------------------------------------+
|  ZEROFILL_FLAG        |  Field has the ZEROFILL attribute        |  
+-----------------------+------------------------------------------+
|  BINARY_FLAG          |  Field has the BINARY attribute          |  
+-----------------------+------------------------------------------+
|  AUTO_INCREMENT_FLAG  |  Field has the AUTO_INCREMENT attribute  |  
+-----------------------+------------------------------------------+
|  ENUM_FLAG            |  Field is an ENUM (deprecated)           |  
+-----------------------+------------------------------------------+
|  BLOB_FLAG            |  Field is a BLOB or TEXT (deprecated)    |  
+-----------------------+------------------------------------------+
|  TIMESTAMP_FLAG       |  Field is a TIMESTAMP (deprecated)       |  
+-----------------------+------------------------------------------+
BLOB_FLAG, ENUM_FLAG, TIMESTAMP_FLAG ÷ ̵ ÷  ڽ
 (type) Ӽ ǥϱ ٴ ʵ   ǥϱ  
 ÷ ϴ     ʴ.    'field->type'   
FIELD_TYPE_BLOB, FIELD_TYPE_ENUM, Ȥ FIELD_TYPE_TIMESTAMP  
  . Ʒ  ÷    Ͽ 
Ѵ:
if (field->flags & NOT_NULL_FLAG) {
        printf("Field can't be null\n");
}
÷  Ҹ (boolean status) ϴµ   ũ
(macro)   ִ:
+----------------------+--------------------------------------------+
|  IS_NOT_NULL(flags)  |   ʵ尡 'NOT NULL' ǵǾ   |  
+----------------------+--------------------------------------------+
|  IS_PRI_KEY(flags)   |   ʵ尡 primary key 쿡          |  
+----------------------+--------------------------------------------+
|  IS_BLOB(flags)      |   ʵ尡 BLOB̳ TEXT         |  
+----------------------+--------------------------------------------+
unsigned int decimals 
        -  ʵ(numeric field)  ڸ(number of decimal)
18.3 C API function overview
+--------------------+---------------------------------------------+
|  Function          |  Description                                |
+--------------------+---------------------------------------------+
|  Mysql_affected    |   ֱ UPDATE, DELETE, INSERT         |
|  _rows()           |  ǿ     Ѵ.     |
+--------------------+---------------------------------------------+
|  Mysql_close()     |    Ѵ.                  |
+--------------------+---------------------------------------------+
|  Mysql_connect()   |   ϸ  Լ ϱ         |
|                    |  ٴ mysql_real_connect() Լ         |
|                    |  ϴ  ȴ.                    |
+--------------------+---------------------------------------------+
|  Mysql_create      |  DB Ѵ.  Լ ϱ          |
|  _db()             |  ٴ SQL ɾ CREATE DATABASE        |
|                    |   ϴ  .                   |
+--------------------+---------------------------------------------+
|  Mysql_data        |    ¿   ã´.       |
|  _seek()           |                                             |
+--------------------+---------------------------------------------+
|  mysql_debug()     |  ־ ڿ DBUG_PUSH Ѵ.      |
+--------------------+---------------------------------------------+
|  mysql_drop        |  DB Ѵ.  Լ ϱ          |
|  _db()             |  ٴ SQL ɾ DROP DATABASE          |
|                    |   ϴ  .                   |
+--------------------+---------------------------------------------+
|  mysql_dump        |   Ͽ   α         |
|  _debug_info()     |   Ѵ                              |
+--------------------+---------------------------------------------+
|  mysql_eof()       |     °          |
|                    |  ǥѴ.  Լ ϱ⺸ٴ         |
|                    |  mysql_errno() mysql_error()Լ        |
|                    |  ȴ.                                  |
+--------------------+---------------------------------------------+
|  mysql_errno()     |   ֱٿ  MySQL Լ        |
|                    |  ѹ Ѵ.                       |
+--------------------+---------------------------------------------+
|  mysql_error()     |   ֱٿ  MySQL Լ        |
|                    |   Ѵ.                     |
+--------------------+---------------------------------------------+
|  mysql_escape      |  Escapes special characters in a            |
|  _string()         |  string for use in a SQL statement.         |
+--------------------+---------------------------------------------+
|  mysql_fetch       |  ̺  ʵ (type)          |
|  _field()          |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_fetch       |  ־ ʵ ȣ  ʵ         |
|  _field_direct()   |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_fetch       |   ʵ   迭 Ѵ.     |
|  _fields()         |                                             |
+--------------------+---------------------------------------------+
|  mysql_fetch       |     ÷ ̸ Ѵ.   |
|  _lengths()        |                                             |
+--------------------+---------------------------------------------+
|  mysql_fetch       |  κ   ´.         |
|  _row()            |                                             |
+--------------------+---------------------------------------------+
|  mysql_field       |  ÷Ŀ Ư ÷ ´.           |
|  _seek()           |                                             |
+--------------------+---------------------------------------------+
|  mysql_free        |  ¿                 |
|  _result()         |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_get         |  Ŭ̾Ʈ   Ѵ.         |
|  _client_info()    |                                             |
+--------------------+---------------------------------------------+
|  mysql_get         |   ῡ                  |
|  _host_info()      |  ڿ Ѵ.                         |
+--------------------+---------------------------------------------+
|  mysql_get         |  ῡ                 |
|  _proto_info()     |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_get         |    ѹ Ѵ.               |
|  _server_info()    |                                             |
+--------------------+---------------------------------------------+
|  mysql_info()      |   ֱٿ  ǿ              |
|                    |   Ѵ.                           |
+--------------------+---------------------------------------------+
|  mysql_init()      |  MYSQL ü ϰų                  |
|                    |  ʱȭѴ.                                |
+--------------------+---------------------------------------------+
|  mysql_insert      |  AUTO_INCREMENT ʵ忡 Ͽ               |
|  _id()             |   ֱٿ  ID .              |
+--------------------+---------------------------------------------+
|  mysql_list        |   ԽĿ  ĪǴ              |
|  _dbs()            |  DB ̸ Ѵ.                      |
+--------------------+---------------------------------------------+
|  mysql_list        |   ԽĿ  ĪǴ              |
|  _fields()         |  ʵ ̸ Ѵ.                    |
+--------------------+---------------------------------------------+
|  mysql_list        |     Ʈ            |
|  _processes()      |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_list        |   ԽĿ  ĪǴ              |
|  _tables()         |  ̺ ̸ Ѵ.                  |
+--------------------+---------------------------------------------+
|  mysql_num         |    ÷  Ѵ.          |
|  _fields()         |                                             |
+--------------------+---------------------------------------------+
|  mysql_num         |      Ѵ             |
|  _rows()           |                                             |
+--------------------+---------------------------------------------+
|  mysql_ping()      |     ǰ            |
|                    |  ֳ üũϸ, ʿϸ            |
|                    |  翬Ѵ.                                |
+--------------------+---------------------------------------------+
|  mysql_query()     |  Null terminated ڿ ־          |
|                    |  SQL Ǹ Ѵ.                       |
+--------------------+---------------------------------------------+
|  mysql_real        |  MySQL  Ѵ.                     |
|  _connect()        |                                             |
+--------------------+---------------------------------------------+
|  mysql_real        |  Counted ڿ ־ SQL Ǹ         |
|  _query()          |  Ѵ.                                  |
+--------------------+---------------------------------------------+
|  mysql_reload()    |   Ͽ grant ̺ ٽ          |
|                    |  εϰ Ѵ.                           |
+--------------------+---------------------------------------------+
|  mysql_row_seek()  |  mysql_row_tell() Լ          |
|                    |       ã´.         |
+--------------------+---------------------------------------------+
|  mysql_row_tell()  |  Row cursor ġ Ѵ.                |
+--------------------+---------------------------------------------+
|  mysql_select      |  Ư DB Ѵ.                        |
|  _db()             |                                             |
+--------------------+---------------------------------------------+
|  mysql_shutdown()  |  DB  ˴ٿŲ.                    |
+--------------------+---------------------------------------------+
|  mysql_stat()      |   ¸ ǥϴ ڿ Ѵ.  |
+--------------------+---------------------------------------------+
|  mysql_store       |  ü  Ŭ̾Ʈ ´.       |
|  _result()         |                                             |
+--------------------+---------------------------------------------+
|  mysql_thread      |    ID Ѵ.               |
|  _id()             |                                             |
+--------------------+---------------------------------------------+
|  mysql_use         |  Initiates a row-by-row result set          |
|  _result()         |  retrieval.                                 |
+--------------------+---------------------------------------------+
     mysql_init() Լ ȣν  connection 
handler ʱȭ ,   handler hostname, user name,  password 
 ٸ   mysql_real_connect() Լ ȣѴ.   
۾  mysql_close() Լ ȣν  Ѵ.
    ̷    ִ        Ŭ̾Ʈ    mysql_query() 
mysql_real_query() Լ ̿Ͽ   SQL Ǹ     ִ. 
mysql_query()    ǰ    null-terminated    string̾    ϸ, 
mysql_real_query() counted string̾ Ѵ.  string  ̳
 (߰  NULL Ʈ     ִ)  쿡  ݵ 
mysql_real_query() Ͽ Ѵ.
SELECT   ǰ   ƴ   (INSERT,  UPDATE,   DELETE)   ؼ 
mysql_affected_row() Լ ȣν     affectǾ
   ִ.
SELECT  , selectǾ   (result set)   
ȴ(SHOW, DESCRIBE, EXPLAIN      ϴ Ϳ  ־ 
SELECT ϸ, ̵ SELECT  ϰ óǾ Ѵ)
Ŭ̾Ʈ     óϴ    ΰ   ִ.  ϳ 
mysql_store_result() Լ ȣν ü   ѹ 
 ν,  Լ ǿ  ϵ   κ 
 Ŭ̾Ʈ Ѵ. ι° mysql_use_result() Լ ȣ
ν Ŭ̾Ʈ ະ    ̴.  Լ   
 ۾ ʱȭϱ⸸ ϸ  κ  
 ʴ´.
 ΰ  , mysql_fetch_row() Լ ȣν  鿡 
ϰ ȴ. 
mysql_store_result()  mysql_fetch_row() κ ̹ fetch
 鿡 ϸ, mysql_use_result() , mysql_fetch_row() 
 κ  ´.     ũ  
 mysql_fetch_lengths() Լ ȣν   ִ.
  ̿ ۾  mysql_free_result() ȣν  
     Ѵ.
 ΰ retrieval ü ȣ ̴. Ŭ̾Ʈ  α 
 䱸        Ͽ Ѵ.  δ 
mysql_store_result() ַ ȴ.
mysql_store_result()   Ŭ̾Ʈ fetch Ŀ Ŭ
̾Ʈ   鿡               Ӹ   ƴ϶ 
mysql_data_seek() mysql_row_seek() ̿Ͽ    ȿ   
ġ(current row position) ν     յڷ 
  ִٴ ̴.  mysql_num_rows() ȣν   
 ֳ   ִ. ٸ ,  mysql_store_result() 
 䱸Ǵ     out-of-memory ¸   ɼ 
. 
mysql_use_result()  ѹ ϳ ุ ϱ   
    ʿϴٴ ̸     Ҵ 
Ϸ Ͽ  ӵ    ִ.   tying upϴ   
ϱ Ͽ    ó־ ϸ     
 鿡     θ   ִ.    
 ޱ        ֳ    
.   ߰ ã ϴ  ãҴ     
 ־ Ѵ.
API ̿ν ǰ SELECTΰ ƴѰ  ¿  Ŭ
Ʈ ǿ    ְ   ִµ,  ̴ mysql_query() 
(Ȥ mysql_real_query()) ȣ Ŀ mysql_store_result() ȣ
ν ϴ.     (succeed)̸ ǰ  SELECT̸ 
     ִ.    ̸ mysql_num_fields()  ȣϿ 
result  Ǿ°   , mysql_num_fields()
 0 ϸ  Ǵ ƹ ͵   ʴ´(̰  ǰ 
INSERT, UPDATE, DELETE  ǹѴ).  mysql_num_fields()  0
 ƴϸ Ǵ ݵ  Ͽ ϴµ  ʾ ǹ
ϸ, ̴ ǰ SELECT  Ͽ ˷ش. 
mysql_store_result() mysql_use_result()   ϴ ʵ
   (ʵ ,  ̸,   )      ְ ش. 
mysql_fetch_field()  ȣϿ   ʵ   
 ϰų, mysql_fetch_field_direct() ȣν    
ʵ ȣ  Ͽ    ִ.   ʵ   Ŀ ġ(current 
field cursor position) mysql_field_seek() Լ ȣν  
   ִ. Setting  the field  cursor affects  subsequent calls  to 
mysql_fetch_field().  mysql_fetch_fields() ȣν  Ѳ
  ʵ    ִ. 
 ã ϱ  ؼ MySQL mysql_errno()  mysql_error() 
Լ Ͽ     ְ ش.   Լ  
ٿ invoke ϰų   ִ Լ   ڵ Ȥ 
  ϸ, ̸ Ͽ   ϰ  װ 
   ִ.
18.4 C API function descriptions
Ʒ Լ  ־ NULL ǥ μ ϰ  C α 
 NULL ǹ̸, MySQL NULL  ǹϴ   ƴ
. 
  ϴ Լ  ͳ  Ѵ.   
 ǥð ٸ  ϴ Լ Ͽ  NULL ƴ 
,  ǥϱ ؼ NULL  Ѵ.  ϴ 
 쿡 Ͽ  0,  쿡 0 ƴ  
Ѵ. 
Լ   쿡 mysql_errno(), mysql_error() Լ  
Ͽ  üũ  ִ. 
18.4.1 mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql) 
18.4.1.1 Description
  UPDATE, DELETE, INSERT ǿ    
, ַ UPDATE, DELETE, INSERT   mysql_query() Լ ȣ 
  ȣȴ. 
SELECT   mysql_affected_rows() Լ mysql_num_row()  Լó
 Ѵ.
mysql_affected_rows() Լ  ũ(macro) Ǿ ִ.
18.4.1.2 Return values
0 ū   affectedǰų retrieved    ǹѴ.  0 
WHERE ǿ մϴ ڵ尡 ų ƹ ǵ    ʾ
 ǹѴ. -1 ǰ  Ͽų Ȥ SELECT   
 mysql_affected_rows() Լ mysql_store_result() Լ ȣ 
 ȣǾ ǹѴ.
18.4.1.3 Errors
.
18.4.1.4 Example
mysql_query(&mysql,"UPDATE   products    SET   cost=cost*1.25   WHERE 
group=10");
printf("%d products updated",mysql_affected_rows(&mysql));
18.4.2 mysql_close()
void mysql_close(MYSQL *mysql) 
18.4.2.1 Description
 ִ       ´.     ڵ(connection 
handle) mysql_init()̳ mysql_real_connect() ؼ ڵ  
Ǿٸ   mysql_close()   mysql           ڵ 
deallocationѴ.
18.4.2.2 Return values
. 
18.4.2.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order.
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.3 mysql_connect()
MYSQL *mysql_connect(MYSQL   *mysql, const   char *host,  const  char 
*user, const char *passwd) 
18.4.3.1 Description
 Լ ϴ   ,  mysql_real_connect() 
 ַ ȴ.
mysql_connect() Լ ȣƮ ư ִ MySQL DB   
 õѴ. 
Mysql_connect() mysql_get_client_info() Լ  ٸ  API 
Լ ϱ  ݵ  Ǿ Ѵ. 
Լ μ  ǹ̴ mysql_real_connect() Լ ϴ. 
18.4.3.2 Return values
mysql_real_connect() Լ . 
18.4.3.3 Errors
mysql_real_connect() Լ . 
18.4.4 mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db) 
18.4.4.1 Description
'db' μ ־ ̸ ͺ̽ Ѵ.
 Լ ϴ   ,  'CREATE  DATABASE' 
 SQL  mysql_query() Լ ̿Ͽ ϴ  .
 
18.4.4.2 Return values
ͺ̽    0,     0 ƴ 
 Ѵ. 
18.4.4.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.4.4 Example
if(mysql_create_db(&mysql, "my_database"))
{
   fprintf(stderr, "Failed  to create  new database.   Error: %s\n", 
mysql_error(&mysql));
}
18.4.5 mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, unsigned int offset) 
18.4.5.1 Description
     ã´. ̸ ؼ    ü 
ǿ  ü  ϰ ־ ϸ,   mysql_data_seek() 
Լ     mysql_use_result()     Լʹ                
mysql_store_result() Լ Ѵ. 
Offset μ 0 mysql_num_rows(result)-1    Ѵ.
18.4.5.2 Return values
None. 
18.4.5.3 Errors
None. 
18.4.6 mysql_debug()
void mysql_debug(char *debug) 
18.4.6.1 Description
debug   μ   ־   ڿ      DBUG_PUSH   Ѵ. 
mysql_debug() Լ Fred Fish debug ̺귯 Ѵ.  Լ 
ϱ ؼ ݵ Ŭ̾Ʈ ̺귯   ϵ 
Ͽ Ѵ. 19.10   MySQL  뿡 Ͽ  
, 19.11 MySQL Ŭ̾Ʈ 뿡 Ͽ Ѵ.
18.4.6.2 Return values
None. 
18.4.6.3 Errors
None. 
18.4.6.4 Example
Ʒ    ȣ Ŭ̾Ʈ  ̺귯  Ͽ  Ŭ̾Ʈǿ 
'/tmp/client.trace' Ͽ trace file ϰ ش:
mysql_debug("d:t:O,/tmp/client.trace");
18.4.7 mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db) 
18.4.7.1 Description
db μ ־ ̸ ͺ̽ ӽŲ. 
 Լ ϴ   ,  'DROP  DATABASE'  
SQL  mysql_query() Լ ̿Ͽ ϴ  .
18.4.7.2 Return values
ͺ̽  ӵ  0,     0 
  Ѵ.
18.4.7.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.7.4 Example
if(mysql_drop_db(&mysql, "my_database"))
  fprintf(stderr,  "Failed  to  drop   the database:   Error:  %s\n", 
mysql_error(&mysql));
18.4.8 mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql) 
18.4.8.1 Description
 Ͽ α   ϰ Ѵ. Ǿ  ִ 
(connected user)  ۾    ־ Ѵ.
18.4.8.2 Return values
 ϸ 0,  ϸ 0 ƴ  Ѵ.
18.4.8.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.9 mysql_eof()
my_bool mysql_eof(MYSQL_RES *result) 
18.4.9.1 Description
 Լ ϴ    ,   mysql_errno()  Լ 
mysql_error() Լ Ѵ.
 mysql_eof() Լ      ǴѴ.
mysql_store_result() Լκ    ٸ  Ŭ
Ʈ ѹ ۾ ü  Եȴ.    mysql_fetch_row() 
Լκ ϵǴ NULL      Ͽ ǹ
ϰ Ǹ mysql_eof() Լ ȣ ʿ䰡 .
 mysql_use_result() Լ Ͽ    ٸ   
 
mysql_fetch_row() Լ ȣ  κ ϳ .  
 ߿      ֱ  myql_fetch_row()  Լ 
ϴ NULL  ݵ     Ͽ ǹѴٰ 
  .   mysql_eof() Լ Ͽ   Ͼ 
  ִ. ̶ mysql_eof() Լ      
 0 ƴ  ϸ,  쿡 0 ϰ ȴ. 
ǥ mySQL  Լ  mysql_errno() mysql_error() Լ    
 ϱ  ̵ ϴ  ١
18.4.9.2 Return values
̸ 0,    Ͽ 0 ƴ  Ѵ.
18.4.9.3 Errors
None. 
18.4.9.4 Example
 mysql_eof() 뿹 ش:
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(!mysql_eof(result))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
However, you  can achieve  the same  effect with  the standard  MySQL 
error functions: 
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(mysql_errno(&mysql))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
18.4.10 mysql_errno()
unsigned int mysql_errno(MYSQL *mysql) 
18.4.10.1 Description
mysql μ   ῡ Ͽ mysql_errno()  ֱٿ 
 API Լ    ڵ带 Ѵ. 0 ϸ ƹ   
   ǹѴ. Ŭ̾Ʈ      ѹ MYSQL 
'errmsg.h'   Ͽ Ǿ  ,      ѹ 
'mysqld_error.h' Ͽ ִ.
18.4.10.2 Return values:
 ڵ  . ƹ   0 Ѵ.
18.4.10.3 Errors
None. 
18.4.11 mysql_error()
char *mysql_error(MYSQL *mysql) 
18.4.11.1 Description
mysql μ   ῡ Ͽ mysql_error()  ֱٿ 
 API Լ     Ѵ.  ִ  ڿ("") 
ϸ ƹ     ǹѴ. ̰   ΰ 
Ʈ  ǹѴ:
if(mysql_errno(&mysql)) {
    // an error occurred
}
if(mysql_error(&mysql)[0] != '\0') {
    // an error occurred
}
Ŭ̾Ʈ    MySQL Ŭ̾Ʈ ̺귯  
ν   ִ.    ٸ      
  , 9.1  MySQL  Ǵ  ٷ.
18.4.11.2 Return values
 ϴ ڿ.   쿡 ִ ڿ 
.
18.4.11.3 Errors
None. 
18.4.12 mysql_escape_string()
unsigned int mysql_escape_string(char *to, const char *from, unsigned 
int length) 
18.4.12.1 Description
from μ ִ ڿ  Ѱ escaped SQL  ڵϿ 
to μ ִ´. 
ڵǾ ڵ NUL(ASCII 0), `\n', `\r', `\', `'' ̴(7.1
 ڿ ڵ ϴ  Ͽ ٷ).
from μ  ڿ length   μ ־ Ʈ  ŭ  
(terminating NULL )   Ѵ. to  μ ݵ   
length μ ־  2迡 1  ŭ Ʈ ҴǾ
 Ѵ.  mysql_escape_string() Լ     to  μ   
null-terminated ڿ ȴ. ϰ ڵǾ ڿ  
, ̰ terminating null ڰ Ե  ̴.
to μ  ڿ null-terminated ڿ   ڿ 
strlen() Լ strcpy() Լ Ͽ ȵȴ.  from μ
 ־ ڿ null ϰ ִٸ mysql_escape_string()  Լ
  ڸ '\' տ ٿ to μ ְ Ǹ, ̰   Լ
  terminating null νϰ ȴ.
 ̷  null Ʈ mysql_query() ؼ terminating 
null    Ǹ ϰ     ȴ.   
mysql_escape_query() Լ ̿Ͽ  Ǹ    mysql_query() 
Լ ϱ ٴ mysql_real_query() Լ ϴ  .
18.4.12.2 Example
char query[1000],*end;
end = strmov(query, "INSERT INTO test_table values("); 
*end++ = '\";
end += mysql_escape_string(query,"What's this",11);
*end++ = '\";
*end++ = ',';
*end++ = '\";
end += mysql_escape_string(query,"binary data: \0\r\n",16);
*end++ = '\";
*end++ = ')';
if (mysql_real_query(&mysql,query,(int) (end - query))) {
   fprintf(stderr, "Failed to insert row, Error: %s\n",
           mysql_error(&mysql));
}
  strmov() Լ mysqlclient ̺귯 ԵǾ  
,   strcpy()  Լ   ϰ        ù°  μ 
terminating null   ϴ  ٸ. 
18.4.12.3 Return values
terminating null ڸ  to μ   
18.4.12.4 Errors
None. 
18.4.13 mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) 
18.4.13.1 Description
   ÷ (definition) MYSQL_FIELD ü Ƽ 
Ѵ.    ÷鿡     ϴ 쿡   
Լ   ݺϿ  ȣѴ.     ̻   ʵ尡      
mysql_fetch_field() Լ NULL Ѵ.
ο SELECT ǰ   mysql_fetch_field() ο  ù
° ʵ忡    ϱ  ʱȭȴ.  mysql_fetch_field() 
Լ  ϵǴ ʵ  mysql_field_seek() Լ  ȣ 
  ´.
SELECT        ϱ        msyql_query()    ȣϿ 
mysql_store_result() ȣ  , mysql_fetch_field() ȣ
Ͽ BLOB ʵ ̸ ûϰ  Ǹ MySQL Ʈ blob   8K 
Ʈ Ѵ. ϴ ѹ   Ǹ field->max_length 
־ ǿ ִ ÷  ū  ̸  ȴ.
18.4.13.2 Return values
 ÷  MYSQL_FIELD ü  ϸ,  ̻   ʵ尡 
 NULL Ѵ. 
18.4.13.3 Errors
None. 
18.4.13.4 Example
MYSQL_FIELD *field;
while((field = mysql_fetch_field(result)))
{
    printf("field name %s\n", field->name);
}
18.4.14 mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 
18.4.14.1 Description
 ¿   MYSQL_FIELD ü 迭 Ѵ.  
ü     ÷鿡  ʵ ǿ     
. 
18.4.14.2 Return values
   ÷鿡  MYSQL_FIELD ü 迭
18.4.14.3 Errors
None. 
18.4.14.4 Example
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++) {
   printf("Field %u is %s\n", i, fields[i].name);
}
18.4.15 mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int 
fieldnr) 
18.4.15.1 Description
   fieldnr μ ־ ʵ ȣ ʵ忡   ʵ 
Ǹ MYSQL_FIELD ü Ѵ.  Լ ̿Ͽ   ÷ 
    Ǹ             ִ.     fieldnr        0 
mysql_num_fields(result)-1    Ѵ.
18.4.15.2 Return values
 ʵ忡  MYSQL_FIELD ü
18.4.15.3 Errors
None. 
18.4.15.4 Example
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;
num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++) {
    field = mysql_fetch_field_direct(result, i);
    printf("Field %u is %s\n", i, field->name);
}
18.4.16 mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result) 
18.4.16.1 Description
     ÷ ̸ Ѵ.  ʵ   
ϰ ϴ     ȭ(optimization)   
   ִ. strlen() Լ ȣ ʿ䰡   ̴. Ư 
    ϰ  ִ 쿡 strlen() Լ  NULL 
ڸ ϰ ִ ʵ忡 Ͽ ߸     ֱ 
  ũ⸦ ϴµ  Լ Ͽ Ѵ.
 ÷̳ NULL   ÷   ̴ 0 ȴ.   ΰ 
츦 ϴ  mysql_fetch_row() Լ   Ѵ.
18.4.16.2 Return values
 ÷(null  termination character  ) ũ⸦    ִ 
unsigned long  迭.   쿡 NULL Ѵ.
18.4.16.3 Errors
mysql_fetch_lengths()           ؼ  ȿϴ. 
mysql_fetch_row() Լ ȣϱ    Լ ȣϰų    
    Ŀ ȣϴ 쿡 NULL Ѵ.
18.4.16.4 Example
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;
row = mysql_fetch_row(result);
if (row) {
    num_fields = mysql_num_fields(result);
    lengths = mysql_fetch_lengths(result);
    for(i = 0; i < num_fields; i++) {
         printf("Column   %u  is   %lu   bytes   in  length.\n",   i, 
lengths[i]);
    }
}
18.4.17 mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 
18.4.17.1 Description
    ´. mysql_store_result() Լ ȣ Ŀ 
 ,  ̻     mysql_fetch_row() NULL 
Ѵ. mysql_use_result() Լ ȣ Ŀ  ,   ̻ 
  ų  Ͽ  NULL Ѵ.
      mysql_num_fields(result)    ־. 
mysql_fetch_row() ȣ Ͽ         
row[0] row[mysql_num_fields(result)-1]     
.  ο NULL  ִ 쿡 NULL ͷ ǥõȴ. 
  ʵ  ̵ mysql_fetch_lengths() Լ  ȣ
ν   մ. 
ִ ʵ峪 NULL ϴ ʵ  0 ̸ , ʵ 
   üũν  ΰ 츦   ִ.  
Ͱ NULL̸ ش ʵ尡 NULL ̸, ƴϸ ִ ʵ
 ǹѴ.
18.4.17.2 Return values
   MYSQL_ROW ü.  ̻   ų  
  NULL Ѵ.
 
18.4.17.3 Errors
CR_SERVER_LOST 
The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
An unknown error occurred. 
18.4.17.4 Example
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result))) {
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++) {
       printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
   }
   printf("\n");
}
18.4.18 mysql_field_seek()
MYSQL_FIELD_OFFSET         mysql_field_seek(MYSQL_RES        *result, 
MYSQL_FIELD_OFFSET offset) 
18.4.18.1 Description
ʵ   Ŀ   offset   μ    ־   ġ   Ѵ.    
mysql_fetch_field() Լ ȣ ش offset ̵ ŭ  ش
 ÷  ʵ   ȴ.
 ùκ  ؼ  offset 0 ְ Լ  ȣϸ 
ȴ.
18.4.18.2 Return values
ʵ Ŀ  (previous value)
18.4.18.3 Errors
None. 
18.4.19 mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result) 
18.4.19.1 Description
 mysql_fetch_field() Լ   ʵ Ŀ ġ ˷
ش.  ϰ mysql_field_seek()  Լ offset μ    
ִ.
18.4.19.2 Return values
ʵ Ŀ  (current offset)
18.4.19.3 Errors                None. 
18.4.20 mysql_free_result()
void mysql_free_result(MYSQL_RES *result) 
18.4.20.1 Description
mysql_store_result(), mysql_use_result(), mysql_list_dbs()    
  ҴǾ   Ѵ.     ۾ 
  ݵ mysql_free_result() Լ ȣϿ   
 ־ Ѵ.
18.4.20.2 Return values
None. 
18.4.20.3 Errors
None. 
18.4.21 mysql_get_client_info()
char *mysql_get_client_info(void) 
18.4.21.1 Description
Ŭ̾Ʈ ̺귯 (client library version)   ǥ
ϴ ڿ Ѵ.
18.4.21.2 Return values
MySQL client library version ǥϴ ڿ
18.4.21.3 Errors                None. 
18.4.22 mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql) 
18.4.22.1 Description
 ȣƮ  ϴ  ǰ ִ  (connection) 
(type) ϴ ڿ Ѵ.
18.4.22.2 Return values
 ȣƮ (server host name)  (connection  type) 
Ÿ ڿ 
18.4.22.3 Errors
None. 
18.4.23 mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql) 
18.4.23.1 Description
 ῡ ǰ ִ   Ѵ.
18.4.23.2 Return values
 ῡ ǰ ִ   Ÿ unsigned integer
18.4.23.3 Errors
None. 
18.4.24 mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql) 
18.4.24.1 Description
  ѹ(server version number) ǥϴ ڿ Ѵ.
18.4.24.2 Return values
  ѹ ǥϴ ڿ
18.4.24.3 Errors                None. 
18.4.25 mysql_info()
char *mysql_info(MYSQL *mysql) 
18.4.25.1 Description
 ֱٿ   peogks  ϴ ڿ  Ѵ. 
ڿ (format)  ŸԿ  , Ʒ  . 
 ǿ    ϰ ȴ.
INSERT INTO ... SELECT ... 
String format: Records: 100 Duplicates: 0 Warnings: 0 
INSERT INTO ... VALUES (...),(...),(...)... 
String format: Records: 3 Duplicates: 0 Warnings: 0 
LOAD DATA INFILE ... 
String format: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 
ALTER TABLE 
String format: Records: 3 Duplicates: 0 Warnings: 0 
18.4.25.2 Return values
 ֱٿ  ǿ  ΰ  ǥϴ  忭. ش 
ǿ Ͽ ƹ      NULL Ѵ.
18.4.25.3 Errors
None. 
18.4.26 mysql_init()
MYSQL *mysql_init(MYSQL *mysql) 
18.4.26.1 Description
mysql_real_connect() Լ  MYSQL ü Ҵ(allocate)ϰų 
ȭ(initialize)Ѵ. 
 mysql μ NULL  ̸ mysql_init() Լ ο  ü 
Ҵ, ʱȭϿ  ü Ѵ. NULL Ͱ ƴϸ ü ʱ
ȭ  ü ּҰ ϵȴ. 
 mysql_init() Լ ο ü Ҵϰ Ǹ  ü  
ݱ  mysql_close() Լ ȣ  ǰ ȴ.
18.4.26.2 Return values
ʱȭ MYSQL * handle. ο ü Ҵϱ     
 NULL Ѵ.
18.4.26.3 Errors
   NULL ϵȴ.
18.4.27 mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql) 
18.4.27.1 Description
AUTO_INCREMENT ʵ忡 Ͽ  ֱٿ  ID Ѵ.   
 
AUTO_INCREMENT ʵ带 ϴ ̺  INSERT Ǹ   Ŀ 
ȴ.
18.4.27.2 Return values
 ֱٿ ŵ AUTO_INCREMENT ʵ 
18.4.27.3 Errors
None. 
18.4.28 mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid) 
18.4.28.1 Description
 Ͽ pid μ ־ (thread) ̵(kill)  û
Ѵ.
18.4.28.2 Return values
  0,    0 ƴ  Ѵ.
18.4.28.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.29 mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) 
18.4.29.1 Description
wild μ   Խ(simple regular expression)  ġ
   ͺ̽ ̸ ϰ ִ    Ѵ. 
wild μ '%', '_'   ϵī ڸ      
ͺ̽  ̸    ϴ     NULL       ִ. 
mysql_list_dbs() Լ ȣϴ  'SHOW databases [LIKE  wild]' 
 Ǹ ϴ Ͱ ϴ.
ݵ mysql_free_result() Լ ̿Ͽ     ־ 
Ѵ.
18.4.29.2 Return values
  MYSQL_RES    ϸ,   NULL  
.
18.4.29.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_OUT_OF_MEMORY 
        Out of memory. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.30 mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql,  const char *table,  const 
char *wild) 
18.4.30.1 Description
wild μ   Խ(simple regular expression)  ġ
 ̺  ʵ ϰ ִ   Ѵ. wild μ
 '%', '_'  ϵī  ڸ      ʵ 
 ϴ  NULL   ִ. mysql_list_fields() Լ ȣ
ϴ  'SHOW fields FROM table [LIKE wild]'  Ǹ 
 Ͱ ϴ.
ݵ mysql_free_result() Լ ̿Ͽ     ־ 
Ѵ.
18.4.30.2 Return values
  MYSQL_RES    ϸ,   NULL  
.
18.4.30.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.31 mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql) 
18.4.31.1 Description
        ϴ        Ѵ.  ̰ 
'mysqladmin processlist'     ش.
ݵ mysql_free_result() Լ ̿Ͽ     ־ 
Ѵ.
18.4.31.2 Return values
  MYSQL_RES    ϸ,   NULL  
.
18.4.31.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.32 mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) 
18.4.32.1 Description
wild μ   Խ(simple regular expression)  ġ
  ͺ̽  ̺ ϰ ִ   
. wild μ '%', '_'  ϵī ڸ    
 ̺  ϴ  NULL   ִ. 
mysql_list_tables() Լ ȣϴ  'SHOW tables [LIKE  wild]' 
 Ǹ ϴ Ͱ ϴ.
ݵ mysql_free_result() Լ ̿Ͽ     ־ 
Ѵ.
18.4.32.2 Return values
  MYSQL_RES    ϸ,   NULL  
.
18.4.32.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.33 mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result) 
Ȥ,
unsigned int mysql_num_fields(MYSQL *mysql) 
18.4.33.1 Description
   ÷  Ѵ.
mysql_num_fields() ȣ   ¿   Ȥ  ڵ 
 ȣ  ִ.  mysql_store_result() Լ NULL  
(        )  ڵ ϰ  
,              mysql_num_fields()     Լ     ȣν 
mysql_store_result() Լ   (non-empty result) 
Ͽ θ   ִ. ̰ Ŭ̾Ʈ α Ͽ
 ǰ SELECT (Ȥ SELECT-like) ΰ ƴѰ   ϴ 
  ൿ   ֵ ش. Ʒ  ִ.
18.4.33.2 Return values
   ʵ  ǥϴ unsigned integer.
18.4.33.3 Errors                None. 
18.4.33.4 Example
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string)) {
    // error
}
else {   // query succeeded, process any data returned by it 
    result = mysql_store_result(&mysql);
    if (result) {   // there are rows
          num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else {    // mysql_store_result()  returned nothing;  should it 
have?
        if(mysql_num_fields(&mysql) == 0) {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
        else {   // mysql_store_result() should have returned data
            fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
        }
    }
}
 ٸ  mysql_num_fields(&mysql) ſ  mysql_errno(&mysql) 
ȣϴ ̴. 
 , ǰ SELECT ΰ msyql_num_fields() ϰ  
ϱ⺸ٴ mysql_store_result()κ   üũϰ ȴ.
18.4.34 mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result) 
18.4.34.1 Description
     Ѵ.
mysql_num_rows()   Լ     δ           ؼ 
mysql_store_result() Լ ϴ°  mysql_use_result() Լ 
ϴ°  ִ.    mysql_store_result()  Լ  Ѵٸ 
mysql_num_rows() Լ  ȣ  ִ.   mysql_use_result() 
Լ Ѵٸ mysql_num_rows()  Լ        
retrieveDZ  ù
   Ѵ.
18.4.34.2 Return values
    
 
18.4.34.3 Errors
None. 
18.4.35 mysql_ping()
int mysql_ping(MYSQL *mysql) 
18.4.35.1 Description
    ϰ ֳ Ȯϸ,    
 쿡 ڵ 翬 õѴ.
 Լ Ŭ̾Ʈ ʹ        
 üũϰ ʿϴٸ ٽ ϱ    ִ.
18.4.35.2 Return values
  0,   0 ƴ  Ѵ.
18.4.35.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.36 mysql_query()
int mysql_query(MYSQL *mysql, const char *query) 
18.4.36.1 Description
null-terminated ڿ query μ  SQL Ǹ  Ѵ. 
Ǵ ݵ ϳ SQL  ̷ ϸ, ǹ ݷ(;)
 '\g' ٿ ȵȴ.
mysql_query()   ϴ ǿ    .  
ʹ ߰ NULL ڸ    ̰  mysql_query() 
 ű⼭   ڿ     νϱ    ̰쿡 
mysql_real_query() Լ Ͽ Ѵ.
18.4.36.2 Return values
̸ 0, ̸ 0 ƴ  .
18.4.36.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.37 mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const  char 
*user, const  char *passwd,  const char  *db, uint  port, const  char 
*unix_socket, uint client_flag) 
18.4.37.1 Description
mysql_real_connect() Լ ȣƮ ư ִ MySQL ͺ
                  õѴ.      mysql_real_connect() 
mysql_get_client_info() Լ  ٸ   API Լ  ϱ 
 ݵ  Ǿ Ѵ. 
ϴ μ  :
mysql μ MYSQL  connection ṵ̈ų NULL    ִ.   
mysql μ NULL̸ C API ڵ  ü   
ϰ mysql_close() ȣ  ̸ Ѵ. ̰    
          ٴ ̴(mysql_errno() 
mysql_error() Լκ    ؼ ȿ  MYSQL 
 Ͽ  Ѵ). mysql  μ NULL  ƴϸ ̹  ϴ 
MYSQL ü ּҰ Ǿ Ѵ.  , mysql_real_connect() Լ
 ȣϱ  ݵ  mysql_init() Լ ȣϿ MYSQL  ü 
ʱȭ ־ Ѵ.   .
host μ ȣƮ ǰų IP 巹   ִ.   host 
 NULL̰ų "localhost"   ȣƮ  ֵȴ. 
 OS (socket-Unix)̳ (pipe-Win32) Ѵٸ  
  Ͽ TCP/IP  ̵   ִ.
user μ   MySQL α ̵  ־ش. User  μ 
NULL̸  ڷ ֵȴ. Unix ȯ濡  ý αθ
 Ǹ, Windows ODBC  ڸ Ȯ  Ǿ 
. 15.4 ODBC  α  ʵ   ä 
 Ͽ Ѵ. 
passwd μ ڿ  н带 ־ش.  passwd NULL
̸ user ̺ н ʵ尡 ִ ڵ鸸  ġ 
 üũǾ. ̰ ͺ̽ ڷ Ͽ ͺ̽  
ڰ ڽ н带 Ͽ  ٸ    
  MySQL    ý       ֵ ش.      
mysql_real_connect() Լ ȣϱ  н带 ȣȭϷ  
 ƾ Ѵٴ ̸, н ȣȭ Ŭ̾Ʈ  API Ͽ 
ڵ ȴ.
db μ  ͺ̽ ̸ ־ش.  db  μ NULL
̸ Ʈ ͺ̽  õϰ ȴ. port μ 0 ƴ
 port μ õ Ʈ ȣ TCP/IP   Ʈ ȣ 
ϰ ȴ. host μ   Ѵٴ Ϳ Ѵ. 
unix_socket μ NULL ƴϸ   μ ڿ   socket̳ 
named pipe ȴ. client_flag    0 ſ Ư  쿡 
 ÷    ִ. 
+---------------------+----------------------------------------+
|  Flag name          |  Flag meaning                          |  
+---------------------+----------------------------------------+
|  CLIENT_FOUND_ROWS  |  Return the number of found rows,      |  
|                     |  not the number of affected rows.      |  
+---------------------+----------------------------------------+
|  CLIENT_NO_SCHEMA   |  Don't allow the db_name.tbl_name.     |  
|                     |  col_name syntax. This is for ODBC;    |  
|                     |  it causes the parser to generate      |  
|                     |  an error if you use that syntax,      |  
|                     |  which is is useful for trapping bugs  |  
|                     |  in some ODBC programs.                |  
+---------------------+----------------------------------------+
|  CLIENT_COMPRESS    |  Use compression protocol              |  
+---------------------+----------------------------------------+
|  CLIENT_ODBC        |  The client is an ODBC client.         |  
|                     |  This changes mysqld to be more        |  
|                     |  ODBC-friendly.                        |  
+---------------------+----------------------------------------+
18.4.37.2 Return values
 ϸ MYSQL *  ڵ(connection handle) ϸ, 
 ϸ NULL Ѵ.      ù° μ
 NULL  ʾҴٸ  μ ϴ.
18.4.37.3 Errors
CR_CONN_HOST_ERROR 
        MySQL  ῡ  
CR_CONNECTION_ERROR 
         MySQL  ῡ  
CR_IPSOCK_ERROR 
        IP    
CR_OUT_OF_MEMORY 
         (Out of memory). 
CR_SOCKET_CREATE_ERROR 
        Unix    
CR_UNKNOWN_HOST 
        ش ȣƮ  IP ּҸ ã  .
CR_VERSION_ERROR 
        ġ ʴ   ϴ Ŭ̾Ʈ  ̺귯
      Ϸ õ Ͽ  ġ 
. 
        ̰ ſ  Ŭ̾Ʈ ̺귯 Ͽ ο 
   ϰ ϴ 쿡 Ѵ. ̷ 쿡  
          '--old-protocol' ɼ ־ õϸ ذ   
.
CR_NAMEDPIPEOPEN_ERROR; 
        Win32 ȯ濡 named pipe ϴµ . 
CR_NAMEDPIPEWAIT_ERROR; 
        Win32 ȯ濡 named pipe ٸµ . 
CR_NAMEDPIPESETSTATE_ERROR; 
        Win32 ȯ濡 pipe ڵ鷯 µ . 
18.4.37.4 Example
MYSQL mysql;
mysql_init(&mysql);
if 
(!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,
0)) {
    fprintf(stderr, "Failed  to connect  to database:   Error: %s\n", 
mysql_error(&mysql));
}
18.4.38 mysql_real_query()
int mysql_real_query(MYSQL *mysql,  const char  *query, unsigned  int 
length) 
18.4.38.1 Description
query μ  SQL Ǹ  ϸ, query μ length  μ 
 ̸  Ѵ. Ǵ ϳ SQL   ̷ ϸ, 
ݷ̳ '\g' SQL ٿ ȵȴ.
  ϴ     mysql_query() Լ  ƴ 
mysql_real_query() Լ Ͽ Ѵ.   mysql_real_query()
 ǹ ̸    strlen() Լ  ʱ   
mysql_query() Լ Ͽ  ӵ .
18.4.38.2 Return values
ǿ ϸ 0,  ϸ 0 ƴ  Ѵ.
18.4.38.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.39 mysql_reload()
int mysql_reload(MYSQL *mysql) 
18.4.39.1 Description
MySQL  Ͽ grant ̺ ٽ е ûѴ.   
 ִ ڴ ݵ   ٽ о Ѵ.
 Լ ϴ   ,  'FLUSH  PRIVILEGES' SQL 
 
mysql_query() Լ ̿Ͽ ϴ  .
18.4.39.2 Return values
ϸ 0,  0 ƴ  Ѵ.
 
18.4.39.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.40 mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES  *result,  MYSQL_ROW_OFFSET 
offset) 
18.4.40.1 Description
    Ŀ(row cursor)  ġ Ѵ.  ̸ 
    ü ü      ־ ϸ,   
mysql_row_seek() Լ  mysql_use_result() Լʹ      
mysql_store_result() Լ   ִ.
offset μ mysql_row_tell() Լ mysql_row_seek() Լ  ȣ 
ϰ Ǿ ϸ,   ܼ  ȣ ǹϴ   ƴϴ. 
   ȣ ̿Ͽ        ã ϴ  쿡 
mysql_data_seek() Լ Ͽ Ѵ.
18.4.40.2 Return values
    Ŀ(row   cursor)    (previous    value).        
mysql_row_seek() Լ μ Ѱ.
18.4.40.3 Errors
None. 
18.4.41 mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result) 
18.4.41.1 Description
 mysql_fetch_row() Լ ȣ   Ŀ   ġ 
Ѵ. ̰ mysql_row_seek() Լ μ Ѱ.
mysql_row_tell() Լ ݵ mysql_store_result() Լ ڿ  
 ϸ, 
mysql_use_result() Լ ڿ   .
18.4.41.2 Return values
 Ŀ  (The current offset of the row cursor). 
18.4.41.3 Errors
None. 
18.4.42 mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db) 
18.4.42.1 Description
db μ  ͺ̽ mysql μ  ῡ   
 ͺ̽ ǵ Ѵ.  ǿ ؼ ⼭   
ͺ̽ ͺ̽    ̺    Ʈ 
ͺ̽ ȴ.
Ǿ ִ ڰ db μ  ͺ̽    
 ִٴ    mysql_select_db() Լ Ѵ.
18.4.42.2 Return values
̸ 0, ̸ 0 ƴ 
18.4.42.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.43 mysql_shutdown()
int mysql_shutdown(MYSQL *mysql) 
18.4.43.1 Description
ͺ̽  Ͽ ˴ٿǵ ûϸ,    
 ˴ٿ   ־ Ѵ. 
18.4.43.2 Return values
̸ 0, ̸ 0 ƴ  Ѵ.
18.4.43.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away.
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.44 mysql_stat()
char *mysql_stat(MYSQL *mysql) 
18.4.44.1 Description
'mysqladmin status' ɾ  Ǵ     
ϰ ִ ڿ Ѵ.  ڿ ð(uptime), ǰ 
ִ  , (question), õ(reload), ִ ̺   
  ԵǾ ִ.
18.4.44.2 Return values
 ¸ ϴ ڿ. ̸ NULL Ѵ.
18.4.44.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.45 mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql) 
18.4.45.1 Description
  (SELECT, SHOW, DESCRIBE, EXPLAIN)  
 mysql_store_result() Ȥ mysql_use_result() Լ ȣѴ. 
mysql_store_result() Լ ü    Ŭ̾Ʈ  о, 
MYSQL_RES ü Ҵϰ   ü ־ش. ƹ ൵ 
ϵ     (empty result  set) ϵȴ(    
NULL   ٸ).
mysql_store_result() Լ ȣϸ mysql_num_rows() Լ ȣϿ 
      ִ° ˾   ִ.
mysql_fetch_row() Լ ȣϿ  κ    
, Ȥ mysql_row_seek() mysql_row_tell() Լ Ͽ    
  ġ ų ġ   ִ.
  ۾  ݵ mysql_free_result() Լ  ȣ
ش.
18.4.45.2 Return values
  MYSQL_RES  ü(result structure). ̸  NULL
 .
18.4.45.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_OUT_OF_MEMORY 
        Out of memory. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.46 mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql) 
18.4.46.1 Description
 ῡ   ID Ѵ.   mysql_kill() Լ 
 Ǿ 带 kill ϴµ   ִ.
18.4.46.2 Return values
 ῡ   ID.
18.4.46.3 Errors
None. 
18.4.47 mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql) 
18.4.47.1 Description
  (SELECT, SHOW, DESCRIBE, EXPLAIN)  
 mysql_store_result() Ȥ mysql_use_result() Լ ȣѴ. 
mysql_use_result() Լ        ۾  ʱȭ 
mysql_store_result() Լó    о  Ŭ̾Ʈ 
Ѱ ʴ´.  mysql_fetch_row() Լ  ȣν  
 ϳ . ̰   ӽ ̺̳   
       ʰ   κ       о    Ǹ,   ̴ 
mysql_store_result() Լ Ͽ   ξ    
 Ѵ. Ŭ̾Ʈ      max_allowed_packet 
Ʈ   ִ  (communication buffer)  Ҵ
 ȴ.
 Ŭ̾Ʈ   ະ  ۾ ϰ ְų 
 ^S(stop scroll) Է  ִ ũ   
 mysql_use_result() Լ ؼ ȵȴ. ̰   
 ϰ ٸ  Ͽ Ͱ  ִ ̺ 
   ȴ.
mysql_use_result()  Լ       NULL    ϵ   
mysql_fetch_row() Լ ؾ Ѵ.       
   ǿ      Ѿ ϵǰ ȴ.  C 
API 'Commands out of sync'  ְ ȴ. 
mysql_use_result()     Լκ      ϵǴ          ؼ 
mysql_data_seek(),         mysql_row_seek(),        mysql_row_tell(), 
mysql_num_rows(), mysql_affected_
rows()  Լ   , Ȥ mysql_use_result() Լ
   ٸ Ǹ   (    fetch
 Ŀ mysql_num_rows() Լ  fetchǾ   
Ѵ).
 ¿  ۾  ݵ mysql_free_result()  ȣϿ 
Ѵ.
18.4.47.2 Return values
MYSQL_RES  ü(result structure). ̸ NULL Ѵ.
18.4.47.3 Errors
CR_COMMANDS_OUT_OF_SYNC 
        Commands were executed in an improper order. 
CR_OUT_OF_MEMORY 
        Out of memory. 
CR_SERVER_GONE_ERROR 
        The MySQL server has gone away. 
CR_SERVER_LOST 
        The connection to the server was lost during the query. 
CR_UNKNOWN_ERROR 
        An unknown error occurred. 
18.4.48 mysql_query() Լ Ͽµ mysql_store_result() Լ 
 NULL ϴ  ΰ?
̷ 찡    ̰   ϳ  Ȳ Ͽ 
ǹѴ:
        malloc()  (    ʹ ū ).
            (ῡ   ).
        ǰ ƹ  ͵   ʴ  (INSERT,  UPDATE, 
                DELETE   ).
ǹ          (non-empty)          Ͽ 
mysql_num_fields()  Լ   ȣν  üũغ     ִ.   
mysql_num_fields() Լ 0 ϸ   ̰   
ǰ INSERT, DELETE    ʴ ǹ ǹѴ. 
mysql_num_fields() Լ 0 ƴ  ϴ  ǹ 
   ʴ      ؾ߸     ǹѴ.   ڼ    
mysql_num_fields() Լ  Ѵ.
mysql_errno() Լ mysql_error() Լ ȣν   Ʈ
غ  ִ.
18.4.49 What results can I get from a query?
  ϵǴ  ¿ ٿ      
  ִ:
- mysql_affected_rows() INSERT, UPDATE, DELETE      
ֱٿ  ǿ   affected   Ѵ.  ܴ 
DELETE WHERE  Ǿ  ̺ truncateǴ ̴.   
 mysql_affected_rows() Լ affected ڵ ڷμ 0 
Ѵ.
-   mysql_num_rows()                  Ѵ. 
mysql_store_result()      Լ      Բ     Ǵ      쿡 
mysql_store_result() ϵڸ ִ  mysql_num_rows() ȣ
Ǿ.     mysql_use_result()    Բ     Ǵ    쿡 
mysql_fetch_row()   ؼ  Ŀ mysql_num_rows() 
ȣ  ִ.
- mysql_insert_id() AUTO_INCREMENT ε  ̺  ߰
   ֱٿ   ID Ѵ.
-   ǵ(LOAD DATA  INFILE  ..., INSERT  INTO ...   SELECT ..., 
UPDATE) ΰ  Ѵ.   mysql_info() Ͽ 
ϵȴ. mysql_info()  ΰ    NULL 
Ѵ.
18.4.50 How can I get the unique ID for the last inserted row?
AUTO_INCREMENT Ӽ  ÷ ϰ ִ ̺  ο 
ڵ带 ϴ , mysql_insert_id() Լ ȣν  ֱ
  ID   ִ.
 ڵ带 ν AUTO_INCREMENT ε Ǿ  üũ
   ִ.  ǰ AUTO_INCREMENT ε  INSERT ΰ
 üũ  ִ:
if (mysql_error(&mysql)[0] == 0  && mysql_num_fields(result) == 0  && 
mysql_insert_id(&mysql) != 0)
{
    used_id = mysql_insert_id(&mysql);
}
ϳ ̺  ID ٸ ̺ ϴµ  ϰ 
    SQL  Ѵ:
INSERT INTO foo (auto,  text) VALUES(NULL, 'text');             # 
generate ID by inserting NULL
INSERT INTO foo2 (id, text) VALUES(LAST_INSERT_ID(), 'text');  #  use 
ID in second table
18.4.51 Problems linking with the C API
 ýۿ C API linkingϿ       
  ִ:
gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket 
-lnsl
Undefined       first referenced
symbol          in file
floor            /usr/local/lib/mysql/libmysqlclient.a(password.o)
ld: fatal: Symbol referencing errors. No output written to client
    ϴ  쿡   ÿ -lm  ߰ν 
math ̺귯 Բ  ش.
18.4.52 How to make a thread-safe client
Ŭ̾Ʈ  thread-safeϴ.  ū  'net.c'  
 д ƾ interrupt-safe ϴٴ ̴. ̰  
κ д ۾  ɸ  Ŭ̾Ʈ ۾ ߴ  ִ 
  ̶   ۼǾ.
ǥ Ŭ̾Ʈ ̺귯  ɼǾ ϵǾ.
Thread-safe Ŭ̾Ʈ  ؼ -lmysys, -lstring, -ldbug 
̺귯  ϴ net_serv.o Բ Ѵ.
Threaded client ϸ 'thr_alarm.c' Ͽ ִ ƾ  Ȱ 
 ִ. mysys ̺귯 ƾ   ؾ  Ѱ 
my_init() Լ   ȣؾ Ѵٴ ̴!
mysql_real_connect()   Լ  thread-safeϴ.  
 뿡 thread-safe Ŭ̾Ʈ ̺귯 ϴ  
װ thread-safe  ϴ  Ͽ  Ѵ(⼭ 
mysql_real_connect() Լ   ϸ, mysql_connect()  
쿡 ϴ).
mysql_real_connect() Լ thread-safeϰ  ؼ  
 Ŭ̾Ʈ Ͽ Ѵ:
shell> CPPFLAGS=-DTHREAD_SAFE_CLIENT ./configure ...
pthread ̺귯 Ʈ ԵǾ ʱ  ǥ  Ŭ̾
Ʈ(standard client) ŷ  ǵ  ɺ(undefined symbols)
     ִ.
  'libmysqld.a' ̺귯  thread-safeϴ. ̰ 
ΰ thread mysql_real_connect()   ϵ    ڵ
(connection handle)   ÿ    ʴ   Ŭ̾Ʈ  ڵ尡 
thread-safeϴٴ  ǹѴ; Ŭ̾Ʈ/  ־ 
ῡ Ͽ ÿ ϳ û Ѵ.  ῡ  Ͽ 
    thread   ϱ    ϴ    쿡   mysql_query() 
mysql_store_result() ȣ   (call combination)  Ͽ  mutex 
lock ؾ Ѵ.
ϴ mysql_store_result()  غǸ lock       ٸ 
thread  ῡ Ͽ query   ִ(ٽ  ؼ,  
ٸ    thread       locking       ϴ     
mysql_store_result() Բ   ٸ MYSQL_RES ͵  
  ִ). POSIX thread αѴٸ mutex lock ϰ 
ϴµ pthread_mutex_lock() pthread_mutex_
unlock() Լ   ִ.
mysql_store_result() ƴ   mysql_use_result() ϴ  쿡 
lock mysql_use_result() mysql_fetch_row()  ȣ  surround
 ʿ䰡 ִ.  threaded client mysql_use_result()  
 ʴ   .
19. Ÿ DB 
19.1 Mysql/mSQL 
̹ Mysql ڰ  ̹Ƿ  ο ΰ ƾ Ѵ. 
 ڵ ˰ ִ´ ϰ ۼǾ.
Ǵ Լ, Ÿ, ѻ crash-me   ϸ ȴ.
<>
ӵ  ؼ Mysql ġũ Ѵ. (11)  mSQL 
   ϴ ϰ , (parser)  ,  
  ϴ.    쿡 mSQL  ӵ 
.
- / ݺϸ鼭  ᶧ  Ǹ ϴ Ʈ
- ÷ Ű ִ   ̺ ڷ Է(INSER)ϴ 
- CREATE TABLE, DROP TABLE
- ε  SELECT ϴ (̺ ˻ ſ )
̷ ۾ ſ ؼ, ۽  ϰ ɸ 쿡 . 
 ǰ Mysql    ش. 
 ܿ   鿡 Mysql mSQL(  ٸ SQL α)  
.
-  SELECT 
- 뷮 ڷḦ ˻ (Mysql  پ   
   Ѵ)
-  ڿ  ̺. Mysql ȿ Ǿ VARCHA
  R ÷ ε   ִ.
-  ÷  ̺ ٷ 
- ڵ ̰ ū ̺ ٷ 
-  ǥ(expression)  SELECT  ϴ 
- Ŵ ̺ SELECT ϴ 
- ÿ   óؾ . Mysql  Ƽ带 
  Ѵ.   ڽ 带  ̴ 忡  ٸ 
  带 ٸ ʿ䰡 ٴ  ǹѴ. ( 尡 ٸ 
   ϱ ϴ ̺ ϰ ִ  ) mSQL 
  ϳ  Ǹ  ῡ Ǹ ϵ  ʵ 
 
  ù °   ٸ ͵ ٷѴ. ù  °  
  Ǹ   ǰ  ٸ ͵ ٽ ٷѴ.
- . mSQL SELECT ̺   ϸ û 
  . ġŷ α Ͽ ,  ð Mysql 
 
  15000 ȴ. mSQL    ̺  ϱ 
 
   ȭⰡ  ̴. , ̺ mSQL2  
 
    Ȯϰ ̺ ϰ WHERE  ϰ  ε 
   ϸ   . 11 Mysql ġŷ .
-  ORDER BY and GROUP BY.
- DISTINCT
- TEXT   BLOB ÷ 
-  GROUP BY, HAVING. mSQL GROUP BY  ʴ´. Mysql 
   ϰ GROUP BY  HAVING ϸ  Լ Ѵ.
   COUNT(), AVG(), MIN(), MAX(), SUM() and STD(). COUNT(*) ϳ 
   ̺ SELECT ϰ, ÷ ˻  WHERE  
     ſ  ȭǾִ. MIN()  MAX() ڿ 
   ڸ . 
- INSERT  UPDATE 갡. 
        )Mysql> UPDATE SET x=x*10+y WHERE x<20;
- ˸ƽ. Mysql ÷ ˸ƽ ִ.
- ÷ ̸ . Mysql ø ̸ ǿ  ̺ 
ϴٸ,     ڸ  ʿ䰡 . (** table_name.column_name 
̷      ʾƵ ȴٴ Դϴ**)
- SELECT پ Լ . 7.3 Լ .
<ũ  ȿ>
̺  ۰   ִ° Ѵ. Mysql ſ  
Ÿ Ƿ ſ   ϵ ̺   ִ. 
   Ÿ ϳ MEDIUMINT 3 Ʈ long̴. 
1 ڵ尡 ִ ,  ڵ 1 Ʈ ϴ  ſ 
߿ϴ. mSQL2 ϴ  Ÿ ѵǾ־ ̺ ۰ 
Ⱑ ƴ. 
<>
  Ǵϴ    ƴϴ. Mysql  
1.5 . 츮(Mysql ) mSQL    
Ƿ ̿ ؼ   .
<>
ֿ  ϳ ̴̼. Mysql mSQL  ̼ 
å   ݵ ϴ.  ǰ ϵ ּ 
̼ ̸    ؾѴ. ( Ǹϴ 
ǰ Mysql ԵǾ ̼ ݵ ʿϴ)
< ̽>
Mysql  ߰ ɰ Բ mSQL   ̽ 
 ִ.
Mysql  4 JDBC ̹ ִ.
- The gwe driver: A Java interface by GWE technologies (not supported 
anymore).
- The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU
- The twz driver: A type 4 JDBC driver by Terrence W. Zellers and 
educational use.
- The mm driver: A type 4 JDBC driver by Mark Matthews{{}}
õϴ ̹ twz mm ̴̹. Ѵ Ǹϰ ۵ϴ 
 Ǿ.
mSQL JDBC ̹ ִ  ˰      
.
<ӵ>
Mysql ſ  Ը   ,  C C++ ڵ 
ſ  ϴµ  ͼִ. , Լ, GROUP BY  mSQL 
   ͵ Ƽ  ־. mSQL ֱ 
'HISTORY' ϰ Mysql ۷ Ŵ   غ. 
   ߵǰ ִ Ȯ ̴.
<ƿƼ α>
mSQL Mysql ſ پ -Ƽ  ִ. mSQL Mysql 
ϴ  ſ  , mSQL 밡 κ ø
̼ Mysql   ִ.
Mysql  mSQL2Mysql α ִµ mSQL Mysql  
κ C-API Լ 縵 ٲ  ִ. mSQL Mysql  Ŭ
Ʈ α ϴ  Ϲ ״ ð ɸ ʴ´.
19.1.1 mSQL  Mysql ٲٱ
  , mSQL C-API ϴ mSQL-tcl  mSQLjava 
Mysql C-API   ۵  ֵ ȯϴ  ð̸ ϴ.
ȯ  :
1. ҽ mSQL2Mysql ũƮ Ѵ.  replace α
 ʿѵ, Mysql Բ ȴ.
2. 
3.    
 mSQL C API Mysql C API    .
- Mysql uses a Mysql structure as a connection type (mSQL uses an 
int).
-  Mysql_connect() takes a pointer to a Mysql structure as a 
parameter. It is easy to define one globally or to use malloc() to 
get one. Mysql_connect() also takes 2 parameters for specifying the 
user and password. You may set these to NULL, NULL for default use.
- Mysql_error() takes the Mysql structure as a parameter. Just add 
the parameter to your old mSQL_error() code if you are porting old 
code.
- Mysql returns an error number and a text error message for all 
errors. mSQL returns only a text error message.
- Some incompatibilities exist as a result of Mysql supporting 
multiple connections to the server from the same process.{{}} 
( Mysql  μ    ϹǷ ȣȯ 
ʴ κ Ѵ.)
19.1.2 mSQL  Mysql  Ŭ̾Ʈ/   
mSQL Mysql Ѵ  ϰų    ִ.
Mysql   mSQL ݰ ٸ  ֿ   
.
-  ۿ  ˻   ִ.
-  ۴ dz   ۺ ũ,  Ŭ̾Ʈ
  Ѽ  Ȯ   ִ.
- ߺǰų нǵ Ŷ   Ŷ ڸ   ִ.
-  ÷  ƽŰ ۵ȴ. ÷  ̴ ̳ʸ ڵ
(1, 2, 3 Ʈ) ٷ ۵ȴ. 
- Mysql can read in the result unbuffered (without having to store 
  the full set in the client).
-  /б  30̻ ɸ,   Ѵ.
-  8ð ̻  ,   Ѵ.
19.1.3  How mSQL 2.0 SQL syntax differs from Mysql
(**   ʽϴ. ɽϸ ѹ о. mSQL ẻ 
 Ǿ ״   **)
Column types
Mysql
Has the following additional types (among others; see see section 
7.6)
ENUM type for one of a set of strings.
SET type for many of a set of strings.
BIGINT type for 64-bit integers.{{
}}
Mysql also supports the following additional type attributes:
UNSIGNED option for integer columns.
ZEROFILL option for integer columns.
AUTO_INCREMENT option for integer columns that are a PRIMARY KEY. 
DEFAULT value for all columns.{{
}}
mSQL2
mSQL column types correspond to the Mysql types shown below:{{
}}
mSQLtype        Corresponding Mysql type
CHAR(len)       CHAR(len)
TEXT(len)       TEXT(len). len is the maximal length. And LIKE works.
INT             INT. With many more options!
REAL            REAL. Or FLOAT. Both 4- and 8-byte versions are avail
able.
UINT            INT UNSIGNED
DATE            DATE. Uses ANSI SQL format rather than mSQL's own.
TIME            TIME
MONEY   DECIMAL(12,2). A fixed-point value with two decimals.
{{
}}
{{
}}Index creation
Mysql
Indexes may be specified at table creation time with the CREATE TABLE 
statement.
mSQL
Indexes must be created after the table has been created, with 
separate CREATE INDEX statements.{{
}}
To insert a unique identifier into a table
Mysql
Use AUTO_INCREMENT as a column type specifier. 
mSQL
Create a SEQUENCE on a table and select the _seq column.{{
}}
To obtain a unique identifier for a row
Mysql
Add a PRIMARY KEY or UNIQUE key to the table.
mSQL
Use the _rowid column. Observe that _rowid may change over time depen
ding on many factors.{{
}}
To get the time a column was last modified
Mysql
Add a TIMESTAMP column to the table. This column is automatically set 
to the current date and time for INSERT or UPDATE statements if you 
don't give the column a value or if you give it a NULL value.
mSQL
Use the _timestamp column.{{
}}
NULL value comparisons
Mysql
Mysql follows ANSI SQL and a comparison with NULL is always NULL.
mSQL
In mSQL, NULL = NULL is TRUE. You must change =NULL to IS NULL and <>
NULL to IS NOT NULL when porting old code from mSQL to Mysql.{{
}}
String comparisons
Mysql
Normally, string comparisons are performed in case-independent 
fashion with the sort order determined by the current character set 
(ISO-8859-1 Latin1 by default). If you don't like this, declare your 
columns with the BINARY attribute, which causes comparisons to be 
done according to the ASCII order used on the Mysql server host.
mSQL
All string comparisons are performed in case-sensitive fashion with 
sorting in ASCII order.{{
}}
Case-insensitive searching
Mysql
LIKE is a case-insensitive or case-sensitive operator, depending on 
the columns involved. If possible, Mysql uses indexes if the LIKE 
argument doesn't start with a wildcard character.
mSQL
Use CLIKE.{{
}}
Handling of trailing spaces
Mysql
Strips all spaces at the end of CHAR and VARCHAR columns. Use a TEXT 
column if this behavior is not desired.
mSQL
Retains trailing space.{{
}}
WHERE clauses
Mysql
Mysql correctly prioritizes everything (AND is evaluated  before OR). 
To get mSQL behavior in Mysql, use parentheses (as shown below).mSQL 
Evaluates everything from left to right. This means that some logical 
calculations with more than three arguments cannot be expressed in 
any way. It also means you must change some queries when you upgrade 
to Mysql. You do this easily by adding parentheses. Suppose you have 
the following mSQL query:
Mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
To make Mysql evaluate this the way that mSQL would, you must add 
parentheses:
Mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4)
)));
{{
}}Access control
Mysql
Has tables to store grant (permission) options per user, host and 
database. 
mSQL
Has a file `mSQL.acl' in which you can grant read/write privileges 
for users.
19.2 PostgreSQL Mysql 
PostgreSQL - Ÿ, Ʈ, , Ʈ    
   ִ.  ANSI SQL  ODBC ǥ Ÿ̳ 
Լ  ̾ϴ. ǰų  ʴ , Ÿ, Լ 
crash-me   .
(http://www.Mysql.com/crash-me-choose.htmy)
Ϲ PostgreSQL Mysql . 11 [ġũ] . ̰
 κ Ʈ ý ̴.  Ʈ ʿϰ ӵ 
  ִٸ PostgreSQL غ  ִ.
=======================================================================
                            -           -
##  : mysql 3.21 Reference Manual PostScript Ŵ
( ֽ Ŵ 3.22 ۷ Ŵ̸ 3.22.14b-gammaԴϴ.)
5, 6, 9, 10, 11, 12, 13, 15, 17  : (taejun@hitel.net)
18  C-API κ  : ǿ (golmong@cre.co.kr) 
ġ õ κ kldp.org database  õ   
Ƿ Ͻø ˴ϴ.
                                         << MySQL Reference Manual >>
                                                 version : MySQL 3.21
                                                              K.N.U.T
                                                 Software Engineering
                                                              9801260
                                                               
                                                          1999. 9. 29