ラベル MariaDB の投稿を表示しています。 すべての投稿を表示
ラベル MariaDB の投稿を表示しています。 すべての投稿を表示

MariaDB:USER_CONSTRANTS


USER_CONSTRANTS

MariaDBで OracleのUSER_CONSTRAINTSに対応する機能は?

INFORMATION_SCHEMA.KEY_COLUMN_USAGEテーブルを参照する。
KEY_COLUMN_USAGE テーブルは、どのキーカラムに制約があるか?のデータディクショナリ


MariaDB, MySQL, Oracle

Mroonga:DATE列にNULLが登録できない

MroongaのDATE列項目にNULLを登録しようとするが"1970-01-01"になってしまう。


環境

Windows Server 2016 バージョン 1607 (14393.4283)
MariaDB 10.5.8 with Mroonga 11.01 winx64

原因

以下に書いてあった。
https://mroonga.org/ja/docs/reference/limitations.html

5.6.3. カラムの値に関する制限事項
ストレージモードにおいて、カラムの値には制限があります。

MroongaストレージエンジンはNULL値を自動的に補正します。

例えば、 DATE 型や DATETIME 型に指定されたNULL値はMroongaストレージエンジンが日や月の値として0を1へと自動的に補正します。

つまり、0月は1月へ、0日は1日として扱います。

そして、NULL値はUNIX時間の0秒 (1970-01-01)として扱います。

このような自動変換は DATE 型や DATETIME 型に限定されません。

NULL値はカラムのデフォルト値へと変換されます。多くの場合、文字列型であれば空文字列へ、数値型であれば0へと変換されます。

MariaDB #12:時刻が9時間ずれている

OracleからCSV経由でインポートした時刻が9時間ずれていた



環境

Windows Server 2016 1607 14393.1593
MariaDB 10.5 x64

現象

OracleのデータをCSV出力し、MariaDBのLOAD DATAコマンドでロードしたところ
TIMESTAMP型の日時がすべて+9時間されていることに気付いた。
テスト環境ではそんな事なかったんだけど。

原因

system_time_stampとtime_stampを確認してみると・・・
MariaDB [XXX]> select @@system_time_zone; select @@time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| Asia/Tokyo         |
+--------------------+
1 row in set (0.000 sec)

+-------------+
| @@time_zone |
+-------------+
| +00:00      |
+-------------+
1 row in set (0.000 sec)
すると、time_zoneが "+00:00" となっていた。
これが原因と思われる。

対応

exitでMySQLコマンドを終了し、もう一度 mysql -u root -p でログインしてみたところ、
time_zone は "SYSTEM" となった。
よく原因わからないが、これでインポートしても日付がずれなくなった。


MariaDB, MySQL

MariaDB #11:日時から日付のみ取得するには?

日時が入ったTIMESTAMP型の値から日付のみ抽出したい



環境

MariaDB 10.5 x64

方法

"CAST(列名 AS DATE)" を使えば良い。

例えば日時列F1が 2021.03.31 以前のレコードを取得する場合:
SELECT * FROM TESTTABLE
WHERE CAST(F1 AS DATE) <= '2021/03/31'


MariaDB, MySQL

MariaDB #10:データファイルを別ドライブへ変更

データファイルを別ドライブに移動するには?



概要

MariaDBを普通にインストールすると C:\Program Files\MariaDB 10.5\data フォルダにデータが格納される。
しかしデータファイルは今後肥大化する訳なので、できれば別ドライブに移動させておきたい。

環境

Windows Server 2016 1607 14393.1593
MariaDB 10.5 x64

手順

C:\Program Files\MariaDB 10.5\data\my.ini ファイルを編集
datadir= の設定があるので、ここに新しいデータパスを指定すれば良い。
例:
[mysqld]
datadir=d:/db
MariaDBのサービスを停止し、C:\Program Files\MariaDB 10.5\data フォルダの中身(my.iniを除くすべて)をINIで指定したフォルダへ移動

そしてMariaDBのサービスを起動・・・
しかし起動しない。

イベントビューアーを確認すると "mysqld.exe: File 'D:\db\aria_log_control" not found (Errorcode: 13 "Permission denied")"
権限が無いっぽいので、移動先のフォルダ(D:\db)を右クリック - プロパティ - [セキュリティ] で "NETWORK SERVICE" を追加し 古コントロール以外の権限を付与した。

これでサービス起動できた。


MariaDB, MySQL

MariaDB #9:CSVファイルインポートでワーニング

LOAD DATAコマンドでCSVファイルのインポートを行ったがワーニングが発生した

※ 前回記事:


現象

LOAD DATAコマンドでCSVファイルをインポートしたがワーニング(警告)が発生した。
MariaDB [xxx]> LOAD DATA LOCAL INFILE "xxx.csv"
    -> INTO TABLE xxx
    -> FIELDS TERMINATED BY ','
    -> OPTIONALLY ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';
Query OK, 5853 rows affected, 33751 warnings (1.757 sec)
Records: 5853  Deleted: 0  Skipped: 0  Warnings: 33751
CSVのレコード数は5853で、とりあえずは全レコードインポート出来ている模様。
でもWarningsが33751って。
しかもワーニングが何なのかよくわからない・・・

確認方法

ワーニングは "SHOW WARNINGS" というコマンドで内容を確認できる。
表示例:
ariaDB [xxx]> show warnings
    -> ;
+---------+------+--------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                    |
+---------+------+--------------------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column `xxx`.`xxx`.`AAA` at row 1    |
| Warning | 1366 | Incorrect integer value: '' for column `xxx`.`xxx`.`BBB` at row 1     |
| Warning | 1366 | Incorrect integer value: '' for column `xxx`.`xxx`.`CCC` at row 1 |
| Warning | 1265 | Data truncated for column 'DDD' at row 1    

対処方法

今回のワーニングは CSVの "" が問題なようである。
とりあえず "" を NULL へ文字列置換することで警告は無くなった。

MariaDB #8:CSVファイルのインポート

MariaDBでCSVファイルをテーブルにインポートするには?

※ 前回記事:#7:スクリプトファイルの実行


方法

"LOAD DATA" コマンドを使う。
書式:
LOAD DATA INFILE "CSVファイル名"
INTO TABLE テーブル名
FIELDS TERMINATED BY '列区切文字'
OPTIONALLY ENCLOSED BY 'フィールド引用符文字'
LINES TERMINATED BY '行区切り文字'
;

一般的と思われるCSV(Windows)では 列区切りが ","、フィールド引用符が "、行区切りがCRLFと思うので、
LOAD DATA LOCAL INFILE "TEST.csv"
INTO TABLE TEST
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
といった感じ。

MariaDB #7:スクリプトファイルの実行

MariaDBでスクリプトファイルを読み込み実行するには?

※ 前回記事:#6:データベース権限


方法

"source"コマンドを使えば良い。
例) source d:\setup\script.txt


MariaDB, MySQL

MariaDB #6:データベース権限

データベースとユーザーを作成したのでユーザーでログインしテーブルを作成したいが…

※ 前回記事:#5:ユーザー作成

権限

"benkyo"データベースを作成し(#2:データベース作成)、"testuser"ユーザーも作成した(#5:ユーザー作成)。
が、権限が無いためtestuserからbenkyoデータベースへアクセスできない。

testuserでログインし "SHOW DATABASES" コマンドを実行しても benkyo データベースは表示されない。
C:\Windows\system32>mysql -u testuser -p
Enter password: ********
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 23
Server version: 10.5.9-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.000 sec)
ということでtestuserにbenkyoデータベースの全権限を与えることにする。
コマンドプロンプトからrootユーザーでログインし、以下コマンドを実行する。
"GRANT ALL ON benkyo.* TO testuser@'localhost';" 実行結果:
MariaDB [(none)]> GRANT ALL ON benkyo.* TO testuser@'localhost';
Query OK, 0 rows affected (0.740 sec)
これで権限が付与された筈なので testuserでログインし SHOW DATABASES を実行してみる。
C:\Windows\system32>mysql -u testuser -p
Enter password: ********
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 30
Server version: 10.5.9-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| benkyo             |
| information_schema |
| test               |
+--------------------+
3 rows in set (0.000 sec)
benkyoが表示された。
"use benkyo" で benkyoデータベースに切り替えテーブルを作成してみる。
MariaDB [(none)]> use benkyo
Database changed
MariaDB [benkyo]> create table testtable (id int, name varchar(10));
Query OK, 0 rows affected (1.210 sec)
作成できた。
SHOW TABLESで確認してみる。
MariaDB [benkyo]> show tables;
+------------------+
| Tables_in_benkyo |
+------------------+
| testtable        |
+------------------+
1 row in set (0.001 sec)
問題なし。


MariaDB, MySQL

MariaDB #5:ユーザー作成

MariaDBにユーザーを作成してみる

※ 前回記事:


環境

Windows Server 2016 Standard Evaluation 1607 (14393.2248)
MariaDB 10.5

コマンド

ユーザーを作成するには "CREATE USER ユーザー名;" コマンドを使う。
普通はパスワードも同時に指定すると思うので、その際は "IDENTIFIED BY 'パスワード" で指定する。

■ ユーザー名
ユーザー名は "ユーザー名@ホスト名" の組み合わせで指定する。
ユーザ名・ホスト名に"@"などの文字が含まれなければ引用符で囲む必要は無いが、
含む場合は、逆引用符(`)、シングルクォーテーション(')、ダブルクォーテーション(") の何れかで囲む。
また、ユーザー名とホスト名は別々に囲むこと。

■ ホスト名
ホスト名はIPアドレスや"localhost"、ワイルドカード"_"、"%"が指定できる。
"_"は任意の1文字、"%"は任意の長さの文字列と一致する。
ホスト名を省略した場合はすべてのホストから接続可となる。( = "'ユーザー名'@'%'"と同じ意味)

作成してみる

実際にユーザーを作成してみる。

1. MariaDB Client起動
Windowsスタートメニュー - "MariaDB 10.5 (x64)"
- "MySQL Client (MariaDB 10.5 (x64))" を起動
MariaDBセットアップ時に入力したパスワードでログインする。

2. ユーザー作成
ユーザー名:testuser
パスワード:testpass
ホスト名:192.168.2.1 と 192.168.2.2(localhost)
※ 192.168.2.1はWEBサーバーで後で使う予定
以下のコマンドを張り付け実行する。
CREATE USER 'testuser'@'192.168.2.1'
IDENTIFIED BY 'testpass';
CREATE USER 'testuser'@'localhost'
IDENTIFIED BY 'testpass';
実行結果は以下の通り
MariaDB [(none)]> CREATE USER 'testuser'@'192.168.2.1'
    -> IDENTIFIED BY 'testuser';
Query OK, 0 rows affected (0.029 sec)

MariaDB [(none)]> CREATE USER 'testuser'@'192.168.2.2'
    -> IDENTIFIED BY 'testuser';
Query OK, 0 rows affected (0.027 sec)

3. 動作確認
Windowsスタートメニュー - "MariaDB 10.5 (x64)"
- "Command Prompt (MariaDB 10.5 (x64))" を起動

以下のコマンドで作成したユーザーで接続してみる。
mysql -u testuser -p MariaDBセットアップ時に入力したパスワードでログインする。
C:\Windows\system32>mysql -u testuser -p
Enter password: ********
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.5.9-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
ログインできた。


MariaDB, MySQL

PHP:MariaDBを使う

div class="box"> PHPからMariaDBを使ってみる


環境


PHP.ini設定

"";extension=pdo_mysql" の行を探し、先頭の ";" を外せば良い。
PHP.iniを修正したら Apacheを再起動する。

動作確認

phpinfoのページを作成する。

MariaDB #4:照合順序

MariaDBでデータベースを作成する際に照合順序という用語が出てくる。 照合順序とは?

※ 前回記事:#3:文字セット


照合順序とは

簡単に言えば、ソートや結合する際のルールをどうするか?ということらしい。
ルールとは、"大文字・小文字を区別するか?" や "半角・全角を区別するか?" など

照合順序の一覧

照合順序の一覧は "SHOW COLLATION;" で確認できるが、
照合順序は文字セット単位に存在し結構な数があるので、文字セットで絞り込んだ方が良い。
例えば utf8mb4 の文字セットを使う場合は "SHOW COLLATION WHERE CHARSET='utf8mb4';" とすれば良い。
MariaDB [(none)]> SHOW COLLATION WHERE CHARSET='utf8mb4';
+------------------------------+---------+------+---------+----------+---------+
| Collation                    | Charset | Id   | Default | Compiled | Sortlen |
+------------------------------+---------+------+---------+----------+---------+
| utf8mb4_general_ci           | utf8mb4 |   45 | Yes     | Yes      |       1 |
| utf8mb4_bin                  | utf8mb4 |   46 |         | Yes      |       1 |
| utf8mb4_unicode_ci           | utf8mb4 |  224 |         | Yes      |       8 |
| utf8mb4_icelandic_ci         | utf8mb4 |  225 |         | Yes      |       8 |
| utf8mb4_latvian_ci           | utf8mb4 |  226 |         | Yes      |       8 |
| utf8mb4_romanian_ci          | utf8mb4 |  227 |         | Yes      |       8 |
| utf8mb4_slovenian_ci         | utf8mb4 |  228 |         | Yes      |       8 |
| utf8mb4_polish_ci            | utf8mb4 |  229 |         | Yes      |       8 |
| utf8mb4_estonian_ci          | utf8mb4 |  230 |         | Yes      |       8 |
| utf8mb4_spanish_ci           | utf8mb4 |  231 |         | Yes      |       8 |
| utf8mb4_swedish_ci           | utf8mb4 |  232 |         | Yes      |       8 |
| utf8mb4_turkish_ci           | utf8mb4 |  233 |         | Yes      |       8 |
| utf8mb4_czech_ci             | utf8mb4 |  234 |         | Yes      |       8 |
| utf8mb4_danish_ci            | utf8mb4 |  235 |         | Yes      |       8 |
| utf8mb4_lithuanian_ci        | utf8mb4 |  236 |         | Yes      |       8 |
| utf8mb4_slovak_ci            | utf8mb4 |  237 |         | Yes      |       8 |
| utf8mb4_spanish2_ci          | utf8mb4 |  238 |         | Yes      |       8 |
| utf8mb4_roman_ci             | utf8mb4 |  239 |         | Yes      |       8 |
| utf8mb4_persian_ci           | utf8mb4 |  240 |         | Yes      |       8 |
| utf8mb4_esperanto_ci         | utf8mb4 |  241 |         | Yes      |       8 |
| utf8mb4_hungarian_ci         | utf8mb4 |  242 |         | Yes      |       8 |
| utf8mb4_sinhala_ci           | utf8mb4 |  243 |         | Yes      |       8 |
| utf8mb4_german2_ci           | utf8mb4 |  244 |         | Yes      |       8 |
| utf8mb4_croatian_mysql561_ci | utf8mb4 |  245 |         | Yes      |       8 |
| utf8mb4_unicode_520_ci       | utf8mb4 |  246 |         | Yes      |       8 |
| utf8mb4_vietnamese_ci        | utf8mb4 |  247 |         | Yes      |       8 |
| utf8mb4_croatian_ci          | utf8mb4 |  608 |         | Yes      |       8 |
| utf8mb4_myanmar_ci           | utf8mb4 |  609 |         | Yes      |       8 |
| utf8mb4_thai_520_w2          | utf8mb4 |  610 |         | Yes      |       4 |
| utf8mb4_general_nopad_ci     | utf8mb4 | 1069 |         | Yes      |       1 |
| utf8mb4_nopad_bin            | utf8mb4 | 1070 |         | Yes      |       1 |
| utf8mb4_unicode_nopad_ci     | utf8mb4 | 1248 |         | Yes      |       8 |
| utf8mb4_unicode_520_nopad_ci | utf8mb4 | 1270 |         | Yes      |       8 |
+------------------------------+---------+------+---------+----------+---------+
33 rows in set (0.001 sec)
照合順序は、文字セット名に続き"言語名"が入るが、日本語の照合順序は存在しないので、
"general"、"bin"、"unicode" のいづれかを使うことになる。
・utf8mb4_general_ci
・utf8mb4_bin
・utf8mb4_unicode_ci
・utf8mb4_unicode_520_ci
・utf8mb4_general_nopad_ci
・utf8mb4_nopad_bin
・utf8mb4_unicode_nopad_ci
・utf8mb4_unicode_520_nopad_ci

"bin" - 英字大小文字を区別したい場合は "bin" を選択する。
bin(バイナリ比較)は英字以外のすべての文字においても厳密に区別する。
あいまい検索を行いたい、といった特別な理由が無ければ、これで良いのでは?と思う。

"general" と "unicode" - 日本語の濁音・半濁音を区別する場合は"general"を使う。
また、ひらがなカタカナ、数字と丸数字 といった文字も "unicode" では同一とみなされる。
日本語あいまい検索を行う以外は "general" で良いと思う。

"ci" - 大小文字を区別しない
"bin"以外にはすべて "ci" が付いているので大小文字は区別しない.
大小文字を区別する場合は "cs" が付く。

"520" - 詳細不明
520とはUnicode照合アルゴリズム(Unicode collation algorithm = UCA)のバージョンを意味するようだ。
"520"では絵文字を区別するが、"520"を付けない場合は区別しない、と思われる。

"nopad" - 詳細不明
末尾スペースを区別するか?を表すようだ。
MariaDB(MySQL)では、末尾スペースは区別しないのが既定らしい。
なのでそれらも区別したい場合は "nopad" を使う。
※ OracleではVARCHAR2の列だと末尾スペースは区別しなかったような??
CHAR列だと区別するので、まぁそれに近い考えなのかな?


MariaDB, MySQL

MariaDB #3:文字セット

MariaDBで使用可能な文字セットについて

※ 前回記事:#2:データベース作成


使用可能な文字セット

MariaDBで使用可能な文字セットは以下コマンドで確認できる。
"SHOW CHARACTER SET;"
MariaDB [(none)]> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.000 sec)
文字セットはUnicodeを使った方が良いだろう。
とすると utf16 か utf8 ということになるが、
UTF8を使う場合に選択できる文字セットは "utf8" と "utf8mb4" の2種類存在する。
"utf8"では4バイト文字が扱えないらしいので "utf8mb4" を選んだほうが良い。

現在設定されている文字セット

以下コマンドで確認できる。
"SHOW VARIABLES LIKE 'char%";
MariaDB [(none)]> SHOW VARIABLES LIKE 'char%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | cp932                                         |
| character_set_connection | cp932                                         |
| character_set_database   | latin1                                        |
| character_set_filesystem | binary                                        |
| character_set_results    | cp932                                         |
| character_set_server     | latin1                                        |
| character_set_system     | utf8                                          |
| character_sets_dir       | C:\Program Files\MariaDB 10.5\share\charsets\ |
+--------------------------+-----------------------------------------------+
8 rows in set (0.001 sec)


MariaDB, MySQL

MariaDB #2:データベース作成

MariaDBにデータベースを作成してみる

※ 前回記事:#1:インストール


環境

Windows Server 2016 Standard Evaluation 1607 (14393.2248)
MariaDB 10.5

コマンド

データベースを作成するには "CREATE DATABASE データベース名;" コマンドを使う。

作成する際 "文字セット(CJARACTER SET)" と "照合順序(COLLATE)" を指定することができるので、
余計なトラブルを避けるためにもこれらのパラメータは指定した方が良いだろう。
この場合のコマンドは以下のようになる。
CREATE DATABASE データベース名
CHARACTER SET = '文字セット'
COLLATE = '照合順序'; 
コマンドは大小文字どちらでも良いと思うが、MariaDBのヘルプではコマンドは大文字で、
データベース名といったパラメータは小文字で統一しているようだ。

データベースの一覧は "SHOW DATABASES;" コマンドで確認する。

文字セットと照合順序

以下を参照:
#3:文字セット
#4:照合順序

作成してみる

実際にデータベースを作成してみる。

1. MariaDB Client起動
Windowsスタートメニュー - "MariaDB 10.5 (x64)"
- "MySQL Client (MariaDB 10.5 (x64))" を起動
MariaDBセットアップ時に入力したパスワードでログインする。

2. データベース作成
データベース名:bekyo
文字セット:utf8mb4
照合順序:utf8mb4_bin

以下のコマンドを張り付け実行する。
CREATE DATABASE benkyo
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_bin';
作成できたか SHOW DATABASES で確認する。
実行結果は以下の通り。
MariaDB [(none)]> CREATE DATABASE benkyo
    -> CHARACTER SET = 'utf8mb4'
    -> COLLATE = 'utf8mb4_bin';
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| benkyo             |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.001 sec)


MariaDB, MySQL

MariaDB #1:インストール

WindowsにMariaDBをインストールしてみる


1) ダウンロード
https://mariadb.org/
上記サイトの上部[Download]リンクをクリック
・MariaDB Server Version - "MariaDB Server 10.5.9" を選択 (現時点での最新版)
・Operating System - "Windows" を選択
・Architecture - "x86-64" を選択
・Package Type - "MSI Package" を選択
上記を選択したら [Download] をクリック

2) インストール
ダウンロードした "mariadb-10.5.9-winx64.msi" をダブルクリックし実行
セットアップウィザードは既定値のまま先に進める
途中 User settings で "Modify password for database user 'root'" の入力となるので
適当なパスワードを入力

"Enable access from remote machines for 'root' user"
のチェックはrootユーザーをリモートマシンからアクセス可能とするか?であるが
セキュリティを気にするならチェックを付けない方が良い

"Use UTF8 as default server's character set" は、キャラクタセットを気にしないのであればチェックを付けて良いのでは。

以降は既定値で進める。

3) 動作確認
Windowsスタートメニューより "MariaDB 10.5 (x64)"
- "MySQL Client (MariaDB 10.5 (x64)" を起動
"Enter password: " の入力となるので、セットアップ時に入力したrootパスワードを指定
ログインできればOK


MariaDB, MySQL

■ Docker学習 #23:MariaDB連携 (4)

前回からの続き…
Docker #22 MariaDB連携

環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24

PhpMyAdminインストール


解決できていない問題もあるが、とりあえずPHPからMariaDBへの接続は出来たと思われる。 引き続き Dockerであそぶ(7)PhpMyAdminのインストール | TECH Projin を参考に学習していく。

1) PhpMyAdminコンテナ作成
docker run --name my-phpmyadmin1 -d --link my-mariadb1:db -p 8080:80 phpmyadmin/phpmyadmin
これだけで完了である。
ブラウザで http://192.168.99.102:8080 を表示

→ phpMyAdminのページが表示された → 成功
ユーザー・パスワードを "docker" でログイン → 成功

珍しく順調に進んだ。

続く・・・


Docker学習

■ Docker学習 #22:MariaDB連携 (3)

前回からの続き…
Docker #21 Mariadb連携



環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


環境変数を使わなければ接続できるのか?


前回、mysql_connect が使えなかったので mysqli へ変更した。
しかし 接続情報を環境変数(MY_MARIADB_~)から取得できずエラーとなっていた。
環境変数を使わなければ接続できるのかやってみる。

1) Apacheコンテナのbashに接続
docker exec -it my-php1 /bin/bash

2) 環境変数値を確認
[root@7ae0096c85d7 /]# env | grep MY_MARIADB1
MY_MARIADB1_ENV_MARIADB_MAJOR=10.5
MY_MARIADB1_ENV_GOSU_VERSION=1.12
MY_MARIADB1_ENV_MARIADB_VERSION=1:10.5.4+maria~focal
MY_MARIADB1_PORT_3306_TCP=tcp://172.17.0.2:3306
MY_MARIADB1_PORT_3306_TCP_PORT=3306
MY_MARIADB1_ENV_MYSQL_PASSWORD=docker
MY_MARIADB1_PORT_3306_TCP_ADDR=172.17.0.2
MY_MARIADB1_NAME=/my-php1/my-mariadb1
MY_MARIADB1_ENV_MYSQL_DATABASE=docker
MY_MARIADB1_ENV_MYSQL_USER=docker
MY_MARIADB1_PORT=tcp://172.17.0.2:3306
MY_MARIADB1_ENV_GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8
MY_MARIADB1_ENV_MYSQL_ROOT_PASSWORD=root
MY_MARIADB1_PORT_3306_TCP_PROTO=tcp

3) db.php修正
<?php
error_reporting(-1);
ini_set("display_errors", 1);

// Mariadbへの接続
$link = new mysqli("172.17.0.2", "docker", "docker", "docker");

4) ブラウザで http://192.168.99.102/db.php を表示
→ 何も表示されない。 → 成功?

続く・・・


Docker学習

■ Docker学習 #21:Mariadb連携 (2)

前回からの続き…
Docker #20 Mariadb連携


環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


エラー原因調査


エラー分からないため、PHPファイルを修正しエラーを表示させてみる。
前回のdb.phpの先頭に以下2行を追加。
error_reporting(-1);
ini_set("display_errors", 1);

→ 以下エラーが表示された。
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/db.php:12 Stack trace: #0 {main} thrown in /var/www/html/db.php on line 12
https://www.php.net/manual/ja/function.mysql-connect.php
「この拡張モジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。」とのこと。
この関数の代替は、
・mysqli_connect()
・PDO::__construct()

とりあえず mysqli を使う方向として、PHPのページを参考にdb.phpを以下のように修正。
<?php
error_reporting(-1);
ini_set("display_errors", 1);

// 環境変数の取得
$host = getenv("MY_MARIADB1_PORT_3306_TCP_ADDR");
$db   = getenv("MY_MARIADB1_ENV_MYSQL_DATABASE");
$user = getenv("MY_MARIADB1_ENV_MYSQL_USER");
$pass = getenv("MY_MARIADB1_ENV_MYSQL_PASSWORD");
    
// Mariadbへの接続
$link = new mysqli($host, $user, $pass, $db);

ブラウザで http://192.168.99.102/db.php を表示
→ エラー発生
Warning: mysqli::__construct(): (HY000/2002): No such file or directory in /var/www/html/db.php on line 12

db.phpで取得している環境変数の値を確認してみる。
db.phpに以下行を追加し ブラウザで http://192.168.99.102/db.php を表示
var_dump($host, $db, $user, $pass);
→ getenv関数で環境変数が取得できていない?
bool(false) bool(false) bool(false) bool(false)
https://www.php.net/manual/ja/function.getenv.php によると、指定した環境変数名が存在しない場合は false を返す、とのこと。
$host, $db, $user, $pass すべて値は false だった。

getenv関数は引数を省略すると、すべての環境変数を取得できる。(PHP 7.1.0以降)
https://www.php.net/manual/ja/function.getenv.php
なので、db.phpを修正、先ほど追記した var_dumpの行を削除し、新たに2行追加
$var = getenv();
var_dump($var);
→ 取得できた環境変数は USER と HOME の2つだけだった。
array(2) { ["USER"]=> string(6) "apache" ["HOME"]=> string(16) "/usr/share/httpd" }

よくわからん…

続く・・・


Docker学習

■ Docker学習 #20:Mariadb連携

前回からの続き…
Docker #19:CentOS+Apache+PHP環境 (5)



以下サイトを参考にMariaDBとの連携をやってみる。
Dockerであそぶ(6)Apache-PHP-Mariadb連携 | TECH Projin

1) MariaDBコンテナ作成
docker pull mariadb:latest
docker run -it -d --rm -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
-e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
--name my-mariadb1 mariadb:latest
"docker ps -a" で確認してみる
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1ac004331c53        mariadb:latest      "docker-entrypoint.s…"   14 seconds ago      Up 13 seconds       0.0.0.0:3306->3306/tcp   my-mariadb1
動作していると思われる

確認取れたのでコンテナ終了
docker stop my-mariadb1"

2) Dockerfile修正
これまで作成していたDockerfileにphp-mysqlをインストールするよう1行追加
FROM centos:latest
RUN dnf -y update && \
    dnf -y install httpd php
RUN dnf -y install php-mysql
EXPOSE 80
RUN ["mkdir", "-p", "/run/php-fpm"]
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]
※ 4行目を追加

3) コンテナイメージビルド
cd C:/Users/user/php
docker build -t my-php .
→ エラーが発生
$ docker build -t my-php .
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM centos:latest
    ---> 831691599b88
Step 2/8 : RUN dnf -y update &&     dnf -y install httpd php
    ---> Using cache
    ---> f4ef9934dcf3
Step 3/8 : RUN dnf -y install php-mysql
    ---> Running in 9e9287ce8ab0
Last metadata expiration check: 1 day, 2:00:54 ago on Tue Jul 28 19:40:19 2020.
No match for argument: php-mysql
Error: Unable to find a match: php-mysql
The command '/bin/sh -c dnf -y install php-mysql' returned a non-zero code: 1

4) 原因調査
centos8コンテナを起動しbashに接続
docker run -it centos:latest bash

php-mysqlをインストールしてみる
dnf -y install php-mysql
やはりエラーとなる

別のパッケージで php-mysqlnd といのがあるっぽい
末尾の "nd" は "native driver" のことらしい
これをインストールしてみる
dnf -y install php-mysqlnd
これは正常にインストールできた。

といことで php-mysqlnd を使うようにDockerfileを修正
CentOSのbashは exit で終了しておく

5) Dockerfile修正
FROM centos:latest
RUN dnf -y update && \
    dnf -y install httpd php
RUN dnf -y install php-mysqlnd
EXPOSE 80
RUN ["mkdir", "-p", "/run/php-fpm"]
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]

6) コンテナイメージビルド
docker build -t my-php .
→ 成功

7) PHPコンテナ起動
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--name my-php1 --link my-mariadb1 my-php
→ エラー
$ docker run -it -d -p 80:80 \
> -v //c/Users/user/php/public-html/:/var/www/html/ \
> --name my-php1 --link my-mariadb my-php
D:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: could not get container for my-mariadb: No such container: my-mariadb.
See 'D:\Program Files\Docker Toolbox\docker.exe run --help'.
→ MariaDBコンテナが起動していないとダメか?

ということでMariaDBコンテナを起動
docker run -it -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
-e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
--name my-mariadb1 mariadb:latest
再度PHPコンテナ起動
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--name my-php1 --link my-mariadb1 my-php

8) テストページ作成
https://tech.pjin.jp/blog/2016/01/04/dockerであそぶ(6)apache-php-mysql連携/ のdb.phpを C:\Users\user\php\public-html\db.php へ保存
エンコードは UTF-8 とした。

ブラウザで http://192.168.99.102/db.php を表示

→ エラーとなる
このページは動作していません
192.168.99.102 では現在このリクエストを処理できません。
HTTP ERROR 500

続く・・・


Docker学習

その他の記事