æè¿ãªãã MySQL ã使ã Ruby ã¢ããªã PostgreSQL ã«å¯¾å¿ããç¾½ç®ã«ãªã£ã¦ããã®ã§ãããä»ã¾ã§ã»ã¨ãã© MySQL 以å¤ã® RDBMS ã触ã£ã¦ãªãã£ãã®ã§ãè²ã ããã£ããããã®ã§ã¡ã¢ã£ã¨ãã¾ãã
ãªã PostgreSQL æ´ãæµ ãã®ã§ééã£ã¦ããã¨æ¸ãã¦ãããããã¾ããã
API
ããã°ã©ã ãã MySQL ã«ã¢ã¯ã»ã¹ããã«ã¯ Ruby/MySQL ã使ã£ã¦ããã®ã§ãããPostgreSQL ç¨ã® API ãæ°ãã«è¦ããã®ã¯é¢åã ã£ãã®ã§ãSequel ã使ã£ã¦æ¸ãç´ãã¾ããã
mysql.query("select col1, col2 from table where col3='xxx'") â db[:table].where(col3: 'xxx').select(:col1, :col2)
â¦ã¿ãããªæãã§ãã
ä»ã¾ã§ããã°ã©ã ä¸ã«çªç¶ SQL ãç¾ãã¦ãã¦èªã¿ã«ããã£ãã®ããRuby ããã°ã©ã ã¨ãã¦èªã¿ããããªãã¨ããå¹æãããã¾ããã
Sequel ã«ã¤ãã¦ã¯åã«è¨äºãæ¸ããã®ã§èå³ãããã°è¦ã¦ãã ããã
ã¦ã¼ã¶ã¼ã¨ãã¼ã¿ãã¼ã¹
MySQL ã¯ãã¼ã¿ãã¼ã¹ãæå®ããã«ãµã¼ãã¼ã«æ¥ç¶ãããã¨ãã§ãã¾ãããã®å ´åãã¼ã¿ãã¼ã¹æªé¸æç¶æ ã«ãªãã¾ããæ¥ç¶å¾ã« use ã使ç¨ãã¦èªç±ã«ãã¼ã¿ãã¼ã¹ãåãæ¿ãããã¨ãã§ãã¾ããã¾ããã«ã¬ã³ãã®ãã¼ã¿ãã¼ã¹ã¨ã¯ç°ãªããã¼ã¿ãã¼ã¹ã®ãã¼ãã«ãæå®ãããã¨ãã§ãã¾ãã
PostgreSQL ã®å ´åã¯ãã¼ã¿ãã¼ã¹ãæå®ããªãã§æ¥ç¶ãããã¨ã¯ã§ãã¾ãããpsql ã³ãã³ãã¯ãã¼ã¿ãã¼ã¹ãçç¥ããã¨ãã¦ã¼ã¶ã¼åã¨åãååã®ãã¼ã¿ãã¼ã¹ã«æ¥ç¶ãããã¨ãã¾ããã¾ããæ¥ç¶å¾ã¯ãã¼ã¿ãã¼ã¹ãå¤æ´ãããã¨ã¯ã§ãã¾ãããpsql ã® \c ã使ãã°ãã¼ã¿ãã¼ã¹ãå¤æ´ã§ãã¾ãããããã¯å é¨çã«ã¯æ°ãããã¼ã¿ãã¼ã¹ã«æ¥ç¶ãã¦å ã®ãã¼ã¿ãã¼ã¹ã¨ã®æ¥ç¶ãåæãã¦ãã¾ãã
Ubuntu ã®å ´å㯠postgres ã¨ããååã®ãã¼ã¿ãã¼ã¹ãæåããç¨æããã¦ãã¾ãã 誰ã§ã使ç¨ã§ããã®ã§ MySQL ã® test ãã¼ã¿ãã¼ã¹ã®ãããªãã®ã§ããããã
ã¦ã¼ã¶ã¼åã¨èªè¨¼
MySQL ã§ã¯ UNIX ãã¡ã¤ã³ã½ã±ããçµç±ã§ã®æ¥ç¶ã§ãã£ã¦ããã¹ã¯ã¼ãã¯å¿ è¦ã§ãããã¹ã¯ã¼ããè¨å®ããªããã¨ãã§ãã¾ããããã®å ´åã¯èª°ã§ããã®ã¦ã¼ã¶ã¼ã§ãã°ã¤ã³ã§ãã¦ãã¾ãã¾ããã¾ã OS ã®ã¦ã¼ã¶ã¼å㨠MySQL ä¸ã®ã¦ã¼ã¶ã¼åã¯ã»ã¨ãã©é¢ä¿ããã¾ãããmysql ã³ãã³ãã§ã¦ã¼ã¶ã¼åçç¥æã« OS ã®ã¦ã¼ã¶ã¼åã使ç¨ãããç¨åº¦ã§ãã
PostgreSQL ã®å ´å㯠UNIX ãã¡ã¤ã³ã½ã±ããçµç±ã®å ´åã¯ãOS ã®ã¦ã¼ã¶ã¼å㨠PostgreSQL ä¸ã®ã¦ã¼ã¶ã¼åãä¸è´ãã¦ããã°ãã¹ã¯ã¼ããèããã¾ãããã¾ã OS ã®ã¦ã¼ã¶ã¼åã¨ç°ãªãã¦ã¼ã¶ã¼åãæå®ãã¦ãæ¥ç¶ã§ãã¾ããããããã¯ã¼ã¯çµç±ã®å ´åã¯ã¦ã¼ã¶ã¼åã¨ãã¹ã¯ã¼ããå¿ è¦ã§ãã
Ubuntu ã®å ´åã¯ããããã postgres ã¨ããã¦ã¼ã¶ã¼ãã¹ã¼ãã¼ã¦ã¼ã¶ã¼ã¨ãã¦ç¨æããã¦ãã¾ããMySQL ã® root ã¨åããããªããã ã¨æãã¾ãã
èªè¨¼ã¾ããã®è¨å®ã¯ pg_hba.conf ãã¡ã¤ã«ã§è¡ãã¾ããã©ã®ã¯ã©ã¤ã¢ã³ãããã®æ¥ç¶ã§ãã©ã®èªè¨¼æ¹å¼ã使ç¨ããããæå®ãããã¨ãã§ãã¾ãã
UNIX ãã¡ã¤ã³ã½ã±ããã®å ´åã«ãã¹ã¯ã¼ããèãããªãã®ã¯ãpg_hba.conf ãã¡ã¤ã«ä¸ã«æ¬¡ã®è¡ãããããã§ãã
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer
ã¦ã¼ã¶ã¼ä½æ
PostgreSQL ã«æ¥ç¶ããã¦ã¼ã¶ã¼ãä½ãã«ã¯ãPostgreSQL ã®ã¹ã¼ãã¼ã¦ã¼ã¶ã¼ã§ createuser ã³ãã³ããå®è¡ãã¾ãã
Ubuntu ã®å ´å㯠postgres ã¦ã¼ã¶ã¼ãã¹ã¼ãã¼ã¦ã¼ã¶ã¼ã§ãã
% sudo -u postgres -i [sudo] password for tommy: postgres$ createuser -P hoge Enter password for new role: Enter it again:
ãã®ä¾ã§ã¯ hoge ã¦ã¼ã¶ã¼ããã¹ã¯ã¼ãã¤ãã§ä½æãã¦ãã¾ãã localhost ãããã使ç¨ããªãå ´åã¯ãã¹ã¯ã¼ããã¤ããªãã¦ãããã¨æãã¾ãã
ãã¼ã¿ãã¼ã¹ä½æ
PostgreSQL ã®ã¹ã¼ãã¼ã¦ã¼ã¶ã¼ã§ createdb ã³ãã³ããå®è¡ãã¾ãã
postgres$ createdb hoge
æ¥ç¶
ã¯ã©ã¤ã¢ã³ãããã®æ¥ç¶ã¯ MySQL ã«æ¯ã¹ã㨠PostgreSQL ã¯éãã§ãã
MySQL ã§ã³ãã¯ã·ã§ã³ãã¼ã«ã使ããã«æ¥ç¶åæãç¹°ãè¿ãã¦ããªãã¨ããªã£ã¦ããå ´åã§ããPostgreSQL ã§ã¯ã³ãã¯ã·ã§ã³ãã¼ã«ã使ããªãã¨ãããªããªãããããã¾ããã
MySQL ã¯1ããã»ã¹ã§åä½ãæ¥ç¶æ¯ã«ã¹ã¬ãããçæããã®ã«å¯¾ããPostgreSQL ã¯æ¥ç¶æ¯ã«ããã»ã¹ãçæããããã ã¨æãã¾ãã
調ã¹ã¦ã¾ãããããããããã¨èªè¨¼ãããã³ã«èªä½ã®å¦çãé¢ä¿ããã®ããããã¾ããã
èªåå¤æç
MySQL ã¯åãä¸è´ããªãã¦ããããã¼ã«å¤æãã¦å¦çãã¦ãããã®ã§ããï¼ããªãä½è¨ãªãä¸è©±ï¼ãPostgreSQL ã¯å³å¯ã«åããã§ãã¯ããã®ã§ãMySQL ã§ã¨ã©ã¼ã«ãªããªãã£ãã¯ã¨ãªãã¨ã©ã¼ã«ãªããã¨ãããã¾ãã
以ä¸ã¯ MySQL ã§ã¯ã¨ã©ã¼ã«ãªãã¾ããããPostgreSQL ã§ã¨ã©ã¼ã«ãªãä¾ã§ãã
- æ°å¤ã«ã©ã ã¸ã®æååã®ç»é²
hoge=> insert into t (i) values ('hoge'); ERROR: invalid input syntax for integer: "hoge" LINE 1: insert into t (i) values ('hoge'); ^
- æ°å¤ã«ã©ã ã¨æååã®æ¯è¼
hoge=> select * from t where i='hoge'; ERROR: invalid input syntax for integer: "hoge" LINE 1: select * from t where i='hoge'; ^
- æååã«ã©ã ã¨æ°å¤ã®æ¯è¼
hoge=> select * from t where s=123; ERROR: operator does not exist: character = integer LINE 1: select * from t where s=123; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
- INSERT æã«ããã©ã«ãå¤ãæããªã NOT NULL ã«ã©ã ãçç¥
hoge=> insert into t (col1) values (123); ERROR: null value in column "col2" violates not-null constraint DETAIL: Failing row contains (123, null).
- SELECT ã«æå®ãã¦ããªãã«ã©ã ã GROUP BY ã«æå®
hoge=> select col1 from t group by col2; ERROR: column "t.col1" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: select col1 from t group by col2; ^
- CHAR ã«ã©ã ã«ãµã¤ãºè¶ éæååãç»é²
hoge=> insert into t (col1) values ('0123456789a'); ERROR: value too long for type character(10)
- DATE ã«ã©ã ã« 0000-00-00 ãç»é²
hoge=> insert into t (d) values ('0000-00-00'); ERROR: date/time field value out of range: "0000-00-00" LINE 1: insert into t (d) values ('0000-00-00'); ^
- DATE ã«ã©ã ã«ä¸æ£ãªæ¥ä»ãç»é²
hoge=> insert into t (d) values ('2014-10-32'); ERROR: date/time field value out of range: "2014-10-32" LINE 1: insert into t (d) values ('2014-10-32'); ^
- 0 é¤ç®
hoge=> select 1/0; ERROR: division by zero
MySQL ã§ã sql_mode ãè¨å®ãããã¨ã§ããããã®ãã¡ã®ããã¤ããã¨ã©ã¼ã«ãããã¨ãã§ãã¾ãã
mysql> set sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY';
ãªããERROR_FOR_DIVISION_BY_ZERO
ãæå®ãããã¨ã§ãUPDATE,INSERT æã®ã¼ãé¤ç®ã¯ã¨ã©ã¼ã«ãªãã¾ãããSELECT ã®æã¯ã¨ã©ã¼ã§ã¯ãªãã¯ã¼ãã³ã°ã«ãªãã¾ãã
UNSIGNED
MySQL ã®æ´æ°åã«ã¯ UNSIGNED ãæå®ãããã¨ãã§ãã¾ãããPostgreSQL ã«ã¯ UNSIGNED åã¯ããã¾ããã
大æåå°æå
MySQL ã®æåååã¯ããã©ã«ãã§ã¯å¤§æåå°æåãåºå¥ãã¾ããããPostgreSQL ã¯å¤§æåå°æåãåºå¥ãã¾ãã
PostgreSQL ã§å¤§æåå°æåãåºå¥ããªãããã«ããã«ã¯ãcitext æ¡å¼µããã¼ã¿ãã¼ã¹ã«å°å ¥ãã¦ãæåååã«ã©ã ä½ææã« char, varchar ã§ã¯ãªã citext ã使ãã®ãè¯ãããã§ãã
hoge=> create table t (s varchar); CREATE TABLE hoge=> insert into t (s) values ('abc'); INSERT 0 1 hoge=> select * from t where s='ABC'; s --- (0 rows)
citext æ¡å¼µãå°å ¥ããã«ã¯ã¹ã¼ãã¼ã¦ã¼ã¶ã¼ã§ãªãã¨ã§ãã¾ããã
hoge=# create extension citext; CREATE EXTENSION
hoge=> create table t (s citext); CREATE TABLE hoge=> insert into t (s) values ('abc'); INSERT 0 1 hoge=> select * from t where s='ABC'; s ----- abc (1 row)
LIKE ã大æåå°æåãåºå¥ãã¾ãã大æåå°æåãåºå¥ããããªãå ´å㯠ILIKE ã使ãã¾ãã
hoge=> select 'abc' like 'ABC'; ?column? ---------- f (1 row) hoge=> select 'abc' ilike 'ABC'; ?column? ---------- t (1 row)
ã¹ãã¼ã
MySQL ã«ã¯ç¡ããã®ã§ãããPostgreSQL ã«ã¯ãã¼ã¿ãã¼ã¹ã¨ãã¼ãã«ã®éã«ã¹ãã¼ãã¨ãããã®ãããã¾ãã ãã¼ã¿ãã¼ã¹å ã§ãã¼ãã«ã®åå空éããããããããã§ãã ç¹ã«æå®ããªãå ´åã¯ããã©ã«ãã®ã¹ãã¼ãã使ãããã®ã§æèããªãã¦ãåé¡ãªãã§ãã
MySQL ã®ãã¼ã¿ãã¼ã¹ã¯ PostgreSQL ã®ãã¼ã¿ãã¼ã¹ã¨ã¹ãã¼ãã®ä¸¡æ¹ãæ··ãã£ããã®ãªã®ããããã¾ããã
ãã©ã³ã¶ã¯ã·ã§ã³
PostgreSQL ã¯ãã©ã³ã¶ã¯ã·ã§ã³ä¸ã§ä½ãã¨ã©ã¼ãçºçããå ´åã¯ã以éã®ã¯ã¨ãªã¯ãã¼ã«ããã¯ããã¾ã§ãã¹ã¦ã¨ã©ã¼ã«ãªãã¾ãã
ãã®ç¶æ ã§ã³ãããããã¨ã¨ã©ã¼ã«ã¯ãªãã¾ããããå®éã«ã¯ãã¼ã«ããã¯ããã¾ããããã¯ã¡ãã£ã¨ç½ ã£ã½ãã§ãã
hoge=> begin; BEGIN hoge=> insert into t (i) values (123); INSERT 0 1 hoge=> hoge; ERROR: syntax error at or near "hoge" LINE 1: hoge; ^ hoge=> select * from t; ERROR: current transaction is aborted, commands ignored until end of transaction block hoge=> commit; ROLLBACK hoge=> select * from t; i --- (0 rows)
MySQL ã¨éããPostgreSQL ã¯ãã©ã³ã¶ã¯ã·ã§ã³ä¸ã§ CREATE TABLE ã DROP TABLE ãã¦ãããã¼ã«ããã¯ããã¨ç¡ãã£ããã¨ã«ãªãã¾ããããã¯çµæ§å¬ããã§ããMySQL ã¯ãã©ã³ã¶ã¯ã·ã§ã³ä¸ã§ CREATE TABLE, DROP TABLE ããã¨ããã®æç¹ã§åæã«ã³ãããããã¦ãã¾ãã¨ããç½ ãããã®ã§â¦ã
ãã®ä»ã®æ§æ
MySQL ã¯æååãªãã©ã«ã®è¡¨è¨ã¯ã'ãã§ãã"ãã§ãè¯ãã§ãããPostgreSQL ã§ã¯ã'ãã ãã§ããã"ãã¯ãã¼ãã«ãã«ã©ã ã®èå¥åãªãã©ã«ã表ãã¾ã(MySQL ã§ã®ã`ãã«ç¸å½)ã
MySQL ã®ã||ãã¯è«çåã表ãã¾ãããPostgreSQL ã§ã¯ã||ãã¯æååçµåã§ãã
ãããã MySQL å´ã§ sql_mode ãæå®ãããã¨ã§ PostgreSQL ã«åããããã¨ãã§ãã¾ãããSequel ã使ã£ã¦ãã°æ§æã®å·®ç°ã¯ããç¨åº¦å¸åãã¦ãããã®ã§ããã¾ãæ°ã«ãã¾ããã§ããã
ãããã«
ã¯ããã¯ãMySQLã¦ã¼ã¶ã¼ã®ããã®PostgreSQLã¬ã¤ããã¨ããã¿ã¤ãã«ã«ãããã¨æã£ãã®ã§ããããããªå¤§å±¤ãªãã¨ã¯æ¸ããªãã£ãã®ã§ããMySQLã¦ã¼ã¶ã¼ãPostgreSQLã触ã£ã¦ã¿ãã¡ã¢ãã«ãã¾ããã
MySQL 㨠PostgreSQL ã¯è²ã éããããã¾ãããæ§æã¾ãã㯠MySQL ã®æ¹ãç¹æ®ã ã¨æãã¾ãããåæã«ä½è¨ãªå¤æã¯ããªãæ¹ãã¿ããªå¹¸ãã«ãªããã¨æãã¾ãã
MySQL ãã PostgreSQL ã«ç§»è¡ããã«ã¯ãã¾ã sql_mode ãè¨å®ãã¦ããã®ç¶æ 㧠MySQL ã§ã¨ã©ã¼ã«ãªããªãããã«ãã¦ãããPostgreSQL ã«ç§»è¡ããã®ãããã¨æãã¾ãã
èªåã®å ´åã¯ãæ°å¤ã¨æååã®æ¯è¼ã¨ããæ°å¤ã«ã©ã ã«æ°åæååå ¥ãããã¨ãã¦ããã¨ããSELECT ã§æå®ãã¦ãªãã«ã©ã ã GROUP BY ã«æå®ãã¦ããã¨ãè²ã ããã¾ããã
ãã¨ãæè¿ MySQL ã sql_mode ã®ããã©ã«ãå¤ãå³ãç®ã«ããããã«ãªã£ã¦ãã®ã§ãPostgreSQL ã¨ã¯é¢ä¿ãªããå¯è½ã§ããã°å³ãç®ã«è¨å®ãã¦ãããæ¹ãä½ãã¨ããã¨æãã¾ãã