絵文字を格納したいが　?????　になる


アプリ JavaDataInputStream JDBC-MariaDB MariaDB  
の順で絵文字を格納したいのですが、格納される文字が ????? になります。（絵文字部分だけ）  
全ての絵文字がそうなるわけではなく、サロゲートペアのものがそうなります。  
もちろん通常の文字だけなら普通に格納されます。

データベースのテーブルは utf8mb4 で、カラムも utf8mb4 であることを確認しています。  
useUnicode=true&characterEncoding=utf8mb4 をつけてコネクションを取得しています。

試しに set names utf8mb4 も試しましたがこれもダメでした。

何をしても ??? で保存されてしまうのですが何処が行けないのでしょうか？

追記  
やはり解決できません

□絶対だと分かっていること  
・テーブルは正常にutf8mb4である  
カラム単位でチェック済み  
これをする前は例外が発生していたが、これをしてから例外は発生しなくなった。  
そもそも、コネクションを通さなければ格納できる。

・コネクションは1.2.3（mariadb java）  
サロゲートペアが？になるバグは修正されているとここでの解答してくださった方により判明

・アプリ ←→ サーバー の通信はうまく行われている。  
DBに格納しないでそのままエコーすると正常に表示される。

・悪いのは MariaDB コネクション  
ターミナルなどではサロゲートペアでも普通に格納できる。  
また、PrepareStatementを使用している点が怪しい？  
（？をエスケープして置換してくれるやつ）

・コネクションには以下を指定（うるおぼえ）  
useUtf=tru charset=utf8mb4

・MariaDBにデータが届いた時点で文字化けではなくそもそも ？ という文字に置き換わっていると思われる。  
やはり、コネクションでの変換が原因？

要するに悪いのは絶対 MariaDB Connection Java だと思われるのですが、とても困っています。

追記追記  
対応できました！！！！！！！！！！！！  
原因 SQLの関数 ストアドプロシージャ の client_character 的なのが utf-8 だった。




自己解決

## 原因

ストアドプロシージャ（関数など）の `client_` が `utf-8` のままだった。  
まさか、 ストアドプロシージャ にも文字コードの設定があるとは気づかず、とてつもない時間を解決に要してしまいました。

ちなみにですが、私の実行できた設定は以下になります。  
（やはり設定トラブルも多いようなので）

## 確認方法

[code]

    show create PROCEDURE xxxxxxx;
    
[/code]

`character_set_client` が `utf-8` だった  
また、ほかに続くのも `utf8_general_ci` だった。

* * *

## /etc/my.cnf（必要な部分のみ）

[code]

    collation_server=utf8mb4_unicode_ci
    character-set-server=utf8mb4
    [mysql]
    default_character_set=utf8mb4
    [client]
    default-character-set=utf8mb4
    
[/code]

* * *

## コネクション

[code]

    DriverManager.getConnection("jdbc:mariadb://localhost/" + D.DataBaseName + "?user=" + D.DataBaseUser + "&password=" + D.DataBasePass + "&autoReconnect=true&useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_general_ci");
    
[/code]

`set names` などの発行はなし。  
`skip-character-set-client-handshake` も使用していない

* * *

## データベース

テーブルの文字コードは `utf8mb4`  
テーブルのカラム単位でも文字コード指定ができるみたいなのでそれも同じく `utf8mb4`




自己解決

## 原因

ストアドプロシージャ（関数など）の `client_` が `utf-8` のままだった。  
まさか、 ストアドプロシージャ にも文字コードの設定があるとは気づかず、とてつもない時間を解決に要してしまいました。

ちなみにですが、私の実行できた設定は以下になります。  
（やはり設定トラブルも多いようなので）

## 確認方法

[code]

    show create PROCEDURE xxxxxxx;
    
[/code]

`character_set_client` が `utf-8` だった  
また、ほかに続くのも `utf8_general_ci` だった。

* * *

## /etc/my.cnf（必要な部分のみ）

[code]

    collation_server=utf8mb4_unicode_ci
    character-set-server=utf8mb4
    [mysql]
    default_character_set=utf8mb4
    [client]
    default-character-set=utf8mb4
    
[/code]

* * *

## コネクション

[code]

    DriverManager.getConnection("jdbc:mariadb://localhost/" + D.DataBaseName + "?user=" + D.DataBaseUser + "&password=" + D.DataBasePass + "&autoReconnect=true&useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_general_ci");
    
[/code]

`set names` などの発行はなし。  
`skip-character-set-client-handshake` も使用していない

* * *

## データベース

テーブルの文字コードは `utf8mb4`  
テーブルのカラム単位でも文字コード指定ができるみたいなのでそれも同じく `utf8mb4`

