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

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

ただいまの
回答率

88.05%

Mysqlテーブル書き込み制約についてのご質問

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 7,301

score 178

 社内にて、Windows2008R2・PHP・Apache・Mysqlにてダウンロードサイトを運用しています。 Mysqlのあるテーブル内にアップロードログを書き込むようにしています。

 DatatypeはVARCHAR(100)です。 その項目に「~」の文字をInsertにて書き込もうとすると、 「Error:There was an error while applying the SQL script to the database」 となり、書き込むできません。 「~」文字を書き込む為には、Datatypeをどのようにすればいいでしょうか? それとも、「~」の文字は書き込む事はできないのでしょうか。

宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+1

「~」は鬼門ですねー。Oracleでですけど、以前似たようなトラブルにあいました。
全角チルダ問題

確認して欲しい内容
MySQLでの文字化け対策

文字コードの問題だと思うので、確認してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/14 13:43

    ご回答ありがとうございます。
    状態を確認してみました。

    mysql> show variables like 'character%';
    +--------------------------+----------------------------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------------------------+
    | character_set_client | cp932 |
    | character_set_connection | cp932 |
    | character_set_database | cp932 |
    | character_set_filesystem | binary |
    | character_set_results | cp932 |
    | character_set_server | cp932 |
    | character_set_system | utf8 |
    | character_sets_dir | C:\pg\MySQL\MySQL Server 5.6\share\charsets\ |
    +--------------------------+----------------------------------------------+
    8 rows in set (0.00 sec)

    この場合、設定をどのようにしていいのかご教授いただければありがたいです。
    現在、本番運用している為、いろいろ試したいのですが、できない状態です。

    宜しくお願い致します。

    キャンセル

  • 2015/12/14 15:26

    DB が sjis だから、波ダッシュ(WAVE DASH)は有っても、全角チルダ(FULLWIDTH TILDE)が無いということですか。
    1.全角チルダを波ダッシュに置き換える(提示済み)
    2.全角チルダを別の文字(例えば「波」)とかで格納して、出力時に「〜」に置き換える
    3.システムの文字コードを統一する

    他に何か手はあるのかなあ。もう私から提示できることは無いですね。

    キャンセル

  • 2015/12/14 19:05

    システムが既に稼働していて、というのであれば不用意に本番DBの文字コードを変えることはおすすめできません。
    なので、izknさんが提案している1案か、2案で対応したほうが良いでしょう。
    ただ、全角チルダで入力したのに波ダッシュになるのは些か不自然です。
    また、2案は「~」で検索するときに問題が出ます。

    どれを選択してもメリットデメリットがありますので、まずはどうするかを検討してみてください。

    キャンセル

  • 2015/12/16 13:28

    ご意見、ありがとうございます。
    検討してみます。
    今後とも宜しくお願い致します。

    キャンセル

0

VARCHARで’~’が書き込めないという制約は無い筈ですので 下記のようなSQLでお試しになられてはどうでしょうか? create table a_tmp (id bigint, c1 varchar(100)); insert into a_tmp values (1,'~'); もしこれがエラーになるとしたら記述とは別の所に問題があるという切り分けにはなるかと思います。

もし可能であればkumakumatanさんが実行したSQLを添付して第3者に検証を依頼すると良いと思います

また、お使いのMYSQLのバージョン PHPのバージョン JDBCやODBC等ドライバを使用している場合はそれらのバージョン を併記されるとバグ等に関係する情報を得られやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/11 14:33

    ご回答ありがとうございます。

    create table a_tmp (id bigint, c1 varchar(100)); insert into a_tmp values (1,'~');
    を実行すると問題なく書き込みが可能でした。
    テーブルを再作成しないと解消できない気がしてきました。

    phpから実行したSQLは「$query = "INSERT INTO up_log(SEND_DATE, SEND_TEMP) values('$systemDate', '$FILENAME2')"」です。
    $FILENAME2に、「201509~20151130」という文字が入っています。

    ■仮想サーバ(Vmware)
    OS:Windows 2008R2(x64)
    ミドルウェア:Apach 2.4/PHP 5.5.27/MySQL 5.6.11

    キャンセル

  • 2015/12/11 14:41

    ■追記です。
     先程の手動で書き込みをした際のログを下記に記載します。

    ==============ログ==============================

    Executing:
    UPDATE `abc_testdb01`.`up_log` SET `SEND_TEMP`='20151002~20151201' WHERE `SEND_DATE`='2015/12/11/ 12:05:03';

    Operation failed: There was an error while applying the SQL script to the database.
    ERROR 1366: 1366: Incorrect string value: '\xEF\xBD\x9E201...' for column 'SEND_TEMP' at row 1
    SQL Statement:
    UPDATE `abc_testdb01`.`up_log` SET `SEND_TEMP`='20151002~20151201' WHERE `SEND_DATE`='2015/12/11/ 12:05:03'

    ==================================================

    宜しくお願い致します。

    キャンセル

  • 2015/12/11 15:21

    http://www.mnhr.net/reports/index.php/20130526
    が参考になるかも知れませんTABLEを作成した際にCHARA SETがlatin1になっていると
    トラブルになる事例があるようです

    キャンセル

0

これはデータタイプ問題ではないかもしれません。(もう少しログを出させてみた方がいいと思います。)

まずはMySQLに手入力でInsertしてみてください。(多分、直接にInsert文で「~」はInsertされると思いますが。)もし手入力でも同じように出来なけれはテーブルを作成する際に問題があるかもしれません。(Syntaxなど)手入力でInsertされますとPHPから転送する際の書き込みなどで問題かもしれないので、そちらに関連するところのログを確認してみてください。その現象についてのログなどが出ましたら、また載せてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/11 14:23

    ご回答ありがとうございます。
    手入力で「~」を入力しても結果的に書き込みができませんでした。

    キャンセル

  • 2015/12/11 16:28

    それならまずはテーブルの構造を確認したいですが、~が書き込まれないColumnのCollation(照合順序)は今何になっていますか。それを変えてから手入力やPHPからの転送をやってみましょう。またPHPの~含む文字列のエンコードを確認し、もしConvertなどする必要ないかを確認してみてください。

    キャンセル

0

手入力で「~」を入力しても結果的に書き込みができませんでした。

とのことですが、私の環境では問題は発生しませんでした。

mysql> desc testlog;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| uploadlog | varchar(100) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into testlog (uploadlog) values ("〜~");
Query OK, 1 row affected (0.01 sec)

mysql> select * from testlog;
+-----------+
| uploadlog |
+-----------+
| 〜~       |
+-----------+
1 row in set (0.00 sec)

どのようなSQL文を手入力で投げて、どのようなエラーが戻ったのかを質問に追記する形でご提示ください。


追記
当方の環境を出力します。お使いの環境と何か違いがありますか。

mysql> insert into testlog (uploadlog) values ('20151002~20151201');
Query OK, 1 row affected (0.01 sec)

mysql> select * from testlog;
+---------------------+
| uploadlog           |
+---------------------+
| 〜~                 |
| 20151002~20151201  |
+---------------------+
2 rows in set (0.00 sec)

mysql> show variables like "chara%";
+--------------------------+----------------------------+
| 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     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show create table testlog \G;
*************************** 1. row ***************************
       Table: testlog
Create Table: CREATE TABLE `testlog` (
  `uploadlog` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

追記

mysql> select hex(ord('〜'));
+-----------------+
| hex(ord('〜'))  |
+-----------------+
| E3809C          |
+-----------------+
1 row in set (0.00 sec)

PHPでMySQLにUPDATE文を投げる前に、FULLWIDTH TILDEからWAVE DASHに変換、
つまり\xEF\xBD\x9E\xE3\x80\x9Cに変換をかけることはできますか。

FULLWIDTH TILDEではなくWAVE DASHなら入るのではなかろうかと推測しております。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/11 15:10

    ■手動で実施したSQL文
    INSERT INTO `test_usr`.`up_log` (`SEND_DATE`, `SEND_TEMP`) VALUES ('2015/12/11/ 15:00:00', '201510~201512');

    ■結果ログ
    Operation failed: There was an error while applying the SQL script to the database.
    Executing:
    INSERT INTO `test_usr`.`up_log` (`SEND_DATE`, `SEND_TEMP`) VALUES ('2015/12/11/ 15:00:00', '201510~201512');

    ERROR 1366: 1366: Incorrect string value: '\xEF\xBD\x9E201...' for column 'SEND_TEMP' at row 1
    SQL Statement:
    INSERT INTO `test_usr`.`up_log` (`SEND_DATE`, `SEND_TEMP`) VALUES ('2015/12/11/ 15:00:00', '201510~201512')

    になります。
    宜しくお願いします。

    キャンセル

0

上の方が言われていたキャラクタセットの問題っぽい気がします。 DBのキャラクタセットはUTF8以外でしょうか。 また、クライアント側のキャラクタセットの問題も考えられそうです。 my.cnfとPHPからMySQLに接続する際のキャラクタセットを指定すれば問題ないと思いますが。 SJISやlatinだとはまるかもしれないですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る