質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

4回答

5049閲覧

mariadbに特殊文字を含む文字列がinsertできない

ky_46

総合スコア92

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/09/21 05:28

前提・実現したいこと

CentOS7.5.1804のサーバーがあり、rh-mariadb102-mariadb-server-utils-10.2.8-5.el7.x86_64が走っているデータベースサーバーが構築済です。
このmariadbに、Excel VBAからSQLを送信するプログラムを走らせたところ、実行時エラー2147467259 が発生しました。
イメージ説明

該当のソースコード

VBA

1Sub test01() 2 3 Dim wkb01 As Workbook 4 Dim wsh01 As Worksheet 5 Dim Ran01 As Range 6 7 Dim c1 As Integer 8 Dim r1 As Integer 9 10 Dim tmptbn1 As String 11 Dim sql1 As String 12 13 Dim myCmd As New ADODB.Command 14 Dim myConn As New ADODB.Connection 15 Dim connectionString As String 16 17 connectionString = "Driver={MySQL ODBC 3.51 DRIVER};" _ 18 & " SERVER=[サーバー名];" _ 19 & " STMT=SET NAMES sjis;" _ 20 & " PORT=3306;" _ 21 & " DATABASE=[データベース];" _ 22 & " USER=[ユーザー];" _ 23 & " PASSWORD=[パスワード];" _ 24 & " OPTION=2;" 25 myConn.Open connectionString 26 27 With myCmd 28 .ActiveConnection = myConn 29 30 tmptbn1 = "tb_" & dt2unepocht(Now()) 31 32 sql1 = "CREATE TABLE " 33 sql1 = sql1 & tmptbn1 34 sql1 = sql1 & " (" 35 sql1 = sql1 & " `serial` INTEGER UNSIGNED auto_increment primary key" 36 sql1 = sql1 & ",`name` varchar(128)" 37 sql1 = sql1 & ");" 38 39 .CommandText = sql1 40 .Execute 41 42 43 Set wkb01 = ThisWorkbook 44 Set wsh01 = wkb01.Worksheets(1) 45 wsh01.Activate 46 47 r1 = 2 48 c1 = 1 49 50 Do 51 Set Ran01 = wsh01.Cells(r1, c1) 52 53 If Ran01 = "" Then 54 Exit Do 55 End If 56 57 r1 = r1 + 1 58 59 sql1 = "INSERT INTO `" 60 sql1 = sql1 & tmptbn1 61 sql1 = sql1 & "` (`name`) VALUE ('" 62 sql1 = sql1 & Ran01.Value 63 sql1 = sql1 & "');" 64 65 .CommandText = sql1 66 .Execute 67 68 Loop 69 70 71 End With 72 myConn.Close: Set myConn = Nothing 73End Sub

内容

データベースにtb_[エポック秒]のテーブルを新作し、自身のシート1のA2から順に下がって、セルの値をそのテーブルにinsertしていくプログラムです。
㈱式会社
㎝センチ
Ⅱローマ2
①まる1
を値として入れました。

以前、同様の内容をMySQL5.6で実施していたときは、このような問題は無かったはずなのですが、サーバーの交換でmariadbになってから、一部データがエラーになるようになり、調べたところ特殊文字を含んでいる行では? と当たりをつけ、テストを走らせてみたところ、案の定でした。

特殊文字を含んでいても、そのまま通過するようにしたいのですが、mariadb 特殊文字 で検索してみても、これといってヒントになる情報が得られなかったので
ご質問とさせていただきます。

補足情報

MariaDB側の文字コード設定は、UTFになっているのは確認しました。

MariaDB [(none)]> show variables like 'char%';
+--------------------------+--------------------------------------------------------+
| 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 |
| character_sets_dir | /opt/rh/rh-mariadb102/root/usr/share/mariadb/charsets/ |
+--------------------------+--------------------------------------------------------+

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2018/09/21 13:31

私はその環境は知らないのですが、現象はWindows31JやMS932・CP932と呼ばれる文字コードの問題なので、この名で検索すると何か分かるかもしれません。
guest

回答4

0

自己解決

暫定ですが、一応、自己解決とします。
修正依頼で頂いていた、ikadzuchiさんの「CP932と呼ばれる文字コードの問題なので、この名で検索すると何か分かるかもしれません。 」の通り、

connectionString = "Driver={MySQL ODBC 3.51 DRIVER};" _
& " SERVER=[サーバー名];" _
& " STMT=SET NAMES cp932;" _
& " PORT=3306;" _
& " DATABASE=[データベース];" _
& " USER=[ユーザー];" _
& " PASSWORD=[パスワード];" _
& " OPTION=2;"

にしたところ、エラーダイアログも出なくなり、テーブルを調べても、特殊文字がちゃんとInsertされていました。

とりあえず、これで一応の解決としたいと思います。

投稿2018/09/26 09:28

ky_46

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

utf8だと3byte文字でないとダメなことがあるようです。

https://qiita.com/edisonthk/items/03d7023fb53006a7c83e

調べたら理由はMySQLのutf8は3バイトまでしか対応していません。

ネットで調べたらMySQL5.5以上からutf8mb4という4バイトのutf8に対応する文字コードがありまして、さっそくshow character setで確認したら
本当に4バイトまで対応しているutf8mb4がありました!!
データベース、テーブルとconnection driverが全部utf8からutf8mb4に切り替えたら上記のエラーが解消しました。

投稿2018/09/21 09:16

編集2018/09/21 09:17
Satsuki_2981

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ky_46

2018/09/26 09:24

ご回答ありがとうございます。 mariadb-server.cnf に、default-character-set = utf8mb4 をセットしてみたのですが、やはり同じエラーがでてしまいました。大変参考になりました。
guest

0

collationをutf8mb4_unicode_ciあたりで管理してみてはどうでしょうか?

投稿2018/09/21 06:31

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ky_46

2018/09/21 07:05

ご回答ありがとうございます。 とりあえず、CREATE TABLEが終わったところにブレークポイントを入れ、照合順序をutf8mb4_unicode_ci にしてから、INSERT部分を実行してみましたが、やはり同じエラーになります。
guest

0

MariaDBの日本語の文字化けを解消する
CREATE TABLE で以下の設定をしてください。

DEFAULT CHARSET=utf8

投稿2018/09/21 05:43

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ky_46

2018/09/21 06:58

ご回答ありがとうございます。 sql1 = "CREATE TABLE " sql1 = sql1 & tmptbn1 sql1 = sql1 & " (" sql1 = sql1 & " `serial` INTEGER UNSIGNED auto_increment primary key" sql1 = sql1 & ",`name` varchar(128)" sql1 = sql1 & ") DEFAULT CHARSET=utf8;" .CommandText = sql1 にしてみましたが、結果は変わりませんでした。 後出しになってしまって申し訳ありませんがmariadb-server.cnf (mysql のmy.cnfと同じ設定ファイル)には、 character-set-server=utf8 をセットしてあるため、テーブルを作成するとutf8_general_ci で作成されます。
Orlofsky

2018/09/21 07:13

お力になれずすみません。
ky_46

2018/09/21 08:29

いえいえ、ご回答感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問