0
Title




    MySQL Idiosyncrasies
        that BITE
                                   2010.06




Ronald Bradford
http:/...
Definitions




     idiosyncrasy
     [id-ee-uh-sing-kruh-see, -sin-]
     –noun,plural-sies.


     A characteristic, hab...
Relational Database




     Strictly, a relational database is a collection of
     relations (frequently called tables)....
Relational Database Structure/Requirements




     Relations or Tables
     Base and derived relations (e.g. views or res...
Oracle != MySQL




     Age
     Development philosophies
     Target audience
     Developer practices
     Installed ve...
RDBMS Characteristics




     Data Integrity
     Transactions
     ACID
     Data Security
     ANSI SQL



MySQL Idiosy...
These RDBMS characteristics
 are NOT enabled by default
        in MySQL


MySQL Idiosyncrasies That BITE - 2010.06
1. Data Integrity


MySQL Idiosyncrasies That BITE - 2010.06
Data Integrity - Expected




CREATE TABLE sample_data (
  i TINYINT UNSIGNED NOT NULL,
                                  ...
Data Integrity - Unexpected




                                                      ✘
mysql> INSERT INTO sample_data (i)...
Data Integrity - Warnings




mysql> INSERT INTO sample_data (i) VALUES (-1), (9000);
Query OK, 2 rows affected, 2 warning...
Data Integrity - Unexpected (2)




mysql> INSERT INTO sample_data (c)
    -> VALUES ('A'),('BB'),('CCC');
               ...
Data Integrity - Warnings (2)




mysql> INSERT INTO sample_data (c) VALUES ('A'),('BB'),('CCC');
Query OK, 3 rows affecte...
SHOW WARNINGS

                                    http://dev.mysql.com/doc/refman/5.1/en/show-warnings.html



MySQL Idio...
Using SQL_MODE for Data Integrity




SQL_MODE = STRICT_ALL_TABLES;




                                  http://dev.mysql...
Data Integrity - Expected




mysql> SET SESSION SQL_MODE=STRICT_ALL_TABLES;
mysql> TRUNCATE TABLE sample_data;
          ...
Data Integrity with Dates - Expected




mysql> SET SESSION SQL_MODE='';
mysql> INSERT INTO sample_date (d) VALUES ('2010-...
Data Integrity with Dates - Unexpected




mysql>
mysql>
            TRUNCATE TABLE sample_date;
            INSERT INTO s...
Using SQL_MODE for Date Integrity




SQL_MODE =
      STRICT_ALL_TABLES,
      NO_ZERO_DATE,
      NO_ZERO_IN_DATE;



  ...
Data Integrity with Dates - Expected




mysql> SET SESSION
SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE';
   ...
2. Transactions


MySQL Idiosyncrasies That BITE - 2010.06
Transactions Example - Tables




DROP TABLE IF EXISTS parent;
CREATE TABLE parent (
  id   INT UNSIGNED NOT NULL AUTO_INC...
Transactions Example - SQL




START TRANSACTION;
INSERT INTO parent(val) VALUES("a");
INSERT INTO child(parent_id,created...
Transactions Example - Expected




...
mysql> INSERT INTO parent (val) VALUES("a");
                                     ...
Transactions Example - Using MyISAM




ALTER TABLE child ENGINE=MyISAM;
ALTER TABLE parent ENGINE=MyISAM;
TRUNCATE TABLE ...
Transactions Example - Unexpected




mysql> INSERT INTO parent (val) VALUES("a");
ERROR 1062 (23000): Duplicate entry 'a'...
Transactions Example - Unexpected (2)




mysql> ROLLBACK;
Query OK, 0 rows affected, 1 warning (0.00 sec)
               ...
Transactions Solution




       mysql> SET GLOBAL storage_engine=InnoDB;


       # my.cnf
       [mysqld]
       default...
Why use Non Transactional Tables?




     No transaction overhead
          Much faster
          Less disk writes
      ...
3. Variable Scope


MySQL Idiosyncrasies That BITE - 2010.06
Variable Scope Example




mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL);

mysql> SHOW CREATE TABLE test1G
CREATE TA...
Variable Scope Example (2)




mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine';
+----------------+--------+
| Variable_...
Variable Scope Example (3)




mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine';
+----------------+--------+
           ...
Variable Scope Example (4)




mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine';
+----------------+--------+
| Variable_...
Variable Scope Syntax




     SHOW [GLOBAL | SESSION] VARIABLES;
     SET [GLOBAL | SESSION] variable = value;
     Defau...
4. Storage Engines


MySQL Idiosyncrasies That BITE - 2010.06
Storage Engines Example - Creation




CREATE TABLE test1 (
  id INT UNSIGNED NOT NULL
                                   ...
Storage Engines Example - Unexpected




CREATE TABLE test1 (
  id INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET l...
Storage Engines Example - Cause




    mysql> SHOW ENGINES;
+------------+---------+-------------------------+-----------...
Storage Engines Example - Unexpected (2)




mysql> CREATE TABLE test1
id INT UNSIGNED NOT NULL
) ENGINE=InnDB DEFAULT CHA...
Using SQL_MODE for Storage Engines




SQL_MODE =
      STRICT_ALL_TABLES,
      NO_ZERO_DATE,
      NO_ZERO_IN_DATE,
    ...
Storage Engines Example - Solution




SET SESSION SQL_MODE=NO_ENGINE_SUBSTITUTION;        ✔
DROP TABLE IF EXISTS test3;
C...
5. ACID


MySQL Idiosyncrasies That BITE - 2010.06
Atomicity -
                      All or nothing


MySQL Idiosyncrasies That BITE - 2010.06
Atomicity - Table




DROP TABLE IF EXISTS test1;
CREATE TABLE test1(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  val CHA...
Atomicity - Data




INSERT INTO test1(val) VALUES ('a'),('b'),('c'),('d'),('e'),
('f'),('g');

mysql> SELECT * FROM test1...
Atomicity - Unexpected




mysql> UPDATE test1 SET id = 10 - id;
ERROR 1062 (23000): Duplicate entry '7' for key
         ...
Atomicity - Unexpected (2)




mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
                                     ...
Atomicity - Transactional Table




ALTER TABLE test1 ENGINE=InnoDB;
DELETE FROM test1 WHERE id > 5;
SELECT * FROM test1;
...
Atomicity - The culprit




mysql> SHOW GLOBAL VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Va...
Atomicity - Recommendations




     Always wrap SQL in transactions
          START TRANSACTION | BEGIN [WORK]
          ...
Isolation -
     Transactions do not affect
        other transactions


MySQL Idiosyncrasies That BITE - 2010.06
Transaction Isolation - Levels




       READ-UNCOMMITTED
       READ-COMMITTED
       REPEATABLE-READ
       SERIALIZABL...
Transaction Isolation - Default




     The default is
          REPEATABLE-READ

     SET GLOBAL tx_isolation = 'READ-CO...
Oracle READ COMMITTED
           !=
 MySQL READ-COMMITTED

MySQL Idiosyncrasies That BITE - 2010.06
Transaction Isolation - Binary Logging Errors




SET GLOBAL tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.0...
Durability -
                  No committed
               transactions are lost


MySQL Idiosyncrasies That BITE - 2010.06
Data Safety




     MyISAM writes/flushes data every statement
          Does not flush indexes (*)
     InnoDB can relax d...
Auto Recovery




     InnoDB has it
     MyISAM does not - (*) Indexes


     MYISAM-RECOVER=FORCE,BACKUP
     REPAIR TAB...
Recovery Time




     InnoDB is consistent
          Redo Log file size
          Slow performance in Undo
     MyISAM gro...
InnoDB Auto Recovery Example




InnoDB: Log scan progressed past the checkpoint lsn 0 188755039
100624 16:37:44 InnoDB: D...
MyISAM Repair needed Example




100126 22:44:35 [ERROR] /var/lib/mysql5/bin/mysqld: Table './XXX/
descriptions' is marked...
6. Data Security


MySQL Idiosyncrasies That BITE - 2010.06
User Privileges - Practices




Best Practice
CREATE USER goodguy@localhost IDENTIFIED BY 'sakila';
GRANT CREATE,SELECT,IN...
User Privileges - Normal Bad Practice




     GRANT ALL ON *.* TO user@’%’
          *.* gives you access to all tables i...
User Privileges - Why SUPER is bad




     SUPER
          Bypasses read_only
          Bypasses init_connect
          C...
SUPER and Read Only




$ mysql -ugoodguy -psakila odtug
mysql> insert into test1(id) values(1);
                         ...
SUPER and Init Connect




#my.cnf
[client]
init_connect=SET NAMES utf8


This specifies to use UTF8 for communication wit...
SUPER and Init Connect (2)




✔                       $ mysql -usuperman odtug
$ mysql -ugoodguy -psakila odtug
         ...
SUPER and Binary Log




mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| F...
SUPER and Binary Log (2)




$ mysqlbinlog binary-log.000001 --start-position=354 --stop-position=674

# at 354
#100604 18...
SUPER and reserved connection




$ mysql -uroot                                         ✔
mysql> show global variables li...
SUPER and reserved connection - Unexpected




$ mysql -uroot
ERROR 1040 (HY000): Too many connections
                   ...
7. ANSI SQL


MySQL Idiosyncrasies That BITE - 2010.06
Group By Example




SELECT country, COUNT(*) AS color_count
FROM   flags
GROUP BY country;


                            ...
Group By Example (2)




SET SESSION sql_mode=ONLY_FULL_GROUP_BY;
                                                        ...
Using SQL_MODE for ANSI SQL




SQL_MODE =
      STRICT_ALL_TABLES,
      NO_ZERO_DATE,
      NO_ZERO_IN_DATE,
      NO_EN...
8. Case Sensitivity


MySQL Idiosyncrasies That BITE - 2010.06
Case Sensitivity String Comparison




  SELECT 'USA' = UPPER('usa');
+----------------------+
| 'USA' = UPPER('usa') |
+-...
Case Sensitivity Tables




# Server 1

mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL);
mysql> INSERT INTO test1 VALU...
Case Sensitivity Tables (2)




# Server 1 - Mac OS X / Windows Default
mysql> SHOW GLOBAL VARIABLES LIKE 'lower%';
+-----...
Other Gotchas


MySQL Idiosyncrasies That BITE - 2010.06
Other features the BITE




     Character Sets
       Data/Client/Application/Web
     Sub Queries
       Rewrite as JOIN...
Conclusion


MySQL Idiosyncrasies That BITE - 2010.06
DON'T
                   ASSUME
MySQL Idiosyncrasies That BITE - 2010.06
Conclusion - The story so far




MySQL Idiosyncrasies that BITE
Definitions, Relational Database [Structure/Requirements],...
Conclusion - SQL_MODE




     SQL_MODE =

                                                                               ...
RonaldBradford.com

  MySQL4OracleDBA.com


MySQL Idiosyncrasies That BITE - 2010.06
Upcoming SlideShare
Loading in...5
×

MySQL Idiosyncrasies That Bite

10,407

Published on

While MySQL is a popular and widely used RDBMS, some default features and settings are very foreign in comparison with other commercial RDBMS products. In this discussion, Ronald Bradford will discuss some of the MySQL defaults including a non-transactional state, silent data truncations, date management, and transaction isolation options. These are all critical for data integrity and consistency. He will cover in-depth topics including SQL_MODE that saves the day. He will also cover character sets and collations and the best practices to ensure your UTF8 is stored and retrieved correctly.

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
10,407
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
203
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "MySQL Idiosyncrasies That Bite"

  1. 1. Title MySQL Idiosyncrasies that BITE 2010.06 Ronald Bradford http://ronaldbradford.com2010.06 MySQL Idiosyncrasies That BITE - #odtug #mysql @ronaldbradford
  2. 2. Definitions idiosyncrasy [id-ee-uh-sing-kruh-see, -sin-] –noun,plural-sies. A characteristic, habit, mannerism, or the like, that is peculiar to an individual. http;//dictionary.com MySQL Idiosyncrasies That BITE - 2010.06
  3. 3. Relational Database Strictly, a relational database is a collection of relations (frequently called tables). Other items are frequently considered part of the database, as they help to organize and structure the data, in addition to forcing the database to conform to a set of requirements. Source: http://en.wikipedia.org/wiki/Relational_database MySQL Idiosyncrasies That BITE - 2010.06
  4. 4. Relational Database Structure/Requirements Relations or Tables Base and derived relations (e.g. views or result sets) Attributes (i.e. columns) Domain (i.e. column attributes and constraints) Constraints Stored procedures Indices MySQL Idiosyncrasies That BITE - 2010.06
  5. 5. Oracle != MySQL Age Development philosophies Target audience Developer practices Installed versions MySQL Idiosyncrasies That BITE - 2010.06
  6. 6. RDBMS Characteristics Data Integrity Transactions ACID Data Security ANSI SQL MySQL Idiosyncrasies That BITE - 2010.06
  7. 7. These RDBMS characteristics are NOT enabled by default in MySQL MySQL Idiosyncrasies That BITE - 2010.06
  8. 8. 1. Data Integrity MySQL Idiosyncrasies That BITE - 2010.06
  9. 9. Data Integrity - Expected CREATE TABLE sample_data ( i TINYINT UNSIGNED NOT NULL, ✔ c CHAR(2) NULL, t TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET latin1; INSERT INTO sample_data(i) VALUES (0), (100), (255); Query OK, 3 rows affected (0.00 sec) SELECT * FROM sample_data; +-----+------+---------------------+ | i | c | t | +-----+------+---------------------+ | 0 | NULL | 2010-06-06 13:28:44 | | 100 | NULL | 2010-06-06 13:28:44 | | 255 | NULL | 2010-06-06 13:28:44 | +-----+------+---------------------+ 3 rows in set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  10. 10. Data Integrity - Unexpected ✘ mysql> INSERT INTO sample_data (i) VALUES (-1), (9000); mysql> SELECT * FROM sample_data; +-----+------+---------------------+ | i | c | t | +-----+------+---------------------+ | 0 | NULL | 2010-06-06 13:28:44 | | 100 | NULL | 2010-06-06 13:28:44 | | 255 | NULL | 2010-06-06 13:28:44 | | 0 | NULL | 2010-06-06 13:32:52 | | 255 | NULL | 2010-06-06 13:32:52 | +-----+------+---------------------+ 5 rows in set (0.01 sec) MySQL Idiosyncrasies That BITE - 2010.06
  11. 11. Data Integrity - Warnings mysql> INSERT INTO sample_data (i) VALUES (-1), (9000); Query OK, 2 rows affected, 2 warnings (0.00 sec) mysql> SHOW WARNINGS; +---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1264 | Out of range value for column 'i' at row 1 | | Warning | 1264 | Out of range value for column 'i' at row 2 | +---------+------+--------------------------------------------+ MySQL Idiosyncrasies That BITE - 2010.06
  12. 12. Data Integrity - Unexpected (2) mysql> INSERT INTO sample_data (c) -> VALUES ('A'),('BB'),('CCC'); ✘ mysql> SELECT * FROM sample_data WHERE c IS NOT NULL; +---+------+---------------------+ | i | c | t | +---+------+---------------------+ | 0 | A | 2010-06-06 13:34:59 | | 0 | BB | 2010-06-06 13:34:59 | | 0 | CC | 2010-06-06 13:34:59 | +---+------+---------------------+ 3 rows in set (0.09 sec) MySQL Idiosyncrasies That BITE - 2010.06
  13. 13. Data Integrity - Warnings (2) mysql> INSERT INTO sample_data (c) VALUES ('A'),('BB'),('CCC'); Query OK, 3 rows affected, 2 warnings (0.00 sec) Records: 3 Duplicates: 0 Warnings: 1 mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ Only listed | Warning | 1364 | Field 'i' doesn't have a default value | | Warning | 1265 | Data truncated for column 'c' at row 3 | for 1 row +---------+------+----------------------------------------+ 2 rows in set (0.01 sec) MySQL Idiosyncrasies That BITE - 2010.06
  14. 14. SHOW WARNINGS http://dev.mysql.com/doc/refman/5.1/en/show-warnings.html MySQL Idiosyncrasies That BITE - 2010.06
  15. 15. Using SQL_MODE for Data Integrity SQL_MODE = STRICT_ALL_TABLES; http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html MySQL Idiosyncrasies That BITE - 2010.06
  16. 16. Data Integrity - Expected mysql> SET SESSION SQL_MODE=STRICT_ALL_TABLES; mysql> TRUNCATE TABLE sample_data; ✔ mysql> INSERT INTO sample_data(i) VALUES (0), (100), (255); mysql> INSERT INTO sample_data (i) VALUES (-1), (9000); ERROR 1264 (22003): Out of range value for column 'i' at row 1 mysql> SELECT * FROM sample_data; +-----+------+---------------------+ | i | c | t | +-----+------+---------------------+ | 0 | NULL | 2010-06-06 14:39:48 | | 100 | NULL | 2010-06-06 14:39:48 | | 255 | NULL | 2010-06-06 14:39:48 | +-----+------+---------------------+ 3 rows in set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  17. 17. Data Integrity with Dates - Expected mysql> SET SESSION SQL_MODE=''; mysql> INSERT INTO sample_date (d) VALUES ('2010-02-31'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | ✘ +---------+------+----------------------------------------+ | Warning | 1265 | Data truncated for column 'd' at row 1 | +---------+------+----------------------------------------+ mysql> SELECT * FROM sample_date; +------------+ | d | +------------+ | 0000-00-00 | ✔ +------------+ mysql> SET SESSION SQL_MODE=STRICT_ALL_TABLES; mysql> INSERT INTO sample_date (d) VALUES ('2010-02-31'); ERROR 1292 (22007): Incorrect date value: '2010-02-31' for column 'd' at row 1 MySQL Idiosyncrasies That BITE - 2010.06
  18. 18. Data Integrity with Dates - Unexpected mysql> mysql> TRUNCATE TABLE sample_date; INSERT INTO sample_date (d) VALUES ('2010-00-00'); ✘ mysql> INSERT INTO sample_date (d) VALUES ('2010-00-05'); mysql> INSERT INTO sample_date (d) VALUES ('0000-00-00'); mysql> SELECT * FROM sample_date; +------------+ | d | +------------+ | 2010-00-00 | | 2010-00-05 | | 0000-00-00 | +------------+ 3 rows in set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  19. 19. Using SQL_MODE for Date Integrity SQL_MODE = STRICT_ALL_TABLES, NO_ZERO_DATE, NO_ZERO_IN_DATE; http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html MySQL Idiosyncrasies That BITE - 2010.06
  20. 20. Data Integrity with Dates - Expected mysql> SET SESSION SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE'; ✔ mysql> TRUNCATE TABLE sample_date; mysql> INSERT INTO sample_date (d) VALUES ('2010-00-00'); ERROR 1292 (22007): Incorrect date value: '2010-00-00' for column 'd' at row 1 mysql> INSERT INTO sample_date (d) VALUES ('2010-00-05'); ERROR 1292 (22007): Incorrect date value: '2010-00-05' for column 'd' at row 1 mysql> INSERT INTO sample_date (d) VALUES ('0000-00-00'); ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'd' at row 1 mysql> SELECT * FROM sample_date; Empty set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  21. 21. 2. Transactions MySQL Idiosyncrasies That BITE - 2010.06
  22. 22. Transactions Example - Tables DROP TABLE IF EXISTS parent; CREATE TABLE parent ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, val VARCHAR(10) NOT NULL, PRIMARY KEY (id), UNIQUE KEY (val) ) ENGINE=InnoDB DEFAULT CHARSET latin1; DROP TABLE IF EXISTS child; CREATE TABLE child ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INT UNSIGNED NOT NULL, created TIMESTAMP NOT NULL, PRIMARY KEY (id), INDEX (parent_id) ) ENGINE=InnoDB DEFAULT CHARSET latin1; MySQL Idiosyncrasies That BITE - 2010.06
  23. 23. Transactions Example - SQL START TRANSACTION; INSERT INTO parent(val) VALUES("a"); INSERT INTO child(parent_id,created) VALUES(LAST_INSERT_ID(),NOW()); INSERT INTO parent(val) VALUES("a"); ROLLBACK; SELECT * FROM parent; SELECT * FROM child; MySQL Idiosyncrasies That BITE - 2010.06
  24. 24. Transactions Example - Expected ... mysql> INSERT INTO parent (val) VALUES("a"); ✔ ERROR 1062 (23000): Duplicate entry 'a' for key 'val' mysql> ROLLBACK; mysql> SELECT * FROM parent; Empty set (0.00 sec) mysql> SELECT * FROM child; Empty set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  25. 25. Transactions Example - Using MyISAM ALTER TABLE child ENGINE=MyISAM; ALTER TABLE parent ENGINE=MyISAM; TRUNCATE TABLE child; TRUNCATE TABLE parent; START TRANSACTION; INSERT INTO parent(val) VALUES("a"); INSERT INTO child(parent_id,created) VALUES(LAST_INSERT_ID(),NOW()); INSERT INTO parent (val) VALUES("a"); ROLLBACK; SELECT * FROM parent; SELECT * FROM child; MySQL Idiosyncrasies That BITE - 2010.06
  26. 26. Transactions Example - Unexpected mysql> INSERT INTO parent (val) VALUES("a"); ERROR 1062 (23000): Duplicate entry 'a' for key 'val' ✘ mysql> ROLLBACK; mysql> SELECT * FROM parent; +----+-----+ | id | val | +----+-----+ | 1 | a | +----+-----+ 1 row in set (0.00 sec) mysql> SELECT * FROM child; +----+-----------+---------------------+ | id | parent_id | created | +----+-----------+---------------------+ | 1 | 1 | 2010-06-03 13:53:38 | +----+-----------+---------------------+ 1 row in set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  27. 27. Transactions Example - Unexpected (2) mysql> ROLLBACK; Query OK, 0 rows affected, 1 warning (0.00 sec) ✘ mysql> SHOW WARNINGS; +---------+-------+------------------------------------- | Level | Code | Message | +---------+------+-------------------------------------- | Warning | 1196 | Some non-transactional changed tables couldn't be rolled back | +---------+------+-------------------------------------- MySQL Idiosyncrasies That BITE - 2010.06
  28. 28. Transactions Solution mysql> SET GLOBAL storage_engine=InnoDB; # my.cnf [mysqld] default-storage-engine=InnoDB # NOTE: Requires server restart http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_default-storage-engine MySQL Idiosyncrasies That BITE - 2010.06
  29. 29. Why use Non Transactional Tables? No transaction overhead Much faster Less disk writes Lower disk space requirements Less memory requirements http://dev.mysql.com/doc/refman/5.1/en/storage-engine-compare-transactions.html MySQL Idiosyncrasies That BITE - 2010.06
  30. 30. 3. Variable Scope MySQL Idiosyncrasies That BITE - 2010.06
  31. 31. Variable Scope Example mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL); mysql> SHOW CREATE TABLE test1G CREATE TABLE `test1` ( `id` int(10) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 MySQL Idiosyncrasies That BITE - 2010.06
  32. 32. Variable Scope Example (2) mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine'; +----------------+--------+ | Variable_name | Value | Changing in +----------------+--------+ MySQL 5.5 | storage_engine | MyISAM | +----------------+--------+ mysql> SET GLOBAL storage_engine='InnoDB'; mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine'; +----------------+--------+ | Variable_name | Value | +----------------+--------+ | storage_engine | InnoDB | +----------------+--------+ MySQL Idiosyncrasies That BITE - 2010.06
  33. 33. Variable Scope Example (3) mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine'; +----------------+--------+ ✘ | Variable_name | Value | +----------------+--------+ | storage_engine | InnoDB | +----------------+--------+ mysql> DROP TABLE test1; mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL); mysql> SHOW CREATE TABLE test1G CREATE TABLE `test1` ( `id` int(10) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 MySQL Idiosyncrasies That BITE - 2010.06
  34. 34. Variable Scope Example (4) mysql> SHOW GLOBAL VARIABLES LIKE 'storage_engine'; +----------------+--------+ | Variable_name | Value | +----------------+--------+ | storage_engine | InnoDB | +----------------+--------+ mysql> SHOW SESSION VARIABLES LIKE 'storage_engine'; +----------------+--------+ | Variable_name | Value | +----------------+--------+ | storage_engine | MyISAM | +----------------+--------+ MySQL Idiosyncrasies That BITE - 2010.06
  35. 35. Variable Scope Syntax SHOW [GLOBAL | SESSION] VARIABLES; SET [GLOBAL | SESSION] variable = value; Default is GLOBAL since 5.0.2 http://dev.mysql.com/doc/refman/5.1/en/set-option.html http://dev.mysql.com/doc/refman/5.1/en/user-variables.html MySQL Idiosyncrasies That BITE - 2010.06
  36. 36. 4. Storage Engines MySQL Idiosyncrasies That BITE - 2010.06
  37. 37. Storage Engines Example - Creation CREATE TABLE test1 ( id INT UNSIGNED NOT NULL ✘ ) ENGINE=InnoDB DEFAULT CHARSET latin1; SHOW CREATE TABLE test1G *************************** 1. row ************* Table: test1 Create Table: CREATE TABLE `test1` ( `id` int(10) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 MySQL Idiosyncrasies That BITE - 2010.06
  38. 38. Storage Engines Example - Unexpected CREATE TABLE test1 ( id INT UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET latin1; Query OK, 0 rows affected, 2 warnings (0.13 sec) SHOW WARNINGS; +---------+------+-----------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------+ | Warning | 1286 | Unknown table engine 'InnoDB' | | Warning | 1266 | Using storage engine MyISAM for table 'test1' | +---------+------+-----------------------------------------------+ 2 rows in set (0.00 sec) MySQL Idiosyncrasies That BITE - 2010.06
  39. 39. Storage Engines Example - Cause mysql> SHOW ENGINES; +------------+---------+-------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+-------------------------+--------------+------+------------+ | InnoDB | NO | Supports transaction... | NULL | NULL | NULL | | MEMORY | YES | Hash based, stored i... | NO | NO | NO | | MyISAM | DEFAULT | Default engine as ... | NO | NO | NO | MySQL Idiosyncrasies That BITE - 2010.06
  40. 40. Storage Engines Example - Unexpected (2) mysql> CREATE TABLE test1 id INT UNSIGNED NOT NULL ) ENGINE=InnDB DEFAULT CHARSET latin1; ✘ Query OK, 0 rows affected, 2 warnings (0.11 sec) mysql> SHOW WARNINGS; +---------+------+-----------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------+ | Warning | 1286 | Unknown table engine 'InnDB' | | Warning | 1266 | Using storage engine MyISAM for table 'test1' | +---------+------+-----------------------------------------------+ MySQL Idiosyncrasies That BITE - 2010.06
  41. 41. Using SQL_MODE for Storage Engines SQL_MODE = STRICT_ALL_TABLES, NO_ZERO_DATE, NO_ZERO_IN_DATE, NO_ENGINE_SUBSTITUTION; http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html MySQL Idiosyncrasies That BITE - 2010.06
  42. 42. Storage Engines Example - Solution SET SESSION SQL_MODE=NO_ENGINE_SUBSTITUTION; ✔ DROP TABLE IF EXISTS test3; CREATE TABLE test3 ( id INT UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET latin1; ERROR 1286 (42000): Unknown table engine 'InnoDB' MySQL Idiosyncrasies That BITE - 2010.06
  43. 43. 5. ACID MySQL Idiosyncrasies That BITE - 2010.06
  44. 44. Atomicity - All or nothing MySQL Idiosyncrasies That BITE - 2010.06
  45. 45. Atomicity - Table DROP TABLE IF EXISTS test1; CREATE TABLE test1( id INT UNSIGNED NOT NULL AUTO_INCREMENT, val CHAR(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET latin1; MySQL Idiosyncrasies That BITE - 2010.06
  46. 46. Atomicity - Data INSERT INTO test1(val) VALUES ('a'),('b'),('c'),('d'),('e'), ('f'),('g'); mysql> SELECT * FROM test1; +----+-----+ | id | val | +----+-----+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5 | e | | 6 | f | | 7 | g | +----+-----+ 7 rows in set (0.00 sec) mysql> UPDATE test1 SET id = 10 - id; MySQL Idiosyncrasies That BITE - 2010.06
  47. 47. Atomicity - Unexpected mysql> UPDATE test1 SET id = 10 - id; ERROR 1062 (23000): Duplicate entry '7' for key ✘ 'PRIMARY' mysql> SELECT * FROM test1; +----+-----+ | id | val | +----+-----+ | 9 | a | | 8 | b | | 3 | c | | 4 | d | | 5 | e | | 6 | f | | 7 | g | +----+-----+ MySQL Idiosyncrasies That BITE - 2010.06
  48. 48. Atomicity - Unexpected (2) mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) ✘ mysql> SELECT * FROM test1; +----+-----+ | id | val | +----+-----+ | 9 | a | | 8 | b | ... MySQL Idiosyncrasies That BITE - 2010.06
  49. 49. Atomicity - Transactional Table ALTER TABLE test1 ENGINE=InnoDB; DELETE FROM test1 WHERE id > 5; SELECT * FROM test1; ✘ +----+-----+ | id | val | +----+-----+ | 3 | c | | 4 | d | | 5 | e | +----+-----+ ROLLBACK; SELECT * FROM test1; +----+-----+ | id | val | +----+-----+ | 3 | c | | 4 | d | | 5 | e | +----+-----+ MySQL Idiosyncrasies That BITE - 2010.06
  50. 50. Atomicity - The culprit mysql> SHOW GLOBAL VARIABLES LIKE 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ MySQL Idiosyncrasies That BITE - 2010.06
  51. 51. Atomicity - Recommendations Always wrap SQL in transactions START TRANSACTION | BEGIN [WORK] COMMIT MySQL Idiosyncrasies That BITE - 2010.06
  52. 52. Isolation - Transactions do not affect other transactions MySQL Idiosyncrasies That BITE - 2010.06
  53. 53. Transaction Isolation - Levels READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html http://ronaldbradford.com/blog/understanding-mysql-innodb-transaction-isolation-2009-09-24/ MySQL Idiosyncrasies That BITE - 2010.06
  54. 54. Transaction Isolation - Default The default is REPEATABLE-READ SET GLOBAL tx_isolation = 'READ-COMMITTED'; This is a mistake http://ronaldbradford.com/blog/dont-assume-common-terminology-2010-03-03/ MySQL Idiosyncrasies That BITE - 2010.06
  55. 55. Oracle READ COMMITTED != MySQL READ-COMMITTED MySQL Idiosyncrasies That BITE - 2010.06
  56. 56. Transaction Isolation - Binary Logging Errors SET GLOBAL tx_isolation='READ-COMMITTED'; Query OK, 0 rows affected (0.00 sec) ✘ mysql> insert into test1 values (1,'x'); ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT' MySQL Idiosyncrasies That BITE - 2010.06
  57. 57. Durability - No committed transactions are lost MySQL Idiosyncrasies That BITE - 2010.06
  58. 58. Data Safety MyISAM writes/flushes data every statement Does not flush indexes (*) InnoDB can relax durability Every transaction / per second innodb_flush_log_at_trx_commit sync_binlog innodb_support_xa MySQL Idiosyncrasies That BITE - 2010.06
  59. 59. Auto Recovery InnoDB has it MyISAM does not - (*) Indexes MYISAM-RECOVER=FORCE,BACKUP REPAIR TABLE myisamchk MySQL Idiosyncrasies That BITE - 2010.06
  60. 60. Recovery Time InnoDB is consistent Redo Log file size Slow performance in Undo MyISAM grows with data volume MySQL Idiosyncrasies That BITE - 2010.06
  61. 61. InnoDB Auto Recovery Example InnoDB: Log scan progressed past the checkpoint lsn 0 188755039 100624 16:37:44 InnoDB: Database was not shut down normally! InnoDB: Starting crash recovery. ✔ InnoDB: Reading tablespace information from the .ibd files... InnoDB: Restoring possible half-written data pages from the doublewrite InnoDB: buffer... InnoDB: Doing recovery: scanned up to log sequence number 0 193997824 InnoDB: Doing recovery: scanned up to log sequence number 0 195151897 InnoDB: 1 transaction(s) which must be rolled back or cleaned up InnoDB: in total 105565 row operations to undo InnoDB: Trx id counter is 0 18688 100624 16:37:45 InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percents: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 99 InnoDB: Apply batch completed InnoDB: Last MySQL binlog file position 0 12051, file name ./binary-log. 000003 InnoDB: Starting in background the rollback of uncommitted transactions ... MySQL Idiosyncrasies That BITE - 2010.06
  62. 62. MyISAM Repair needed Example 100126 22:44:35 [ERROR] /var/lib/mysql5/bin/mysqld: Table './XXX/ descriptions' is marked as crashed and should be repaired 100126 22:44:35 [Warning] Checking table: './XXX/descriptions' ✘ 100126 22:44:35 [ERROR] /var/lib/mysql5/bin/mysqld: Table './XXX/taggings' is marked as crashed and should be repaired 100126 22:44:35 [Warning] Checking table: './XXX/taggings' 100126 22:44:35 [ERROR] /var/lib/mysql5/bin/mysqld: Table './XXX/vehicle' is marked as crashed and should be repaired MySQL Idiosyncrasies That BITE - 2010.06
  63. 63. 6. Data Security MySQL Idiosyncrasies That BITE - 2010.06
  64. 64. User Privileges - Practices Best Practice CREATE USER goodguy@localhost IDENTIFIED BY 'sakila'; GRANT CREATE,SELECT,INSERT,UPDATE,DELETE ON odtug.* TO ✔ goodguy@localhost; Normal Practice CREATE USER superman@'%'; GRANT ALL ON *.* TO superman@'%'; ✘ http://dev.mysql.com/doc/refman/5.1/en/create-user.html http://dev.mysql.com/doc/refman/5.1/en/grant.html MySQL Idiosyncrasies That BITE - 2010.06
  65. 65. User Privileges - Normal Bad Practice GRANT ALL ON *.* TO user@’%’ *.* gives you access to all tables in all schemas @’%’ give you access from any external location ALL gives you ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, FILE, INDEX, INSERT, LOCK TABLES, PROCESS, REFERENCES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHOW DATABASES, SHOW VIEW, SHUTDOWN, SUPER, TRIGGER, UPDATE, USAGE MySQL Idiosyncrasies That BITE - 2010.06
  66. 66. User Privileges - Why SUPER is bad SUPER Bypasses read_only Bypasses init_connect Can Disable binary logging Change configuration dynamically No reserved connection MySQL Idiosyncrasies That BITE - 2010.06
  67. 67. SUPER and Read Only $ mysql -ugoodguy -psakila odtug mysql> insert into test1(id) values(1); ✔ ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement $ mysql -usuperman odtug mysql> insert into test1(id) values(1); Query OK, 1 row affected (0.01 sec) ✘ MySQL Idiosyncrasies That BITE - 2010.06
  68. 68. SUPER and Init Connect #my.cnf [client] init_connect=SET NAMES utf8 This specifies to use UTF8 for communication with client and data MySQL Idiosyncrasies That BITE - 2010.06
  69. 69. SUPER and Init Connect (2) ✔ $ mysql -usuperman odtug $ mysql -ugoodguy -psakila odtug ✘ mysql> SHOW SESSION VARIABLES LIKE mysql> SHOW SESSION VARIABLES LIKE 'ch%'; 'character%'; +--------------------------+----------+ +--------------------------+----------+ | Variable_name | Value | Variable_name| | Value | +--------------------------+----------+ +--------------------------+----------+ | character_set_client | character_set_client | utf8 | | latin1 | | character_set_connection | utf8 | | character_set_connection | latin1 | | character_set_database character_set_database | | latin1 | | latin1 | | character_set_filesystem | binary | | character_set_filesystem | binary | | character_set_results | character_set_results | utf8 | | latin1 | | character_set_server | character_set_server | latin1 | | latin1 | | character_set_system | character_set_system | utf8 | | utf8 | +--------------------------+----------+ +--------------------------+----------+ MySQL Idiosyncrasies That BITE - 2010.06
  70. 70. SUPER and Binary Log mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | binary-log.000001 | 354 | | | +-------------------+----------+--------------+------------------+ mysql> DROP TABLE time_zone_leap_second; mysql> SET SQL_LOG_BIN=0; mysql> DROP TABLE time_zone_name; mysql> SET SQL_LOG_BIN=1; mysql> DROP TABLE time_zone_transition; mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | binary-log.000001 | 674 | | | +-------------------+----------+--------------+------------------+ MySQL Idiosyncrasies That BITE - 2010.06
  71. 71. SUPER and Binary Log (2) $ mysqlbinlog binary-log.000001 --start-position=354 --stop-position=674 # at 354 #100604 18:00:08 server id 1 end_log_pos 450 Query thread_id=1 exec_time=0 error_code=0 use mysql/*!*/; SET TIMESTAMP=1275688808/*!*/; ✘ DROP TABLE time_zone_leap_second /*!*/; # at 579 #100604 18:04:31 server id 1 end_log_pos 674 Query thread_id=2 exec_time=0 error_code=0 use mysql/*!*/; SET TIMESTAMP=1275689071/*!*/; DROP TABLE time_zone_transition /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; MySQL Idiosyncrasies That BITE - 2010.06
  72. 72. SUPER and reserved connection $ mysql -uroot ✔ mysql> show global variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 3 | +-----------------+-------+ 1 row in set (0.07 sec) mysql> show global status like 'threads_connected'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 4 | +-------------------+-------+ MySQL Idiosyncrasies That BITE - 2010.06
  73. 73. SUPER and reserved connection - Unexpected $ mysql -uroot ERROR 1040 (HY000): Too many connections ✘ mysql> SHOW PROCESSLIST; +----+------+-----------+-------+---------+------+------------+--------------- | Id | User | Host | db | Command | Time | State | Info +----+------+-----------+-------+---------+------+------------+--------------- | 13 | root | localhost | odtug | Query | 144 | User sleep | UPDATE test1 ... | 14 | root | localhost | odtug | Query | 116 | Locked | select * from test1 | 15 | root | localhost | odtug | Query | 89 | Locked | select * from test1 MySQL Idiosyncrasies That BITE - 2010.06
  74. 74. 7. ANSI SQL MySQL Idiosyncrasies That BITE - 2010.06
  75. 75. Group By Example SELECT country, COUNT(*) AS color_count FROM flags GROUP BY country; ✔ +-----------+-------------+ | country | color_count | +-----------+-------------+ | Australia | 3 | | Canada | 2 | | Japan | 2 | | Sweden | 2 | | USA | 3 | +-----------+-------------+ SELECT country, COUNT(*) ✘ FROM flags; +-----------+----------+ | country | COUNT(*) | +-----------+----------+ | Australia | 12 | +-----------+----------+ MySQL Idiosyncrasies That BITE - 2010.06
  76. 76. Group By Example (2) SET SESSION sql_mode=ONLY_FULL_GROUP_BY; ✔ SELECT country, COUNT(*) FROM flags; ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause http://ExpertPHPandMySQL.com Chapter 1 - Pg 31 MySQL Idiosyncrasies That BITE - 2010.06
  77. 77. Using SQL_MODE for ANSI SQL SQL_MODE = STRICT_ALL_TABLES, NO_ZERO_DATE, NO_ZERO_IN_DATE, NO_ENGINE_SUBSTITUTION, ONLY_FULL_GROUP_BY; MySQL Idiosyncrasies That BITE - 2010.06
  78. 78. 8. Case Sensitivity MySQL Idiosyncrasies That BITE - 2010.06
  79. 79. Case Sensitivity String Comparison SELECT 'USA' = UPPER('usa'); +----------------------+ | 'USA' = UPPER('usa') | +----------------------+ | 1 | +----------------------+ SELECT 'USA' = 'USA', 'USA' = 'Usa', 'USA' = 'usa', 'USA' = 'usa' COLLATE latin1_general_cs AS different; +---------------+---------------+---------------+-----------+ | 'USA' = 'USA' | 'USA' = 'Usa' | 'USA' = 'usa' | different | +---------------+---------------+---------------+-----------+ | 1 | 1 | 1 | 0 | +---------------+---------------+---------------+-----------+ SELECT name, address, email FROM customer ✘ WHERE name = UPPER('bradford') MySQL Idiosyncrasies That BITE - 2010.06
  80. 80. Case Sensitivity Tables # Server 1 mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL); mysql> INSERT INTO test1 VALUES(1); mysql> INSERT INTO TEST1 VALUES(2); # Server 2 mysql> CREATE TABLE test1(id INT UNSIGNED NOT NULL); mysql> INSERT INTO test1 VALUES(1); mysql> INSERT INTO TEST1 VALUES(2); ERROR 1146 (42S02): Table 'test.TEST1' doesn't exist MySQL Idiosyncrasies That BITE - 2010.06
  81. 81. Case Sensitivity Tables (2) # Server 1 - Mac OS X / Windows Default mysql> SHOW GLOBAL VARIABLES LIKE 'lower%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_file_system | ON | | lower_case_table_names | 2 | +------------------------+-------+ # Server 2 - Linux Default mysql> SHOW GLOBAL VARIABLES LIKE 'lower%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_file_system | OFF | | lower_case_table_names | 0 | +------------------------+-------+ MySQL Idiosyncrasies That BITE - 2010.06
  82. 82. Other Gotchas MySQL Idiosyncrasies That BITE - 2010.06
  83. 83. Other features the BITE Character Sets Data/Client/Application/Web Sub Queries Rewrite as JOIN when possible Views No always efficient Cascading Configuration Files SQL_MODE's not to use MySQL Idiosyncrasies That BITE - 2010.06
  84. 84. Conclusion MySQL Idiosyncrasies That BITE - 2010.06
  85. 85. DON'T ASSUME MySQL Idiosyncrasies That BITE - 2010.06
  86. 86. Conclusion - The story so far MySQL Idiosyncrasies that BITE Definitions, Relational Database [Structure/Requirements], Oracle != MySQL, RDBMS Characteristics, Data Integrity [Expected | Unexpected | Warnings | Unexpected (2) | Warnings (2) ], Using SQL_MODE for Data Integrity, Data Integrity [ Expected ], Data Integrity with Dates [Expected | Unexpected ], Using SQL_MODE for Date Integrity, Data Integrity with Dates [Expected ], Transactions Example [ Tables | SQL | Expected | Using MyISAM | Unexpected [ (2)], Transactions Solution, Why use Non Transactional Tables? Variable Scope Example [ | (2)| (3)| [4])| Syntax Storage Engines Example [Creation | Unexpected | Cause | Unexpected (2) ] Using SQL_MODE for Storage Engines, Storage Engines Example [Solution] Atomicity [ Table | Data | Unexpected | Unexpected (2) | Transactional Table | The culprit | Recommendations ] Transaction Isolation [ Levels | Default | Binary Logging ] Durablilty [ Auto Recovery] User Privileges [Practices | Normal Bad Practice | Why SUPER is bad ] SUPER and [ Read Only | Init Connect [(2)] | Binary Log [2] | Reserved Connection [2] ] Group by Example [2], Using SQL_MODE for ANSI SQL Case Sensitivity [ String Comparison | Tables [2] ] More Gotchas, Character Sets, Sub Queries, Views Conclusion [ DON'T ASSUME | The Story so far | SQL_MODE ] RonaldBradford.com MySQL Idiosyncrasies That BITE - 2010.06
  87. 87. Conclusion - SQL_MODE SQL_MODE = ✔ ALLOW_INVALID_DATES, ANSI_QUOTES, ERROR_FOR_DIVISION_ZERO, HIGH_NOT_PRECEDENCE,IGNORE_SPACE,NO_AUTO_CREATE_USER, NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES, NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION, NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS, NO_UNSIGNED_SUBTRACTION,NO_ZERO_DATE, NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY (5.1.11), PAD_CHAR_TO_FULL_LENGTH (5.1.20), PIPES_AS_CONCAT, REAL_AS_FLOAT,STRICT_ALL_TABLES, STRICT_TRANS_TABLES ✘ ANSI, DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL,TRADITIONAL http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html ? MySQL Idiosyncrasies That BITE - 2010.06
  88. 88. RonaldBradford.com MySQL4OracleDBA.com MySQL Idiosyncrasies That BITE - 2010.06
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×