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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

5回答

13796閲覧

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

kumakumatan

総合スコア213

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/12/11 02:23

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

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

宜しくお願いします。

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

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

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

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

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

guest

回答5

0

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

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

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

投稿2015/12/13 05:43

anonymouskawa

総合スコア856

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

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

kumakumatan

2015/12/14 04: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) この場合、設定をどのようにしていいのかご教授いただければありがたいです。 現在、本番運用している為、いろいろ試したいのですが、できない状態です。 宜しくお願い致します。
izkn

2015/12/14 06:26

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

2015/12/14 10:05

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

2015/12/16 04:28

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

0

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

投稿2015/12/13 15:00

編集2015/12/13 15:01
ooi

総合スコア43

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

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

0

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

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

sql

1mysql> desc testlog; 2+-----------+--------------+------+-----+---------+-------+ 3| Field | Type | Null | Key | Default | Extra | 4+-----------+--------------+------+-----+---------+-------+ 5| uploadlog | varchar(100) | YES | | NULL | | 6+-----------+--------------+------+-----+---------+-------+ 71 row in set (0.00 sec) 8 9mysql> insert into testlog (uploadlog) values ("〜~"); 10Query OK, 1 row affected (0.01 sec) 11 12mysql> select * from testlog; 13+-----------+ 14| uploadlog | 15+-----------+ 16|~ | 17+-----------+ 181 row in set (0.00 sec)

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


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

sql

1mysql> insert into testlog (uploadlog) values ('20151002~20151201'); 2Query OK, 1 row affected (0.01 sec) 3 4mysql> select * from testlog; 5+---------------------+ 6| uploadlog | 7+---------------------+ 8|~ | 9| 2015100220151201 | 10+---------------------+ 112 rows in set (0.00 sec) 12 13mysql> show variables like "chara%"; 14+--------------------------+----------------------------+ 15| Variable_name | Value | 16+--------------------------+----------------------------+ 17| character_set_client | utf8 | 18| character_set_connection | utf8 | 19| character_set_database | utf8 | 20| character_set_filesystem | binary | 21| character_set_results | utf8 | 22| character_set_server | latin1 | 23| character_set_system | utf8 | 24| character_sets_dir | /usr/share/mysql/charsets/ | 25+--------------------------+----------------------------+ 268 rows in set (0.00 sec) 27 28mysql> show create table testlog \G; 29*************************** 1. row *************************** 30 Table: testlog 31Create Table: CREATE TABLE `testlog` ( 32 `uploadlog` varchar(100) DEFAULT NULL 33) ENGINE=InnoDB DEFAULT CHARSET=utf8 341 row in set (0.00 sec)

追記

sql

1mysql> select hex(ord('〜')); 2+-----------------+ 3| hex(ord('〜')) | 4+-----------------+ 5| E3809C | 6+-----------------+ 71 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 05:39

編集2015/12/11 06:31
izkn

総合スコア1698

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

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

kumakumatan

2015/12/11 06: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') になります。 宜しくお願いします。
guest

0

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

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

投稿2015/12/11 03:15

YanKilo_Charlie

総合スコア19

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

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

kumakumatan

2015/12/11 05:23

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

2015/12/11 07:28

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

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 03:15

mitsu6809

総合スコア13

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

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

kumakumatan

2015/12/11 05: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
kumakumatan

2015/12/11 05: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' ================================================== 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問