MySQLのD/Bへの環境依存文字入力について

MZ Platformとは 掲示板 MZプラットフォームユーザー会掲示板 MySQLのD/Bへの環境依存文字入力について

7 件の投稿を閲覧中 - 1 ~ 7 件(全 7 件)
  • 著者
    投稿
  • #7340
    TOA
    一般参加者

    お世話になります。
    MySQLのD/Bに環境依存文字(⓵等)を入力しようとすると
    データーベースのアクセス中にエラーが発生しました
    [データーベースアクセス[ID:3-7-1-6](KEY:”データベースアクセス”)]:イベント番号を指定してSQL文を実行する()
    (Exception:Incorrect string value:’\X87@’for column ‘mcomment’ at row 1)
    というエラーで入力することができませんでした。
    MySQLのコマンドラインで実行すると、環境依存文字でも入力・変更ができます。
    原因と対処方法を教えていただけないでしょうか?
    ちなみに、MZPlatform はバージョン3.6(32bit版)、MySQL は5.7.34 です。
    以上、よろしくお願いいたします。

    #7342
    MZPlatformユーザー会
    サイト管理者

    お問い合わせありがとうございます。

    (1)JDBCドライバーの更新をお試しください。
    コマンドラインでは環境依存文字も入力可能ということですので、まず考えられるのがJDBCドライバが適合していないということです。手元にMySQL5.7.34をインストールして試してみたところ、古いJDBCドライバでは環境依存文字をデータ追加する際エラーが発生しました。
    MySQL8.0用の最新のドライバは現在「mysql-connector-j-8.0.33.jar」ですが、MySQL5.7.34にも適合しています。JDBCドライバを変更すると環境依存文字を追加できるようになりました。ドライバファイルはMZPlatform\Java\jre8_mz3.6_64\lib\ext内に設定していただいています。

    (2)データベースに設定されている文字コードをご確認ください。
    ドライバファイルを更新しても改善されない場合は、データベースに設定されている文字コードをご確認ください。
    コマンドラインから「show variables like “chara%”;」を入力して実行すると、文字コードの一覧が取得できます。MySQL5.7はデフォルトでは文字コードが「latin1」になっている箇所があります。
    変更する必要があれば「C:\ProgramData\MySQL\MySQL Server 5.7」内にある「my.ini」に記述を追加します。
    1.[client]と[mysql]には「default-character-set=utf8mb4」
    [mysqlld]には「character-set-server=utf8mb4」の記述を追加します。
    2.設定を有効にするにはmysqlサーバーを再起動する必要があります。

    (3)後からテーブルや列、データベースの文字コードを変更することもできます。
    ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
    ALTER DATABASE データベース名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
    などを実行します。
    ただし、実行前には必ずmysqldump等でバックアップを取り、変更しても問題が起きないか検証してから行う必要があります。

    まずは、JDBCドライバファイルの更新をお試しいただき、改善されない場合はお手数ですが再度ご連絡いただければ幸いです。
    どうぞよろしくお願い申し上げます。

    #7343
    TOA
    一般参加者

    お世話になります。
    ご回答ありがとうございます。
    JDBCドライバーを最新にして実行してみたところ、初回のみ保存できたのですが、次に読み込んだ時には、’?’の文字になっており、修正しても以前と同じエラーで書込みができなくなりました。
    以降PC再立ち上げなど実施しましたが、環境依存文字の書き込み時にエラーになってしまします。
    CharacterSetですが、ほとんどがCP932で、
    character_set_filesystem = binary
    character_set_system = utf8
    character_sets_dir = C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\
    となっていますが、コマンドラインで環境依存文字の読み書きができているので、此処の問題ではなさそうな気がします。
    接続設定では characterEncoding=MS932 の設定となっています。
    回答ではMZPlatform3.6の64Bit版での検証だったようですが、当方は32Bit版です。
    以上、よろしくお願いいたします。

    #7344
    MZPlatformユーザー会
    サイト管理者

    ご連絡ありがとうございます。

    実は手元のPCのIMEでは環境依存の丸数字が2種類あり(添付の画像をご参照ください)shift-jisコードを持つNEC特殊文字はエラーは発生しませんが、utf-8のコードのみの丸数字はInsert時にエラーが発生します。
    今後多くの環境依存文字に対応する必要性が考えられる場合は、前回書きましたように可能であればデータベーステーブルの文字コードを「utf8mb4」に変更することもご検討ください。
    なお、MySQLではutf8はuft8mb3を指すため、utf8mb4を明示的に指定する必要があります。MySQL8.0ではデフォルトの文字セットはutf8mb4になっています。

    MZ3.6を使い手元で検証した結果は以下の通りです。
    1)接続時にcharacterencoding=ms932を設定する
    [1]shift-jisコードを持つ丸数字は、Insert時もselect時もエラーは発生しない
    [2]shift-jisコードを持たない丸数字は、エラーは発生しないが、selecして見ると「?」に変わっている。

    2)接続時にcharacterencoding=ms932を設定し、さらに接続後、set names cp932を実行する
     1)と結果は変わらない

    3)characterencoding=ms932を設定しない
    [1]shift-jisコードを持つ丸数字は、Insert時もselect時もエラーは発生しない
    [2]shift-jisコードを持たない丸数字は、エラーが発生し追加できない

    4)characterencoding=ms932を設定せず、set names cp932を接続後に実行する
    どちらの文字もエラーが発生し、追加できない
    という結果でした。

    文字コードの他にも、「set names cp932」が実行されている(あるいは「my.ini」の[mysqld]の項に「init-connect=’SET NAMES cp932’」がある)なども関係しているかもしれません。

    テーブルの文字コードは「show create table テーブル名;」で確認できます。

    以上、入力される文字のコードと接続時の文字コード設定をご確認いただいても改善されない場合は、お手数ですが再度ご連絡いただければ幸いです。「\X87@」がshit-jisコードの丸数字1を指しているのも気になります。
    どうぞよろしくお願い申し上げます。

    添付ファイル:
    #7346
    TOA
    一般参加者

    お世話になります。
    先程の投稿でコマンドラインでは読み書きできたとしていますが、その前にcharacter_setをutf8mb4に変更していたようです。データベースのダンプを違うデータベース名にインポートしてコマンドラインで実行した結果コマンドプロンプトでもエラーが出ました。そこで、ALTER DATABASEでutf8mb4をセットしたのですが、やはりエラーが出てしまいます。
    my.iniで変更しておいた方が良いのでしょうか?
    又、MZPlatformでのデータベース接続設定は characterEncoding=MS932のままで良いのでしょうか?
    以上、よろしくお願いいたします。

    #7347
    MZPlatformユーザー会
    サイト管理者

    ご連絡ありがとうございます。
    既に作成したデータベースやテーブルの文字コードは、後から文字セットを変更しても変わりません。例えば作成時にcp932で作成していたら文字コードはCp932のままです。テーブルの定義も必要に応じて変更する必要があります。
    また、MZから文字コードutf8mb4のテーブルに接続する際にはcharacterEncoding=MS932の指定は不要です。

    以下データベースのダンプができているという前提で、ご提案いたします。
    1)文字コードの整合性の問題が大きいと推測しています。MySQL8.0はデフォルト文字コードがutf8mb4なので、可能であればMySQL8.0をhttps://dev.mysql.com/downloads/windows/installer/8.0.htmlからダウンロードしてインストールします。最新バージョンはMySQL8.0.35です。同一機にインストールする場合は、ポート番号をデフォルトの「3306」から例えば「3307」等に変更しなければ、インストールに失敗することがあります。

    2)dumpしたバックアップファイルを開くと、テーブルの数の分「CREATE TABLE」の記述がある箇所があるかと思います。最後に文字コードを指定している部分があるので、ここを「DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;」に書き換えます。

    3)MySQL8.0に変更したバックアップファイルをインポートします。システムデータベースは移行せず、必要なデータベースだけインストールするのが良いようです。

    4)MZで接続できるか検証します。変更したポート番号を指定し、接続文字コードは指定しません。サーバ名の部分は例えば「jdbc:mysql://localhost:3307/」となります。
    ポート番号はインストーラーのconfigrationまたはmy.iniの記述により、後から変更することが可能です。

    5)MySQL8.0のインストールが難しい場合は、MySQL5.7のC:\ProgramData\MySQL\MySQL Server 5.7」内にある「my.ini」に記述を追加するのが簡単かと思います。
    1.[client]と[mysql]には「default-character-set=utf8mb4」
    [mysqlld]には「character-set-server=utf8mb4」の記述を追加します。
    2.設定を有効にするにはmysqlサーバーを再起動する必要があります。
    my.iniファイルを保存するとき、ファイル権限の変更が必要になる場合があります。

    6)検証しているデータベースでALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ciを実行します。

    7)MZで接続できるか検証します。接続文字コードは指定しません。

    以上、どうぞご検討ください。
    ご不明な点、ご質問等ございましたら、再度ご連絡いただければ幸いです。
    どうぞよろしくお願い申し上げます。

    #7363
    TOA
    一般参加者

    お世話になります。
    ご回答いただいてから時間が掛かっていましたが、何とか環境依存文字の読み書きができるようになりました。MySQL57サービスが開始中のままで、mysqlサーバーが起動しない状態だったのですが、my.iniファイルの文字コードをUTF8からANSIに変更したところMySQL57が起動中となり、その後のutf8mb4への変更を加えできるようになりました。
    ありがとうございました。

7 件の投稿を閲覧中 - 1 ~ 7 件(全 7 件)
  • このトピックに返信するには、ログインしてください。