¸¶½ºÅÍÆ÷À¯(Master4U)
Monday, 17 of January
 

·Î±×ÀÎ Category
MySQL 3.21 Reference Manual PostScript
±èÀÎÈ£  2006-03-12 04:37:15 Hit:103882
¸µÅ© #1: http://kldp.org/Translations/MySQL-KLDP

       ## ¿øº» : 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 ¼­¹ö¿¡¼­´Â ÀÌ·¯ÇÑ È®Àå±â´ÉÀ»
»ç¿ëÇÏÁö ¾Ê°í °Ç³Ê¶é ¼ö ÀÖ´Ù. ¿¹¸¦ º¸ÀÚ:

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Àº ÇÕ´çÇÑ SQL¹®À̱⠶§¹®¿¡  '--'°¡ ÁÖ¼®¹®ÀÇ ½ÃÀÛÀ» ÀǹÌÇϴ  °ÍÀ»
²¨¸®´Â °ÍÀÌ´Ù.

'--' ÁÖ¼®À» Æ÷ÇÔÇÏ´Â ÅØ½ºÆ® ÆÄÀÏÀÇ 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{{<EM>
}}
only{{</EM>
}}
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<d ORDER BY RAND() LIMIT 1000.

LEAST(X,Y,...)
With two or  more arguments, returns  the smallest  (minimum-valued)
argument. The arguments are compared using the following rules:

If the return value is used  in an INTEGER context, or all  arguments
are integer-valued, they are compared as integers.
If the return value is used in  a REAL context, or all arguments  are
real-valued, they are compared as reals.

If any   argument is   a case-sensitive  string,  the  arguments  are
compared as case-sensitive strings.

In other   cases, the   arguments are  compared  as  case-insensitive
strings.

mysql> 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{{<EM>
}}
not{{</EM>
}}
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{{<EM>
}}
don't{{</EM>
}}
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 ¹®¼­ ÀÇ ´Ù¸¥ ºÎºÐÀ» »ìÆìº¼ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù).

º» Æ©Å丮¾ó¿¡¼­´Â µ¥ÀÌÅͺ£À̽º¸¦ ¼³°èÇÏ°í  »ç¿ëÇÏ´Â ¸ðµç °úÁ¤À»  ´Ù·é
´Ù. ÀÌ¹Ì Á¸ÀçÇÏ´Â µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ´Â °Í¿¡¸¸ °ü½ÉÀÌ ÀÖ´Ù¸é µ¥ÀÌÅÍ
º£À̽º¿Í ±× ¾È¿¡ ÀÖÀ» Å×À̺íÀ»  ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇÑ ÀýÀº  °Ç³Ê¶ç¾îµµ
ÁÁ´Ù.

Æ©Å丮¾ó ¼º°ÝÀÇ ±ÛÀ̶ó ÀÚ¼¼ÇÑ °ÍÀº ¼³¸íµÇÁö ¾Ê´Â´Ù. ¿©±â¿¡  ¾ð±ÞµÈ °Í
¿¡ ´ëÇØ ´õÀÚ¼¼È÷ ¾Ë°í ½Í°Åµç 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 AND b=c) AND a=5
    -> 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Àº µ¥ÀÌÅÍ ÆÄÀÏÀ» Á¶È¸ÇÏÁö ¾Ê°í À妽º¿¡¼­ ·¹ÄÚµå
¸¦ ÀÐÀ» ¼ö ÀÖ´Ù. À妽º¿¡¼­ »ç¿ëÇÑ ¸ðµç Ä÷³ÀÌ ¼ýÀÚ¶ó¸é ÁúÀǸ¦ ó¸®ÇÏ
´Âµ¥ ´ÜÁö À妽º Æ®¸®¸¸À» »ç¿ëÇÑ´Ù.

- °¢ ·¹Äڵ尡 Ãâ·ÂµÇ±â Àü¿¡ HAVING Àý¿¡ ¸ÂÁö ¾Ê´Â ·¹ÄÚµå´Â °Ç³Ê¶Ú´Ù.

´ÙÀ½Àº ¸Å¿ì ºü¸¥ ÁúÀÇÀÇ ¿¹ÀÌ´Ù:
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 Å×À̺íÀÇ Ä³½¬´Â table_cacheÀÇ  ÃÖ´ë°ª±îÁö Ä¿Áú ¼ö ÀÖ´Ù.  (±âº»°ª
64 ; ÀÌ °ªÀº mysqld¿¡¼­ -0 table_cache=# À¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù) ij½¬°¡ ²Ë
áÀ»¶§, ±×¸®°í ´Ù¸¥ ½º·¹µå°¡ Å×À̺íÀ»  ¿­·Á°í ÇÒ ¶§, ¶Ç´Â  mysqladmin
refresh ³ª mysqladmin  flush-tables¸¦ »ç¿ëÇÒ¶§¸¦ Á¦¿ÜÇϰí´Â  Å×À̺íÀº
°áÄÚ ´ÝÈ÷Áö ¾Ê´Â´Ù.

Å×À̺í 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°¡ ÀÖÀ» ¶§ À¯¿ëÇÏ´Ù.

{{<!-- This HTML file has been  created by texi2html 1.52 (hacked  by
david@detron.se)
     from /dr1/my/masters/mysql/Docs/manual.texi  on 2   Febuary 1999
-->
}}

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 ¿Í Àß ÀÛµ¿ÇÑ´Ù. ±×·¸Áö¸¸ ¾Æ·¡ÀÇ  °¢ ¸ñ·Ï¿¡
ÀÖ´Â °ÍÀº ¿ì¸®°¡ Á÷Á¢ Å×½ºÆÃÇÏ¿´°Å³ª ´Ù¸¥ »ç¶÷µéÀÌ  Á¦´ë·Î ÀÛµ¿ÇÑ´Ù°í
È®ÁõÇØ ÁØ °ÍÀÌ´Ù::
¤·¾×¼¼½º
¾×¼¼½º¿Í´Â Àß ÀÛµ¿ÇÑ´Ù:
        - Å×ÀÌºí¿¡¼­ ÇÁ¶óÀ̸Ӹ® ۸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
        - ¾÷µ¥ÀÌÆ®°¡ µÇ±æ ¿øÇÏ´Â ¸ðµç Å×ÀÌºí¿¡ 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 Å×À̺íÀº ÆÄÀÏ·Î ÀúÀåµÇ±â ¶§¹®¿¡  ¹é¾÷ÇϱⰡ ½±´Ù.  ÀϰüµÈ ¹é¾÷
ÀÛ¾÷À» À§ÇØ   °ü·ÃµÈ Å×ÀÌºí¿¡   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()  ÇÔ¼ö´Â °á°ú ¼Â  ³»ÀÇ ¸ðµç  ÇàµéÀÌ
retrieveµÇ±â ÀÌÀü¿¡´Â ¿Ã¹Ù
¸¥ °ªÀ» ¸®ÅÏÇÏÁö ¸øÇÑ´Ù.

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 Ä÷³ »ç¿ë


<SQL Ư¡>
-  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°ú µ¿ÀÏÇÑ ÆÞ ÀÎÅÍÆäÀ̽º¸¦
°¡Áö°í ÀÖ´Ù.


<JDBC(Java)>
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{{</LI>}}
ÃßõÇÏ´Â µå¶óÀ̹ö´Â 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.{{</LI>}}
( 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.{{</LI>
}}

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.{{</LI>
}}

mSQL2
mSQL column types correspond to the Mysql types shown below:{{<TBODY>
}}

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.
{{</TBODY>
}}

{{</DD>
}}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.{{</DD>
}}

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.{{</DD>
}}
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.{{</DD>
}}

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.{{</DD>
}}
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.{{</DD>
}}


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.{{</DD>
}}

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.{{</DD>
}}
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.{{</DD>
}}
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)
)));
{{</DD>
}}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



º»¹®Àμ⺻¹®¸ÞÀϹ߼Û
¡â Register_Globals °æ°í¸Þ¼¼Áö
¡ä MySQL DB µ¥ÀÌŸ ¹é¾÷/º¹±¸ ÇÏ´Â ¹æ¹ý
Copyright 1999-2025 Zeroboard / skin by ChanBi