[20] 色々な[[プログラミング言語]]の[[ライブラリー]]などでは、
接続先の[[データベース]]やオプションを指定するために、 [[URL]]
が用いられています。

* 意味

[21] 
そもそも [[URL]] の多くは、何らかの意味の[[データベース]]に接続して情報を得たり、
書き込んだりするものです。例えば [CODE(URI)@en[https:]] [[URL]]
は [[HTTPS]] [[プロトコル]]を介して[[ハイパーテキスト]]データベースにアクセスすることを表しています。

[22] 本項でいう「データベース」は、それよりも限定されたもので、
[[プログラム]]が情報の保持に用いる[[関係データベース]]やいわゆる [[NoSQL]]
[[データベース]]などです。

[5] 本項に該当する [[URL]] の多くは、接続先の[[データベース]]を表しています。
すなわち、[[データベース]]へ接続するために必要な[[プロトコル]]、
[[ホスト]]、[[データベース]]名、接続オプションなどを [[URL]]
に含めています。

[7] [[データベース]]内のデータにまで[[アドレス付け]]している [[URL scheme]]
は今のところなさそうです。

* URL scheme

[4] [[データベース]]の種類 (接続[[プロトコル]]の種類) ごとに、
色々な [[URL scheme]] が使われています。

[FIG(short list)[ [2] [[データベース]]を表す [[URL scheme]]
- [CODE(URI)@en[[[db:]]]]
- [CODE(URI)@en[dbase:]]
- [CODE(URI)@en[fbsql:]]
- [CODE(URI)@en[[[jdbc:]]]]
- [CODE(URI)@en[[[mysql:]]]]
- [CODE(URI)@en[mysql+zxjdbc:]]
- [CODE(URI)@en[mysql+mysqlconnector:]]
- [CODE(URI)@en[mysql+cymysql:]]
- [CODE(URI)@en[mysql+pymysql:]]
- [CODE(URI)@en[mysql+gaerdbms:]]
- [CODE(URI)@en[mysql+pyodbc:]]
- [CODE(URI)@en[mysql+mysqldb:]]
- [CODE(URI)@en[mysql2:]]
- [CODE(URI)@en[mysqli:]]
- [CODE(URI)@en[mysqlgis:]]
- [CODE(URI)@en[msql:]]
- [CODE(URI)@en[mssql:]]
- [CODE(URI)@en[ibase:]]
- [CODE(URI)@en[ifx:]]
- [CODE(URI)@en[oci8:]]
- [CODE(URI)@en[odbc:]]
- [CODE(URI)@en[odbc(access):]]
- [CODE(URI)@en[[[oracle:]]]]
- [CODE(URI)@en[[[redis:]]]]
- [CODE(URI)@en[[[rediss:]]]]
- [CODE(URI)@en[sqlite:]]
- [CODE(URI)@en[sqlite3:]]
- [CODE(URI)@en[pgsql:]]
- [CODE(URI)@en[postgres:]]
- [CODE(URI)@en[postgresql]]
- [CODE(URI)@en[sybase:]]

]FIG]

* 標準化

[6] あらゆる点でほとんど[[実装依存]]であり、[[標準化]]の動きもありません。
みな似たような構文と意味に収まっていますが、細かい点に色々と違いがありそうです。

* 環境変数 [CODE[DATABASE_URL]]

[14] [[Ruby on Rails]] は[[設定ファイル]]内で接続先の[[データベース]]を [[URL]]
で指定できるとしています。加えて、[[環境変数]] [DFN[[CODE[DATABASE_URL]]]]
によって指定する方法も提供しています。

* 歴史

[8] [[ODBC]] や [[Perlモジュール]]の [[DBI]] は、接続先の[[データベース]]の種類 
([[プロトコル]]) によらず (ほぼ) 共通化された構文の[[接続文字列][ODBC DSN]]や 
[[DSN][DBI DSN]] を採用していました。
これが単一の[[文字列]]によって接続先[[データベース]]の記述を統合的に扱おうとした事例のはしりなのでしょうが、
[[接続文字列]]は構文的に [[URL]] とまったく異なっていましたし、
[[DSN][DBI DSN]] も [[URL]] とは見なされていませんでした。

* メモ

[9] [[データベース]]へ接続するためには[[ホスト]]、[[プロトコル]]、
[[データベース名]]など色々なオプションを指定しなければなりません。
[[データベース]]を扱う[[アプリケーション]]の起動時や設定ファイルでこれを一々指定するのも中々大変ですし、
複数の[[データベース]]に接続する巨大な[[アプリケーション]]では[[データベース]]管理だけで一苦労です。
その点、 [[URL]] のようにこうした指定を1つの[[文字列]]にまとめられると、
[[データベース]]ごとに1[[文字列]]を指定できるようにすれば良いだけなので、
[[開発者]]も[[運用]]担当者も楽になります。

[1] [CITE@en[Engine Configuration — SQLAlchemy 0.9 Documentation]]
([TIME[2015-07-06 00:17:46 +09:00]] 版)
<http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#database-urls>

[FIG(quote)[
[FIGCAPTION[
[3] [CITE[Data Services — Stackato 3.0.1 documentation]]
([TIME[2015-07-03 07:24:32 +09:00]] 版)
<http://docs.stackato.com/3.0/user/services/data-services.html#database-url>
]FIGCAPTION]

> It contains the connection string for the bound database in the following format:
> protocol://username:password@host:port/database_name

]FIG]


[FIG(quote)[
[FIGCAPTION[
[10] [CITE@en[Welcome to Django-environ’s documentation! — Django-environ 0.4.0 documentation]]
([TIME[2015-09-24 01:20:50 +09:00]])
<https://django-environ.readthedocs.io/en/latest/>
]FIGCAPTION]

> db_url
> PostgreSQL: postgres://, pgsql://, psql:// or postgresql://
> PostGIS: postgis://
> MySQL: mysql:// or mysql2://
> MySQL for GeoDjango: mysqlgis://
> SQLITE: sqlite://
> SQLITE with SPATIALITE for GeoDjango: spatialite://
> LDAP: ldap://
> cache_url
> Database: dbcache://
> Dummy: dummycache://
> File: filecache://
> Memory: locmemcache://
> Memcached: memcache://
> Python memory: pymemcache://
> Redis: rediscache://
> search_url
> ElasticSearch: elasticsearch://
> Solr: solr://
> Whoosh: whoosh://
> Xapian: xapian://
> Simple cache: simple://
> email_url
> SMTP: smtp://
> SMTP+SSL: smtp+ssl://
> SMTP+TLS: smtp+tls://
> Console mail: consolemail://
> File mail: filemail://
> LocMem mail: memorymail://
> Dummy mail: dummymail://

]FIG]


[11] [CITE@en[seamusabshere/database_url: Convert back and forth between Heroku-style ENV'''[''''DATABASE_URL'''']''' and Rails/ActiveRecord-style config/database.yml hashes.]]
([TIME[2016-11-17 22:59:11 +09:00]])
<https://github.com/seamusabshere/database_url>

[FIG(quote)[
[FIGCAPTION[
[12] [CITE@en[Riding Rails: Rails 4.1.0: Spring, Variants, Enums, Mailer previews, secrets.yml]]
([TIME[2016-11-15 19:24:16 +09:00]])
<http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/>
]FIGCAPTION]

> Second is that we’ve added support for database URLs in database.yml, and that we by default will be referring to ENV-backed URLs in the generated files.

]FIG]


[13] [CITE@en-us[John Griffin: Rails 4.1: Database URLs]]
([[John Griffin]]著, [TIME[2015-02-16 04:36:58 +09:00]])
<http://www.johng.co.uk/2014/04/29/rails-41-database-urls/>

[FIG(quote)[
[FIGCAPTION[
[15] [CITE@en[Environment Variables - GitLab Documentation]]
([TIME[2016-11-17 23:03:20 +09:00]])
<https://docs.gitlab.com/ce/administration/environment_variables.html>
]FIGCAPTION]

> DATABASE_URL	string	The database URL; is of the form: postgresql://localhost/blog_development

]FIG]


[FIG(quote)[
[FIGCAPTION[
[16] [CITE@en[Environment Variables - GitLab Documentation]]
([TIME[2016-11-17 23:03:20 +09:00]])
<https://docs.gitlab.com/ce/administration/environment_variables.html>
]FIGCAPTION]

> The recommended way of specifying your database connection information is to set the DATABASE_URL environment variable. This variable only holds connection information (adapter, database, username, password, host and port), but not behavior information (encoding, pool). If you don't want to use DATABASE_URL and/or want to set database behavior information, you will have to either:
> copy our template file: cp config/database.yml.env config/database.yml, or
> set a value for some GITLAB_DATABASE_XXX variables

]FIG]


[FIG(quote)[
[FIGCAPTION[
[17] [CITE[Manual :: The Data Source Name]]
([TIME[2016-11-17 23:50:11 +09:00]])
<http://pear.php.net/manual/en/package.database.db.intro-dsn.php>
]FIGCAPTION]

> To connect to a database through PEAR::DB, you have to create a valid DSN - data source name. This DSN consists in the following parts:
> phptype: Database backend used in PHP (i.e. mysql , odbc etc.)
> dbsyntax: Database used with regards to SQL syntax etc. When using ODBC as the phptype, set this to the DBMS type the ODBC driver is connecting to. Examples: access, db2, mssql, navision, solid, etc.
> protocol: Communication protocol to use ( i.e. tcp, unix etc.)
> hostspec: Host specification (hostname'''[''':port''']''')
> database: Database to use on the DBMS server
> username: User name for login
> password: Password for login
> proto_opts: Maybe used with protocol
> option: Additional connection options in URI query string format. options get separated by &
> The format of the supplied DSN is in its fullest form:
> phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value
> Most variations are allowed:
> phptype://username:password@protocol+hostspec:110//usr/db_file.db
> phptype://username:password@hostspec/database
> phptype://username:password@hostspec
> phptype://username@hostspec
> phptype://hostspec/database
> phptype://hostspec
> phptype:///database
> phptype:///database?option=value&anotheroption=anothervalue
> phptype(dbsyntax)
> phptype
> The currently supported database backends are:
> dbase  -> dBase
> fbsql  -> FrontBase (functional since DB 1.7.0)
> ibase  -> InterBase (functional since DB 1.7.0)
> ifx    -> Informix
> msql   -> Mini SQL (functional since DB 1.7.0)
> mssql  -> Microsoft SQL Server (NOT for Sybase. Compile PHP --with-mssql)
> mysql  -> MySQL (for MySQL <= 4.0)
> mysqli -> MySQL (for MySQL >= 4.1) (requires PHP 5) (since DB 1.6.3)
> oci8   -> Oracle 7/8/9
> odbc   -> ODBC (Open Database Connectivity)
> pgsql  -> PostgreSQL
> sqlite -> SQLite
> sybase -> Sybase
> With an up-to-date version of DB, you can use a second DSN format
> phptype(syntax)://user:pass@protocol(proto_opts)/database

]FIG]


[FIG(quote)[
[FIGCAPTION[
[18] [CITE@en[go-sql-driver/mysql: Go MySQL Driver is a lightweight and fast MySQL driver for Go's (golang) database/sql package]]
([TIME[2016-11-17 23:58:36 +09:00]])
<https://github.com/go-sql-driver/mysql>
]FIGCAPTION]

> The Data Source Name has a common format, like e.g. PEAR DB uses it, but without type-prefix (optional parts marked by squared brackets):
> '''['''username'''[''':password''']'''@''']''''''['''protocol'''['''(address)''']'''''']'''/dbname'''['''?param1=value1&...&paramN=valueN''']'''
> A DSN in its fullest form:
> username:password@protocol(address)/dbname?param=value

]FIG]


[FIG(quote)[
[FIGCAPTION[
[19] [CITE[The DB-URI — TurboGears 1.0 documentation]]
([TIME[2013-01-12 16:52:59 +09:00]])
<http://turbogears.org/1.0/docs/DbUri.html>
]FIGCAPTION]

> postgres://username@hostname/databasename
> mysql://username:password@hostname:port/databasename
> sqlite://path/to/file
> postgres:///var/run/postgresql/test?debug=1
> mysql://localhost/database?unix_socket=/var/lib/mysql/socket

]FIG]
