## ¿øº» : 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½¬°¡ ÀÓ½ÃÀûÀ¸·Î È®ÀåµÈ »óÅÂÀ̰í Å×À̺íÀ» »ç¿ëÇÒ ¼ö ¾ø´Â »óȲÀ¸·Î
°¡¸é Å×À̺íÀ» ´Ý°í 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
|