xyk blog

最近は iOS 開発の記事が多めです。

RDS(MySQL)の文字コードとタイムゾーンの設定

環境:
Mac
aws-cli 1.7.0
jq 1.4
RDS MySQL(5.6.22)

RDS MySQL文字コードタイムゾーンの設定を行ったのでその手順メモ。
操作はすべて aws-cliコマンドラインで行う。

1. 文字コードの設定

RDS MySQL文字コードおよび照合順序はデフォルトの状態でインスタンスを立ち上げると以下のようになる。

mysql> show global variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.01 sec)

mysql> show global variables like 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

登録するデータとして絵文字が含まれるので utf8mb4 を使えるように設定を行う。

DB パラメーターグループ作成

RDS の設定値を変更するにはDB パラメーターグループを通して行う。
まずは、mysql5.6 用の DB パラメーターグループの雛形を元にして新規の DB パラメーターグループをrds create-db-parameter-groupコマンドで作成する。

  • db-parameter-group-name はmydbparamgroupとする。
$ aws rds create-db-parameter-group --db-parameter-group-name mydbparamgroup --db-parameter-group-family mysql5.6 --description "for myinstance"

{
    "DBParameterGroup": {
        "DBParameterGroupName": "mydbparamgroup",
        "DBParameterGroupFamily": "mysql5.6",
        "Description": "for myinstance"
    }
}

DB パラメーターグループ更新

続いて作成した DB パラメーターグループのキャラクタセット関連のパラメータの初期値をrds describe-db-parametersコマンドで確認する。
ParameterValue はすべて未設定となっている。

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
 | jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { Description,DataType,Source,IsModifiable,ParameterName,ParameterValue,ApplyType }'

{
  "Description": "Don't ignore character set information sent by the client.",
  "DataType": "boolean",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character-set-client-handshake",
  "ParameterValue": null,
  "ApplyType": "static"
}
{
  "Description": "The character set for statements that arrive from the client.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_client",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The character set used for literals that do not have a character set introducer and for number-to-string conversion.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_connection",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The character set used by the default database.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_database",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The file system character set.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_filesystem",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The character set used for returning query results to the client.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_results",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The server's default character set.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character_set_server",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The collation of the connection character set.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "collation_connection",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "The server's default collation.",
  "DataType": "string",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "collation_server",
  "ParameterValue": null,
  "ApplyType": "dynamic"
}
{
  "Description": "Ignore character set information sent by the client.",
  "DataType": "boolean",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "skip-character-set-client-handshake",
  "ParameterValue": null,
  "ApplyType": "static"
}

DB パラメーターグループのキャラクタセット関連のパラメータをrds modify-db-parameter-groupコマンドで更新する。

  • character_set_filesystemcharacter_set_system以外のキャラクタセットutf8mb4を設定する。
  • collation はutf8mb4_general_ciにする。
  • skip-character-set-client-handshakeは TRUE にするとクライアント側が要求してきたキャラクタセットは無視して強制的にサーバ側のcharacter-set-serverで指定したキャラクタセットで応答するようになるらしい。
    今回はアプリのクライアント側でキャラクタセットを指定するのでこの設定はオフにする。
  • ApplyMethod は immediate は即時反映で、pending-reboot は再起動後の反映となる。
    Apply Type が dynamic のものは immediate で、static のものは pending-reboot となるようだ。
$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=character_set_client,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_connection,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_database,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_results,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_server,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=collation_connection,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=collation_server,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=skip-character-set-client-handshake,ParameterValue=0,ApplyMethod=pending-reboot

{
    "DBParameterGroupName": "mydbparamgroup"
}

DB パラメータグループに反映されたかrds describe-db-parametersコマンドで確認してみる。

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '[ .Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { key: .ParameterName, value: .ParameterValue } ] | from_entries'

{
  "character-set-client-handshake": null,
  "character_set_client": "utf8mb4",
  "character_set_connection": "utf8mb4",
  "character_set_database": "utf8mb4",
  "character_set_filesystem": null,
  "character_set_results": "utf8mb4",
  "character_set_server": "utf8mb4",
  "collation_connection": "utf8mb4_general_ci",
  "collation_server": "utf8mb4_general_ci",
  "skip-character-set-client-handshake": "0"
}

RDS MySQL インスタンス作成

create-db-instanceコマンドで RDS MySQL インスタンスを作成する。

  • 上記で作成した DB パラメータグループをオプションで指定する。
  • db-instance-identifier はmyinstanceとする。
  • RDS MySQL に外部から接続したいので publicly-accessible を追加。
$ aws rds create-db-instance \
--db-instance-identifier myinstance \
--allocated-storage 5 \
--db-instance-class db.t2.micro \
--engine MySQL \
--engine-version 5.6.22 \
--master-username bloguser \
--master-user-password bloguser1234567890 \
--db-name blogdb \
--db-parameter-group-name mydbparamgroup \
--storage-type standard \
--no-multi-az \
--region ap-northeast-1 \
--publicly-accessible \
--no-auto-minor-version-upgrade

コマンドを実行すると RDS インスタンスの作成がはじまる。しばらく時間がかかるので待つ。

  • VPC 指定をしていないので RDS インスタンスdefault VPC内に作成される。
  • セキュリティグループはdefault VPC security groupが設定される。
  • DBサブネットグループはdefaultが設定される。

インスタンスの作成が完了したら、rds describe-db-instancesコマンドでエンドポイントを確認する。

$ aws rds describe-db-instances --db-instance-identifier myinstance

...
            "Endpoint": {
                "Port": 3306,
                "Address": "myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
            },
...

PublicIp、PublicDnsName はec2 describe-network-interfacesコマンドで確認できる。
GUI 管理コンソールでは、EC2 Dashboard -> Network interfaces から確認できる。

$ aws ec2 describe-network-interfaces --filters "Name=description,Values=RDSNetworkInterface"

...
            "Description": "RDSNetworkInterface",
            "Association": {
                "PublicIp": "54.92.100.249",
                "PublicDnsName": "ec2-54-92-100-249.ap-northeast-1.compute.amazonaws.com",
                "IpOwnerId": "amazon-rds"
            },
...

デフォルトセキュリティグループに Inbound ルール追加

RDS MySQL に外部から接続するためにdefault VPC security groupに Inbound のルールを追加する。
セキュリティグループ ID を確認。

$ aws rds describe-db-instances --db-instance-identifier myinstance

...
        "VpcSecurityGroups": [
            {
                "Status": "active",
                "VpcSecurityGroupId": "sg-xxxxxxxx"
            }
        ],
...

ec2 authorize-security-group-ingressコマンドで追加する。

$ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3306 --cidr 0.0.0.0/0

RDS MySQL のキャラクタセット確認

上で調べた Endpoint または PublicIp、PublicDnsName のいずれかをホストに指定して MySQL に接続する。

$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p -D blogdb

MySQL に接続できたら、キャラクタセットの設定を確認する。

mysql> show create database blogdb\G
*************************** 1. row ***************************
       Database: blogdb
Create Database: CREATE DATABASE `blogdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
1 row in set (0.01 sec)

mysql> show variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8    |
| character_set_connection | utf8    |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8    |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

mysql> show global variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

mysql> show global variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

global variables は指定通り utf8mb4 になっているが、session の variables は utf8 になっている箇所がある・・・

MySQL クライアント側のキャラクタセットがどうなっているか調べてみる。

今、手元の Mac にインストールした MySQL(Server version: 5.6.19 Homebrew)から接続しているので、そのローカルの MySQL にログインする。

$ mysql -uroot

mysql> show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+

mysql> show global variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+

mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

mysql> show global variables like 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

character_set_clientなど、すべて utf8 になっていたのでこれが原因だろう。クライアント側でキャラクタセットを指定して再度、RDS MySQL に接続してみる。

コマンドラインのオプションで--default-character-setを指定する。

$ mysql --default-character-set=utf8mb4 -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p

再度、キャラクタセットの設定を確認する。

mysql> show variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

mysql> show global variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

mysql> show global variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

今度はセッションの設定も utf8mb4 となった。

一応、skip-character-set-client-handshakeを TRUE の場合もやってみた。
DB パラメータグループを更新する。

$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=skip-character-set-client-handshake,ParameterValue=1,ApplyMethod=pending-reboot

変更を反映させるためにrds reboot-db-instanceコマンドで RDS インスタンスの再起動させる。

$ aws rds reboot-db-instance --db-instance-identifier myinstance

同じように RDS MySQL に接続してキャラクタセットを確認したところ、クライアント側で要求したキャラクタセットは無視されて、すべて utf8mb4 となることが確認できた。


2. タイムゾーンの設定

※追記:タイムゾーンの設定が可能になり以下で設定できる。init_connectを使ったワークアラウンドは不要になった

$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=time_zone,ParameterValue=Asia/Tokyo,ApplyMethod=immediate

Amazon Web Services ブログ: Amazon RDS (MySQL, MariaDB)がlocal time zoneをサポートしました
http://aws.typepad.com/aws_japan/2015/12/amazon-rds-local-timezone-support.html

--
以下、タイムゾーンの変更ができなかった頃のワークアラウンド

RDS MySQLタイムゾーンJST にしたいが、現時点ではタイムゾーンの変更はできず、デフォルトの UTC となっている。
調べてみるとワークアラウンドとして、init_connect変数を使って接続毎にタイムゾーンを設定する方法があるようなので、それをやってみる。
以下を参考にさせてもらった。

AWS - RDS(MySQL)でJSTを使う たった1つの冴えたやり方 - Qiita
http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4
MySQL,RDS - RDS(MySQLエンジンにてタイムゾーンを変更する方法を整理) - Qiita
http://qiita.com/mitzi2funk/items/4726986e8288b1599786
» AWS RDSのタイムゾーンについて Tech Fun.cc
http://techfun.cc/aws/aws-rds-timezone.html

init_connectで単純にSET SESSION time_zone = 'Asia/Tokyo';とやるのでは問題が発生するとのこと。
RDS 管理用のrdsadminというユーザがいて、このユーザが何かする時に Timezone が UTC 以外だと不具合が発生してしまうみたい。
以下のようにrdsadminユーザ以外の接続時のみ Timezone を変更するようにすればよい。

SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;

デフォルトの設定を確認する

RDS MySQL にログインしてタイムゾーンを確認する。

# ローカル Mac の現在時間
$ date
2015年 2月17日 火曜日 01時27分19秒 JST


# RDS MySQL に接続
$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p


# 現在時間、タイムゾーン確認
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2015-02-16 16:27:51 |
+---------------------+

mysql> show variables like '%time_zone';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | UTC   |
| time_zone        | UTC   |
+------------------+-------+

mysql> show global variables like '%time_zone';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | UTC   |
| time_zone        | UTC   |
+------------------+-------+

UTC となっている。ローカルは JST なので当然ながら時間はズレている。

init_connect変数を設定

DB パラメータグループのinit_connect変数を更新する。
SET 文を aws-cli の直接コマンドに埋め込むのではなく、ファイルに書いてそれをアップロードする方法で行う。 まずはテンプレートとなるファイルを--generate-cli-skeletonオプションで出力させる。

$ aws rds modify-db-parameter-group --generate-cli-skeleton > init_connect.json

出力されたファイルを以下のように編集する。

{
    "DBParameterGroupName": "mydbparamgroup",
    "Parameters": [
        {
            "ParameterName": "init_connect",
            "ParameterValue": "SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;",
            "Description": "",
            "Source": "",
            "ApplyType": "",
            "DataType": "",
            "AllowedValues": "",
            "IsModifiable": true,
            "MinimumEngineVersion": "",
            "ApplyMethod": "immediate"
        }
    ]
}

そしてDB パラメータグループを更新する。--cli-input-jsonオプションでファイルを指定。

$ aws rds modify-db-parameter-group --cli-input-json file://init_connect.json

# 終わったら不要なので削除
$ rm init_connect.json

設定が反映されるまで待つ。
反映されたら再度 RDS MySQL に接続して確認してみる。

# ローカル Mac の現在時間
$ date
2015年 2月17日 火曜日 01時38分03秒 JST


# RDS MySQL 接続
$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p


# 現在時間、タイムゾーン確認
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2015-02-17 01:38:18 |
+---------------------+

mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+

mysql> show global variables like '%time_zone';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | UTC   |
| time_zone        | UTC   |
+------------------+-------+

このセッションのtime_zoneAsia/Tokyoになっているのが確認できた。

後片付け

default VPC security groupに追加した Inbound ルールをec2 revoke-security-group-ingressコマンドで取り消す。

$ aws ec2 revoke-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3306 --cidr 0.0.0.0/0

RDS インスタンスmyinstancerds delete-db-instanceコマンドで削除する(データも消えるので注意!)。

# スナップショットは作らず削除
$ aws rds delete-db-instance --db-instance-identifier myinstance --skip-final-snapshot

# スナップショットを作ってから削除
$ aws rds delete-db-instance --db-instance-identifier myinstance \
--no-skip-final-snapshot \
--final-db-snapshot-identifier myinstance-final-snapshot

インスタンス削除が完了するまで待つ。

DB パラメーターグループmydbparamgrouprds delete-db-parameter-groupコマンドで削除する。

$ aws rds delete-db-parameter-group --db-parameter-group-name mydbparamgroup

以上。


補足

DB パラメータグループの JSON データから jq コマンドで目的のデータを抽出するためにいろいろ試行錯誤しながら試した。
記録しておかないと次に再現できないのでメモしておく。

JSON データ

{
    "Parameters": [
        {
            "Description": "Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
            "DataType": "boolean",
            "AllowedValues": "0,1",
            "Source": "engine-default",
            "IsModifiable": false,
            "ParameterName": "allow-suspicious-udfs",
            "ApplyType": "static"
        },
        {
            "Description": "The MySQL installation base directory.",
            "DataType": "string",
            "IsModifiable": false,
            "Source": "system",
            "ParameterValue": "/rdsdbbin/mysql",
            "ParameterName": "basedir",
            "ApplyType": "static"
        },

        ...
    ]
}

上記の元データから jq コマンドを使って、あるパラメータに特定の文字列を含むものだけを抽出して出力してみる。
jq コマンドはjq '.'jq '.Parameters[]'のようにシングルクォートで囲ったフィルタ式を渡すことで実行する。

例1

ParameterName に"character"を含むものを抽出する。

  1. .Parameters[]で Parameters の配列の全ての要素を取り出して出力する。.Parametersとは違う。
  2. contains()で()内の入力値に部分一致するかどうかの真偽値を返す。
  3. select()で ()内の条件が真になれば、その要素を出力する、偽であれば何も返さない。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(.ParameterName | contains("character"))'

下は上と同じように動作する、別の書き方。

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(contains({ParameterName: "character"}))'

出力結果:

{
  "Description": "Don't ignore character set information sent by the client.",
  "DataType": "boolean",
  "AllowedValues": "0,1",
  "Source": "engine-default",
  "IsModifiable": true,
  "ParameterName": "character-set-client-handshake",
  "ApplyType": "static"
}
{
  "Description": "The character set for statements that arrive from the client.",
  "DataType": "string",
  "IsModifiable": true,
  "AllowedValues": "big5,dec8,cp850,hp8,koi8r,latin1,latin2,swe7,ascii,ujis,sjis,hebrew,tis620,euckr,koi8u,gb2312,greek,cp1250,gbk,latin5,armscii8,utf8,cp866,keybcs2,macce,macroman,cp852,latin7,utf8mb4,cp1251,cp1256,cp1257,binary,geostd8,cp932,eucjpms",
  "Source": "user",
  "ParameterValue": "utf8mb4",
  "ParameterName": "character_set_client",
  "ApplyType": "dynamic"
}
...
例2

{}を利用することで、JSON の内容を組み替えたオブジェクトを生成して出力してる。

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(.ParameterName | contains("character")) | { desc: .Description, name: .ParameterName, value: .ParameterValue }'

出力結果:

{
  "desc": "Don't ignore character set information sent by the client.",
  "name": "character-set-client-handshake",
  "value": null
}
{
  "desc": "The character set for statements that arrive from the client.",
  "name": "character_set_client",
  "value": "utf8mb4"
}
...
例3
  1. "character"を含むものを抽出
  2. ParameterName, ParameterValue を key, value という名前のプロパティに変更してオブジェクトを作成
  3. []で囲んで配列を作成
  4. from_entriesで key-value のペアからオブジェクトへ変換
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '[ .Parameters[] | select(.ParameterName | contains("character")) | { key: .ParameterName, value: .ParameterValue} ] | from_entries'

出力結果:

{
  "character-set-client-handshake": null,
  "character_set_client": "utf8mb4",
  "character_set_connection": "utf8mb4",
  "character_set_database": "utf8mb4",
  "character_set_filesystem": null,
  "character_set_results": "utf8mb4",
  "character_set_server": "utf8mb4",
  "skip-character-set-client-handshake": "0"
}
例4

"character"または、"collation"を含むものを抽出。orを使う。

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation"))'

# 上と同じ
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(contains({ParameterName: "character"}) or contains({ParameterName: "collation"}))'
例5

今までものをすべて組み合わせたもの。

desc, name, value のみ

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { desc: .Description, name: .ParameterName, value: .ParameterValue }'

{
  "desc": "Don't ignore character set information sent by the client.",
  "name": "character-set-client-handshake",
  "value": null
}
{
  "desc": "The character set for statements that arrive from the client.",
  "name": "character_set_client",
  "value": "utf8mb4"
}

...

key-value 形式

$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
  | jq '[ .Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { key: .ParameterName, value: .ParameterValue } ] | from_entries'

{
  "character-set-client-handshake": null,
  "character_set_client": "utf8mb4",
  "character_set_connection": "utf8mb4",
  "character_set_database": "utf8mb4",
  "character_set_filesystem": null,
  "character_set_results": "utf8mb4",
  "character_set_server": "utf8mb4",
  "collation_connection": "utf8mb4_general_ci",
  "collation_server": "utf8mb4_general_ci",
  "skip-character-set-client-handshake": "0"
}

参考:

jq Manual
http://stedolan.github.io/jq/manual/
軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました | Developers.IO
http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/
ゼロから始めるjqチュートリアル - JSONを解析/自在に出力する
http://blog.serverfrog.jp/jq-tutorial/
jq コマンドを使う日常のご紹介 - Qiita
http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af