1 :
だよもん!!! :
2007/05/03(木) 10:06:30 ID:/jT2voSZ
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
5 :
前スレ990 :2007/05/04(金) 12:08:10 ID:???
前スレ990です。 SELECT COUNT(*) FROM テーブル名 なんて便利な構文があったとは…。 感激です。 ありがとうございました。
質問です。 "SELECT * from table" の 11行目〜20行目 を取得したい場合には、どのようなSQL文を発行すれば良いでしょうか? 目的はWebアプリケーションの「次のページ」に該当するものを作ることです。 よろしくお願い致します。
8 :
6 :2007/05/04(金) 17:32:42 ID:???
9 :
NAME IS NULL :2007/05/04(金) 17:44:53 ID:qFF22gV4
>>9 ならMYSQL公式サイトに5.0の日本語マニュアルうpされる
10 :
NAME IS NULL :2007/05/04(金) 23:47:48 ID:L3HBUz2X
source sql.txt で520件程度のload_fileを使ったクエリを読み込ませて warningが4件ずつでながらもquery OK で成功してるはず なのですが、実際にセレクトしてみるとload_fileでインサートしたはずの 画像が入っていません。 手動で1件ずつ入れる分には問題ないのですが、 なんとかする方法はないでしょうか?
↑もう一回テストしてみたら入ってました。前回は念のためbeginってしたのが悪かったのかな。
beginしている事自体、駄目だろw
14 :
NAME IS NULL :2007/05/05(土) 16:26:28 ID:58Z5NhTT
はじめまして。 phpmyadminを使用してテーブルの作成をしたいのですが、VARCHARやTXETなどの可変長文字列を使用するとエラーがでます。 #1163 - The used table type doesn't support BLOB/TEXT columns 可変長文字列が使えないようになっているのはわかるのですが、どこで変更していいかわかりません。 どなたかご教授願います。
15 :
NAME IS NULL :2007/05/06(日) 02:00:51 ID:VOimcpaB
>>14 もう少し詳細な情報がないとなんとも。
「お腹痛いんですけど」だけでは原因はわかりません。
17 :
NAME IS NULL :2007/05/06(日) 03:37:23 ID:DkpI5Nmx
mysqlからデータ取り出して、PHPで表示させる時、皆何つかってる? 俺はWHILEばっかなんだけど。
>>17 csvファイルに落としてあとでのんびり参照。いやマジで。
質問です。 レンタルサーバでPHP+Mysqlを利用してます。 掲示板で、使用してるテーブルが 40万行 60MB なのですが、 これは一般的に大きすぎますか?
質問の意図が分かりません。 40万行なんてたいしたことではありません。
>>20 ありがとうございます。
レンタルサーバ側から、
『サーバに異常な負荷が起きている、Mysqlを利用できなくした。原因のPHPを削除しろ。』
とメールで連絡がきて。しかも海外の会社だから、英文で…
今、困惑中のオレ...orz
>>21 データ量じゃなくてクエリーの不出来が原因だな。
たった100行1メガのテーブルでも
やり方しだいで負荷100%は楽々達成できる
23 :
NAME IS NULL :2007/05/06(日) 13:25:21 ID:I2do9hQG
コマンドラインのmysqlクライアントでテーブル名やカラム名の補完ができるのを見かけたんですが、 使えるバージョンやconfigureオプションを教えてください。
inner join と left join + where 結合テーブル.任意のカラム is not null っていうのは同じ結果が返ってくると思うのですが、やっぱり速度的は前者の方が速いんでしょうか?
25 :
NAME IS NULL :2007/05/06(日) 16:52:06 ID:ixhAcene
質問です 誕生日などの記念日を日付型のフィールドに格納しています そこで、今日から指定日数以内に記念日が含まれる人を抽出する場合の条件は どのようにすればいいでしょうか?
>>25 BETWEEN に、今日の日付関数と、日数計算関数を書く。
Windows で skip-character-set-client-handshake を指定しても効かないのですが わかる方おります?
>>28 MySQLのバージョンがわからんとコメントしようがない。
>>30 そのオプションが4.1以降なのでと思っていたけど、5.0系ですね、、、
my.cnfの記述が気になる所ですが、
効く、効かないの確認はどのようにしていますか?
mysqlクライアントから、SHOW VARIABLES LIKE 'char%';の出力結果を確認してみましたか?
>>31 skip-character-set-client-handshake の仕様ついて、かなり勘違いしてるかもです。
すべて ujis に設定したいと考え character_set_server は ujis としています。
コマンドラインで SHOW VARIABLES LIKE 'char%'; を確認すると、
character_set_client の値は ujis になっているのですが、
phpMyAdmin から SHOW VARIABLES LIKE 'char%'; を確認すると、
haracter_set_client の値が utf8 になっているので効いてないじゃないか!と考えました。
phpMyAdmin がどんな悪さしようとも必ず character_set_server と同じになるものと考えていましたが
やっぱり違うんでしょうかね?
>>28 です。
実際そのように動作するからそういう仕様なんでしょうね。
phpMyAdmin にお仕置きすることにします。
MySQLのBOOL型はtrue/falseじゃなくて1/0ですよね?
FOX★公認!今世紀最大の祭り!!!
俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/ 1. チリ 136,836,018
2. ポーランド 135,173,390
3. イスラエル 80,308,719
4. ★日本 71,029,997★
5. スロベニア 56,818,986
6. フィンランド 40,275,252
石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である
・戦場
http://www.clickclickclick.com/default.asp ・まとめサイト
http://www33.atwiki.jp/clickvip/ ・mixi
http://mixi.jp/view_community.pl?id=2141035
MySQLを勉強中だが、遊びながら覚えるには 権限関係やmysqlコマンドラインクライアントの環境を把握するのが 大変で、本来のデーターベースいじる前にくたばった 寝る
GUIで弄れるSQL鯖とからくだよ。
…とあるサービスにMySQLの空間をとってて 前に自分で勉強がてらphpMyAdminをぶちこんでいたことが発覚したが 設定全部忘れてる。最初からやり直し。
…やっと -u root -p という呪文を覚えた。 すんげぇ疲れた
チラシの裏に書くべき事をここに延々と書くな
当たり前かもしれないのですが、レプリケーションって同じテーブルタイプじゃないとできないんでしょうか? 例えばDDLはまったく同じなInnoDBなテーブルからMyISAMなテーブルへはレプリケーションできないんですかね?
>>45 違ってもok
もちろん、MasterとSalveでそれぞれcreate tableしてからレプカを走らせてね
質問させてください mysql4のときはmy.cnfにdatadir=/home/mysqlを追加するだけでよかったのですが mysql5でdatadirを/home/mysqlにするにはどうしたらいいでしょうか?
>>47 変わってないかと。
[mysqld] セッションの中に datadir=xxxx を入れて mysqldをリスタートしる
検索用にMyISAMなDBを用意しておいて、データ保管用にInnoなDBを用意しておいてレプリケーションさせるのが最強?
レプリカの原理上、そんなことしてもあまり意味はない
51 :
NAME IS NULL :2007/05/11(金) 15:20:41 ID:OiGIVY/k
↓のWarnings: 6768ってどうゆう意味なんでしょう? 6768目のレコードが変ってことなのか、合計6768のレコードがおかしかったってことなのか・・・ mysql> load data infile 'new.txt' into table spict; Query OK, 31422 rows affected, 6768 warnings (2.21 sec) Records: 31422 Deleted: 0 Skipped: 0 Warnings: 6768
52 :
47 :2007/05/11(金) 16:03:05 ID:???
>>48 レスありがとうございます。
[mysqld] のすぐ下にdatadir = /home/mysqlと記入すると起動できません。
なぜでしょうか?・・・・
>>46 おお、そうなのですか。
当たり前すぎる事なのか、書籍にも書いてなかったので困ってました。
ありがとうございます!
54 :
NAME IS NULL :2007/05/11(金) 17:54:42 ID:NevP4AlU
interBaseのデータをMysqlにコンバートできますでしょうか?
つまりレプリケーションの時点で、Myisamの高速性は無効?
>>51 warning が6768個あったってこと。
show warnings すれば warning の内容が見れる。
57 :
NAME IS NULL :2007/05/12(土) 12:47:54 ID:HqCZ1kB3
フィールドにidとnameを作って、webサイトからnameを追加したらidが1づつ増やしていくようにしたいのですが、 idにint、nameにvarchar(50)を指定しました。 intの長さはどれくらいにしたらいいでしょうか? あと設定するところがあればご教授お願いいたします
>>57 そのidに何件格納するつもりなのかと、、、、その質問は難件だな。
59 :
NAME IS NULL :2007/05/12(土) 17:28:24 ID:5dWtySei
>>56 ありがとうございます。
show warningsの結果をファイル出力するにはどうしたらいいんでしょう?INTO OUTFILEとか>とか使ってみたんですけど何かエラーでます。
mysql> show warnings into outfile 'warnings.txt';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'into outfile 'warnings.txt'' at line 1
intのバイトサイズは不変です
データベースっておもしろいな、ハマりそう
EUC-JP UTF-8 SHIFT-JIS どれで作るのがおすすめですか?
UTF-8
文字化けの恐怖が・・・
JISにしておくとメールの文字化け無いけどね。
PHPとの連携でいちいち変換しないと
68 :
NAME IS NULL :2007/05/14(月) 04:13:51 ID:6ju7MXtu
Webアプリケーションで使う、MySQLのテーブル設計を勉強したいのですが、 勉強に最適なサイトはありませんか? 掲示板の時はこういうテーブル構成にするとか、 そういった設計から、設計の考え方などを勉強したいのですが、 何か最適なサイトがあれば紹介していただけると嬉しいです。
>>52 亀レスだが、/home/mysql に システム管理用のデータベース mysql ディレクトリ
が無いとか、パーミッションがおかしいとかじゃないかい。
わからなければエラーログを見るが基本。
>>70 レスありがとうございます。
もうレスがないかと思ってあきらめてました。
70さんを参考にいろいろ試して見ます。
ところでみなさんMySQLのバージョンは4ですか?5ですか?
あとdatadirはどこにしてますか?
73 :
NAME IS NULL :2007/05/14(月) 23:39:02 ID:LAW+Ghic
phpとmysqlでどの程度のことができれば職場で苦労しない? たとえばショッピングカートが作れれば無問題とか。
>>73 そんなあいまいな質問をするようじゃ、職場で苦労する。
仕事は技術も必要だが、一般常識、人間関係のほうがもっと大事。
75 :
NAME IS NULL :2007/05/14(月) 23:59:56 ID:Ho+ISCuc
mysqlのdbは最大64文字までですが テーブル名は何文字までOKですか?
ポータルやるなら決済系だし、業務系なら簿記も知らないと意味が無い。
78 :
NAME IS NULL :2007/05/16(水) 06:03:26 ID:wVK6G4pR
リモートホストにmysqlコマンドで接続しようとしたらエラーが出るのですが、 原因として考えられることはありますでしょうか? $ mysql -u user1 -h hoge.localhost ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 54
>>78 原因として考えられることは、たっくさんあるな。
>>57 社員名簿でも作るの?俺ならとりあえず4桁にする
sql5.0.27 PHP5.2.1で連携しています。 すべてUTF-8で設定していますが 「−」全角のマイナスだけがなぜか?に化けてしまいます。 みなさんはいかがでしょうか? 対策等ご存知であればよろしくお願いいたします。 その他は今のところ問題ないようです。 よろしくお願いいたします。
>>82 〜 もでした。
どうしようもないんでしょか?
ujisにすれば?当面不都合はないかと。
cp932とeucjpmsを使えば解決しそうな予感。
WindowsのMySQL Command Line CLientで操作してるんですが、Shift-Jis以外の文字表示は無理なんですか?
mysqlをインストールしていたのですが、 /usr/local/mysql/bin/mysql test と入力すると ERROR 1045 (28000): Access denied for user 'ユーザ名'@'localhost' (using password: NO) と言われたので、 /usr/local/mysql/bin/mysql test -p でパスワードを入力してEnterを押したら ERROR 1045 (28000): Access denied for user 'ユーザ名'@'localhost' (using password: YES) と言われてしまいました。 解決法をいろいろと調べてみたのですが相変わらずわかりません。。。 だれかわかる人いましたらよろしくお願いします。
88 :
87 :2007/05/17(木) 21:42:45 ID:???
ちなみに OS]使用で /usr/local/mysql/bin/mysql -u root -p 上記では使用することができました。 よろしくお願いします。
>>86 character_set_results
91 :
87 :2007/05/17(木) 21:55:49 ID:???
>>90 ありがとうございます。
最初はrootのみでしか使えないということなのでしょうか?
93 :
NAME IS NULL :2007/05/17(木) 23:59:56 ID:+ucqrGEe
マックosxにインストールしたんですが、 C―APIの動的ライブラリの場所、名前を教えて頂けないでしょうか。
95 :
NAME IS NULL :2007/05/18(金) 03:25:37 ID:96NrWpJ/
selectの後ろに\Gつけると ERROR: No query specified ってなるんですけど、これどうゆう意味ですか?
>>95 クエリが無いって言ってるジャン
エイゴワーカリマスカ?
\G の前に ; をつけてるだろ。
97 :
NAME IS NULL :2007/05/18(金) 19:01:48 ID:2q7j7eIB
どちらのテーブル構造にするかでまよってます。 (1)目的 たくさんのPCのD:ドライブについて、ファイル名とそのファイルのサイズを格納する。 PC1 /a/b/c/d 100等 で、これをがんがん検索する。PC1の一覧とかPC2の/a配下の一覧とか PC 10000台くらいまで、ファイル/PC 1000ファイルくらいまで。 (2)テーブル構造案1 PC名、ファイルパス、サイズ 例:PC1, /a/b/c/d/e, 100 (3)テーブル構造案2 PC名、セグメント1.セグメント2、…、セグメント10、サイズ セグメント:ファイルパス中のセグメント 例:PC1, a, b, c, d, e, , , , , 100 質問: システム構造案2の方が検索は早いのでしょうか? #一見そんな気もするのですがよくわかりません。 格納するときも、検索するときも面倒くさいので、構造案1 にしたいのです。
>>97 ???日本の方???
"データベース 正規化" でググって勉強しる。
>>97 とりあえず 案1で、文字列index効かせればいんでないの。
ただ、フルパス限定。 c を含む物を探すとなると途端に
使い物にならんだろね。
100 :
NAME IS NULL :2007/05/19(土) 00:57:38 ID:dKYDsDbp
osx でプログラムをコンパイルしようとすると、 /usr/bin/ld: truncated or malformed archive: /usr/local/mysql-max-5.0.27-osx10.4-powerpc-64bit/lib/libmysqlclient.a (ranlib structures in table of contents extends past the end of the table of contents, can't load from it) 何ていわれて先に進みません。対処法をご存知のかたご教授願います。
101 :
NAME IS NULL :2007/05/19(土) 02:15:32 ID:g2N/Bu9q
>>99 検索は以下の形だけです。
「PC1の/a/b/配下の一覧表示」
案1でPC名とファイルパスでインデックスを作成する。
like '/a/b/c/%'で検索
案2でPC名とセグメント1,2,3,4,5,…,10でインデックスを作成する
seg1=a and seg2=b and seg3=c で検索
どっちが早いのでしょうか?
インデックスの作られ方をちょっと勉強してみましたが、案1も案2も同じようなインデックスが
出来上がるように思いました。
103 :
NAME IS NULL :2007/05/19(土) 06:00:51 ID:eFxrLNmp
explainてselectにしかつけれないの? 他の命令でインデックス使ってるか確認する時は selectに直すしかない?
selectにすればいいんでねーの。 なんでダメなん?
105 :
NAME IS NULL :2007/05/19(土) 08:35:46 ID:dKYDsDbp
>>102 英語判らんけど、ppc-g5だとコンパイルできないって事かな。
mysql3.23.58でどうあがいても文字化けしちゃうのってあります? 文字化けというより検索で他のがヒットしちゃう。 バイナリーで回避できるけど、textだと指定できないことに気づき再度悩み中。 他のサイトではバグというか日本語対応してなくて、それを回避する場合、 4.1以上にと書いてあったのですがこのとおりでしょうか? もしその場合、3.23.58からだとやっぱり今は5に切り替えるのがベストでしょうか?
>>106 mysqld 起動時の charset と格納されているデータの charset が異なるとか
>107 4以下は日本語は日本語として扱われず、完全には無理っぽくて a-zA-Z に一致するバイト列があれば強制的に変換........ という感じの記述を検索で見つけたので、 質問してみたのですが、設定がパーフェクトなら、 アップしなくてもすべてうまくいくと考えてよいということで 根本的な問題は、設定間違いと考えていいということでしょうか。
>107 すんません。 ご指摘の対応で解決できました。バージョンアップしなくてすみました。 どもでした。
110 :
NAME IS NULL :2007/05/20(日) 05:30:07 ID:2GXp1HU+
下記のテーブル名AAAがあります。担当者番号は重複しているレコードが大量にあります レコード番号(int primary key)+++ 担当者番号(int)+++取引金額(int)+++ このようなテーブルがあった場合、担当者番号ごとに取引金額が最も多いレコード番号をselectするためにはどういうSQL文になりますか?
112 :
NAME IS NULL :2007/05/20(日) 11:00:07 ID:WPBssusO
チョン?
>>110 MAX() と GROUP BY を使って、2秒で出来る初歩的SQLです。
あとは努力しましょう。
表の作成をしようと思いCREATEを使用したのですが、 ERROR 1046 (3D000): No database selected と表示されてしまいます。 原因がわからないのですが誰か教えていただけないでしょうか。
データベースを選択する時には、 use データベース名; というコマンドでいけますが、データベースの選択を解除するにはどうしたら良いでしょうか? use none; とか use; とか色々試してみましたが、無理でした。
何もデータベースを選択してない、という状態が必要なの?
quitしてもう一回接続すれば?
120 :
117 :2007/05/20(日) 23:42:05 ID:???
コマンドプロントでeditでエディタが起動するけど これってどう閉じるの?&使用用途を教えてくだされ
>>122 環境変数 $EDITOR に指定したテキストエディタが起動する
\! echo $EDITOR か system echo $EDITOR で確認
標準は vi かな?
エディタでSQLを編集して保存終了してから
デリミタ(普通はセミコロン)で実行
環境変数の指定方法とか、エディタの使い方はググる
>>123 ちょっとわかりました。
使い方ググってみます
表の作成時の指定で 011.44.134.42 や .2 などを入力するにはどの型を指定すればよいのでしょうか。
>>125 自分なら、VARCHAR(最大文字数) にするね。
俺もvarchar(15)でやってる ipをintにする関数があった気するけど視認性下がるから
みなさんありがとうございます。 こちらの勘違いで011と挿入すると表示では11になって困っていたのですが、 シングルクォーテーションで囲んでいなかっただけでした。 ご迷惑をおかけして申し訳ありませんでした。
130 :
NAME IS NULL :2007/05/22(火) 11:52:18 ID:8/PhpwlH
ストアドプロシジャのことで質問させてください。 プロシジャの中で、まず最初にselectします。結果は複数レコードになります。 この複数のレコードをプロシジャ内の変数に一度代入して、その結果セットをさらにそのプロシジャ内で条件分岐とかしたいのですが、 結果セットを代入する変数の型っていうのは何になるのでしょうか?
MySQL4.1をPHP4.3から利用してます。両方UTF-8で利用していて、ORDER BYで 並べ替えしたいのですが、日本語(ひらがな)の並びが間違って出て来ます。 降順と昇順を入れ替えると間違った並びのまま逆さになります。 同じ環境で英文字の並べ替えは問題なく動作しています。 対処法などご存知の方お願いします。
132 :
131 :2007/05/23(水) 09:54:22 ID:???
>>131 自己解決。COLUMN COLLATEをutf8_unicode_ciとしたら正常に動作しました。
134 :
NAME IS NULL :2007/05/24(木) 15:36:16 ID:rlJddH2x
二つのテーブルに共通のフィールドがあるとして、 その共通のフィールドを手がかりに、 一方しか持っていないデータを違うテーブルからセレクトして取得するにはどうすればいいんでしょうか。
>>134 join して nullを探せばどうよ。
136 :
NAME IS NULL :2007/05/25(金) 03:20:04 ID:2/gsg6oI
MySQL5.0を使っています。 区分 日付 内容 1 2007/03/01 その1 2 2007/04/05 その2 1 2007/04/06 その3 3 2007/04/26 その4 2 2007/05/09 その5 このように区分と日付をキーにしたデータの入っているテーブルから、 1 2007/04/06 その3 2 2007/05/09 その5 3 2007/04/26 その4 のように、区分ごとに最新のレコードを取得したいのですが、 どのようなクエリを書けばいいのかが分かりません。 そもそも、1回のクエリでできるものなのでしょうか? それとも、区分の回数だけループを回して、1つずつ取得しなければいけないでしょうか? どなたか教えてください・・・
>>137 SELECT *
FROM data
WHERE (kubun, hiduke) in
(SELECT MIN(kubun), MAX(hiduke) FROM data GROUP BY kubun)
order by kubun;
実行パフォーマンスは最悪なので
データ量が多い場合は、分けてループした方がいいかも。
/' ! ━━┓┃┃ -‐'―ニ二二二二ニ>ヽ、 ┃ ━━━━━━━━ ァ /,,ィ=-;;,,, , ,,_ ト-、 ) ┃ ┃┃┃ ' Y ー==j 〈,,二,゙ ! ) 。 ┛ ゝ. {、 - ,. ヾ "^ } } ゚ 。 ) ,. ‘-,,' ≦ 三 ゞ, ∧ヾ ゝ'゚ グ ≦ 三 ゚。 ゚ '=-/ ヽ゚ 。≧ ッ 三 ==- / |ヽ \-ァ, ド ≧=- 。 ! \ イレ,、 コ >三 。゚ ・ ゚ | >≦`Vヾ | ヾ ≧ 〉 ,く 。゚ /。・イハ 、、 ヒ `ミ 。 ゚ 。 ・
140 :
WebProg板から誘導されてきますた :2007/05/26(土) 12:01:44 ID:WWQOXdm+
■環境情報 海外DreamHostレンタルサーバー PHP 5.2.1 & MySQL 5 ■データベース情報 データベース名: test フィールド名: date (datetime型) という環境を使用しています。 海外サーバーのため、時差設定に苦戦しています。 SET time_zone = '+09:00'; INSERT INTO `test` ( `date` ) VALUES (NOW( )); をSQLから実行してみたところ、とりあえずSQLからは 無事日本時間がデータベースに格納されました。 しかし、これをPHPからSQL文を送って実行しようとすると、 $sql = <<<EOS SET time_zone = '+09:00'; INSERT INTO `test` ( `date` ) VALUES (NOW( )); EOS; うまく動いてくれません。。。 初心者すぎてスミマセン・・・orz
>>140 その$sql変数に、代わりに select * from test を入れてちゃうと動くんだろうね?
>>140 mysqliのmysqli_multi_query()関数を使えば動くようになる、てオチじゃないだろうね?
143 :
140 :2007/05/26(土) 15:26:11 ID:WWQOXdm+
$sql = "SET time_zone = '+09:00'"; mysql_query( $sql ); $sql = "INSERT INTO `test` ( `date` ) VALUES (NOW( ))"; mysql_query( $sql ); で動くようになりますた。 お騒がせしますたm(_ _")m
なんか効率無視だな(w
効率良いのを教えてください ><
レコードの件数を調べるのにselect count(*)を使うというのが分かったのですが、 以下のようにしたら「Resource id #3」と表示されてしまいます。 $sql="select count(*) from faq"; $result=mysql_query($sql); echo $result; どのようにすればカウント数が表示されますか?
>>146 PHPのmysql_query()の説明をよく読め
そこでperlですよ
150 :
NAME IS NULL :2007/05/29(火) 01:08:32 ID:pWsap/AA
レプリケーションのマスタが落ちた場合、スレーブをマスタに切り替えて 運用するには RESET SLAVE でスレーブ解除すれば良いの?
有料で提供するASP(アプリケーション・サービス・プロバイダ)のバッグエンドにMySQLを利用する場合、 エンタープライズで無くても大丈夫でしょうか?
そんな事を2chで聞いてるお前に問題があるな、少なくとも。
153 :
くきくき :2007/05/29(火) 23:10:32 ID:tiIImBH4
エラー内容は、error nr.1045というものです。 環境は、XP でノートンいれてあります。だけど スクリプト遮断は、はずしております。あと、ルータも かましています。特に、ポートを空けるとかしていないです。 空けなくてはいけないのかな?
TEXT型のカラムにunique制約を追加することは可能でしょうか? 以下のエラーが表示されます。 長さを固定してやらなければならないのでしょうかね? #1170 - BLOB/TEXT column 'col1' used in key specification without a key length 可能であればその方法を教えてくださいませ。
156 :
154 :2007/05/30(水) 22:24:35 ID:???
>155 ありがとうございます。 長さを指定すると作成することが可能ということが分かりました。 しかし、255バイトまでしか指定できず、 256文字以降は重複チェックがされないようです。 これは、格納されている値すべてを比較の対象にすることは不可能ということでしょうか? もし可能なのであれば、ご教授頂ければ幸いです。
>>156 はい、無理です。
その代わり、カラムをSHA1()関数にかけた値を保存し、
これをUNIQUEにするのはどうでしょうか?
バッティングは非常に少ないと思います。
158 :
154 :2007/05/31(木) 18:07:20 ID:???
>157 なるほど大変勉強になりました。 また同時にmd5はイケてない事も分かりました。 ありがとうございました! どこかで出会う事があればお酒でもご馳走したい気持ちでいっぱいです。
159 :
157 :2007/05/31(木) 18:42:04 ID:???
>>158 私が勤務する会社でSennaというソフトの開発をやっているので、
そちらを使っていただけると大変うれしいです。
TritonnというソフトでMySQLと橋渡しができます。
特定しました
Sennaってレコード数が増えると途端にパフォーマンスが落ちるよね。 キーワードによってはエンジンブローしたかと思うほど時間がかかる場合があり 井出有治にも負けそうな気配。 2nd入れても変わらず・・・で、検証で捨てた経験あり。
md5バッティングするってマジですか? md5でつこうてるんだけど どのくらいの確率でバッティングするの?
163 :
157 :2007/05/31(木) 21:38:48 ID:???
>>161 激しくスレ違いだが、たぶんメモリ不足だと思う。
あとは大きなデータベースだとパラメータ設定しないと遅い。
ま、パラメータ設定するとさらにメモリを食うわけだが…
MD5でも実用上問題ないと思う、個人的には。
>>162 バントしたらホームランになっちゃった くらいの確率
でも業務だと、常にホームランが求められるけどな。 バッティングしたから、おまいの口座データ壊れたじゃシャレに成らん。 メモリ増やせるくらいなら、mysqlじゃなくてオラクル使ってる余裕あると思うよ。 金無いから、mysqlってのはよくあるパターン。
>>162 固定長を吐き出すダイジェスト関数でバッティングしないのを作れたら
大金持ちになれそうだ。
167 :
NAME IS NULL :2007/06/01(金) 11:08:08 ID:/eOI7xda
syaryoテーブル syaryo,tantosya,seibisya tantoテーブル tantoID,name tantosya seibisya はいづれも tantoID を見てnameを出させたいです。 よろしくお願いいたします。
168 :
167 :2007/06/01(金) 11:10:31 ID:/eOI7xda
結果を syaryo | name | name ←整備者名 ↑ 担当者名 です。よろしくお願いいたします。
MySQLのみで、フィールド中の「AAA」という文字列のみを削除する…ってことはできるのでしょうか?
>>169 MySQLの文字列関数使えば余裕で出来るよ
>>168 ニホンゴワカリマスカ?
リカイニクルシミマシタガ、コンナカンジデース。
select * from syaryo s
left join tanto n1 on n1.tantoID=s.tantosya
left join tanto n2 on n2.tantoID=s.seibisya;
172 :
167 :2007/06/01(金) 16:22:32 ID:/eOI7xda
SELECT s1.syaryo,t1.name,t2.name FROM syaryo as s1,tanto as t1,tanto as t2 where s1.tantousya = t1.tID and s1.seibisya = t2.tID でいけました。 ありがとうございました。
173 :
169 :2007/06/01(金) 17:32:56 ID:???
>>170 ありがとうございます。
今までPerlとかスクリプト側で処理していたので、MySQLの関数は活用してませんでした。
REPLACEでできそうです(まんまの関数だった…)。
phpのセッションも指定しないかぎりmd5じゃん。 そんな不確かなものの上にセッションは成り立っていたのか・・・
>>174 PHPのセッションはカゲロウ山のようなものです
質問です! Fedora Core3に MySQL-server-5.0.41-0.glibc23.i386.rpm および関係パッケージ一式をインストールして、 無事に動作したのですが、何故か終了が出来ません。 /usr/bin/mysqladmin shutdown を実行すると反応が返ってこなくなり、 /usr/bin/mysqladmin status も帰ってこなくなります。 ネットで調べても類例が全くなかったのですが、 どなたか原因に心当たりがありませんでしょうか。
mysqladmin pingすら帰ってこない悪寒。
rpmで入れたのなら/etc/rc.d/init.d/ のスクリプトで起動・終了した方がいいんでない?
質問です。
レセプションの設定をし、slave startをしているのですが、どうもmasterの方で弾いてるらしく、
ちょっと詰まっています。
一応、レセプションの設定は間違いないと思うのですが、何か引っかかるところなんぞあるんでし
ょうか?
一応、/etc/serviceでポート開放し、ファイヤーウォールの設定でもポート開放をしています。
エラーメッセージは、
Slave I/O thread: error connecting to master '
[email protected] :3306':
Error: 'Host 'XXX.XXX.XXX.XXX' is not allowed to connect to this MySQL server'
errno: 1130 retry-time: 60 retries: 86400
と出ていて、masterのMySQLの方の問題だと思うのですが。
レプリケーションだった orz
>>179 スレーブ側のmysqlクライアントでユーザreplを指定して
マスタ側のMySQLサーバにログイン出来てる?
RESありがとうございます。 まだやってませんでした。 GRANTで一度リモートログインの設定をした方が良いですよね? 今の権限はレプリケーションのみなので。
自己解決しました。 結局、GRANTで管理者権限を渡し、コネクト出来るようになりました。 ただ、これだとLocal上で使うものとは言え、ちょっとザルっぽいので、GRANTで権限をある程度 絞ろうかと思います。 ではでは
INSERT時にある値があればそれを、無ければauto_incrementされたNoと 同じ値を入れたいカラムがあるんですが、INSERTと同時にauto_incrementされた数値を指定するような定数等ってあるのでしょうか? 今のところ、INSERTした後にUPDATEして書き換えています。 col1|col2 1|値 又は 1
>>184 > 次の AUTO_INCREMENT 値は、オートキーに使用された最高値に 1 を加えた値になる。
とい特性を信じてサブクエリで更新することは出来そうだが、サブクエリを使うぐらい
なら、updateした方が良いかも。
>>184 たぶんテーブル構造を見直した方がいいと思われるけど、
いまのままならアップデートしかないんでないの。
189 :
184 :2007/06/06(水) 12:04:56 ID:???
有難う御座います。 やり方を変えれば、SELECTする際にIFでNoかこのカラムを取ってくるようにする事は出来るのですが 基本的に更新は殆ど無く、参照が大量のためこのような感じにしました。 今のUPDATEで進めて見ます。
190 :
NAME IS NULL :2007/06/06(水) 14:22:13 ID:IsGwhVyT
質問です。 ソートした母集団にナンバリングするためには どうしたら良いでしょうか? 100件中、自分が何番目なのかを確認したいです。 set @temp := 0; SELECT @temp := @temp + 1 from ... ではなく、1SQLで完結できる方法を検討したいです。 できればテーブルにインサートする方法も使いたくありません。 同着10位が3人居ても、全員10位にする方法であれば 実装できましたが 同着10位には、それぞれ10、11、12とナンバリングしたいです。
>>190 変数使ってもいいなら、こういう方法があるらしいよ。
select @rank:=@rank+1 rank, t1.*
from (select * from table1 order by col1) t1,
(select @rank:=0) t2;
192 :
191 :2007/06/06(水) 15:49:09 ID:???
あ、where句で抜き出すならもう少しだけ工夫が要るか
MySQL Custerの事で聞きたいんですが、基本的にClusterの利点は負荷分散とリカバリー時の即効性 と言うことでしょうか? 例えば、DB自体の容量肥大化に関する利点というものはClusterではまかなえないのでしょうか?
194 :
190 :2007/06/06(水) 20:25:01 ID:IsGwhVyT
>191 ありがとございます。
64bitにすれば理論値は十分でしょ。 あとはメモリ積めるハードを選べばおk。
197 :
NAME IS NULL :2007/06/07(木) 23:41:41 ID:7GQ86/Vg
板違いでしたらご指摘下さい。 VS2003を使って接続しようとすると Host 'PC-hoge' is not allowed to connect to this MySQL server とエラーが出ます。 MySQLは別PCですが、単に接続しようとしたPCが拒否されたと思っていますが、なぜ拒否されたのか判りません。 サーバーへの接続はIPアドレスで指定し、ユーザーは「root」パスワードはコマンドラインに最初に入力するパスワードを入れています。 根本から間違えているのでしょうか?
199 :
NAME IS NULL :2007/06/08(金) 14:07:27 ID:BCjwMJBL
こんにちは。おそらく度素人の質問だと思うのですがお許しください。 検索してもどこにも見当たらないので・・・・・ フィールドにつくフラグでnotnullはnullを許さない。autoincは自動で数字を増やしてく、ってことはわかったのですが、それ以外のunsignedとzerofillの意味がわかりません。ご教授いただけないでしょうか?
符号を保存せずに値の範囲を変えたり隙間をゼロで埋めたりっつー話じゃないの?
201 :
NAME IS NULL :2007/06/08(金) 15:25:45 ID:BCjwMJBL
>>200 すみません、それの意味することを教えていただけないでしょうか
>>201 unsignedは符号ビットが必要なくなり、数値に1ビット多く使える。
ビット表現の勉強の必要がありますね。
203 :
NAME IS NULL :2007/06/08(金) 23:05:19 ID:BCjwMJBL
>>202 signedにすると-まで使えちゃうってことですかね?
204 :
NAME IS NULL :2007/06/08(金) 23:06:43 ID:BCjwMJBL
わかりました^^ ゼロでまえをうめちゃうって事ですね!!! すっきり!!!! ありがとうございました!!!!
null値を置き換えたいのですが、どのようにすれば出来るでしょうか? データベースの中身はnullのままでいいのですが、 出力するときに別のものに置き換えたいのです。例えばハイフンなどに。 どなたかご教授お願いします。
206 :
NAME IS NULL :2007/06/09(土) 15:42:04 ID:cEEGpgqw
>>205 ifnull, isnull, coalesce たんまり判定法はある。
そんなことより、興味があるのは、こういう人の行動パターン。
googleで「mysql null」で検索結果。
検索1件目から、ページ検索(ctrl-F)で「null」を実施。
5件目でズバリが出てきた。
今回のこの人は、最大の努力で、4件目から先は調べなかったことになる。
とりあえず、ググッたかどうか教えておくれ。
208 :
205 :2007/06/09(土) 19:12:11 ID:???
>>206 , 207
昨日からグーグルで検索しまくっていますが、全然わからないのです。
nullを判定するのに isnull を使うことはわかっていたのですが、
それをどうやって置き換えるのかわからなかったのです。
質問の仕方がちょっと間違っていたようでした。
select * is null = '-'
from table
こんな感じでしょうか・・・わからないので助けてください。
>>208 SQLのお勉強をもうちょっとちゃんとやりましょう。
そのSQL、文法的に間違ってるでしょうが。
210 :
205 :2007/06/09(土) 19:18:44 ID:???
>>209 手元にmaysqlの本が一冊あります。
しかしどうしてもわからないのです。
勉強するにも期限は明日、仕事で必要なためどうしても解法が欲しいのです。
助けるとおもってお情けをお願いします。
>>210 自分の仕事を他人に丸投げですか・・・
あきれて物が言えない
select * is null = '-' うむ。これを見たら気の毒になってきた。 ひょっとして、ネタか。 つーか、ifnull使えと答えを書いてくれている。 isnullより、ifnull、coalesceを使え。
「SELECT datetime FROM test_;」 のようなSQL文を発行すると、「2007-06-09 21:59:20」 のようなデータが返って来ます。 これを、「2007/06/09 21:59:20」 のような形式にしたいのですが、良い方法は無いでしょうか? 教えていただけると幸いです。
初歩的な質問で申し訳ありません。 氏名_c | 体重_c | ------+-------+ 山田 | 50 | 田中 | 30 | 鈴木 | 45 | こんな表 (体重_t) があったとします。 一番重い体重を探したい時には、 SELECT MAX(体重_c) FROM 体重_t; でいけますが、 一番体重が重い人の氏名 (この場合 "山田") を求めたい場合には、 どういうSQL文を発行すればいいんでしょうか?
217 :
213 :2007/06/09(土) 22:38:10 ID:???
>>214 ありがとうございます。
SELECT DATE_FORMAT(datetime_c, '%Y/%m/%d %H:%i:%S') as datetime FROM table_t; でいけました。
218 :
NAME IS NULL :2007/06/09(土) 23:06:02 ID:vL4ozbLP
MySQL + PHP で掲示板を作っているのですが、分からないことがあります。 MySQLのSQL文中にPHPの変数を入れたいです。 こんなカンジ↓ $sql = "select count(*) from post2 where tid=".$row["id"]; これで実行してみるとResource id #4 Resource id #5 Resource id #6... といった結果が得られて思うような結果(掲示板のレス数)が得られません。 どのようにすればいいか教えてください。お願いします。
220 :
218 :2007/06/10(日) 00:22:42 ID:???
次のようなSQL文があるとします。 SELECT ( SELECT COUNT(name_c) FROM foo_t; ) as name_c, ( SELECT COUNT(message_c) FROM foo_t; ) as message_c FROM hoge_t 【質問1】 このようにカラム名の部分に SELECT 文をいれる方法のことを何と呼ぶのでしょうか? (副問い合わせ?) 【質問2】 SELECT 文の中の SELECT 文の部分が2つありますが、両方とも同じテーブル foo_t を参照しています。 これだと効率悪いので、これをまとめて書くことはできないでしょうか? 例えば、 SELECT ( SELECT COUNT(name_c), COUNT(message_c) FROM foo_t; ) as name_c, as message_c FROM hoge_t みたいに書きたいのですが、エラーになってしまいます。
>215 体重でorder byして1件目とかどう?
>>221 SELECT COUNT(name_c), COUNT(message_c) FROM foo_t;
じゃ、だめなの?
221のSQLは、hoge_tのレコード数 × 2つの数字を出力させるだけの意味なしSQL。
というか、へんなところにセミコロンがあるんでSQLですらない。
本での勉強や掲示板への質問も良いけど、自分でコマンド打たんと。
224 :
221 :2007/06/10(日) 15:27:27 ID:???
>>223 回答ありがとうございます。
実際に使う時には、hoge_t の 5〜6個からデータを抜き出したいので、
"FROM hoge_t" の部分が必要だったんです。
もうちょっと色々試して勉強してみます。
ありがとうございました。
すみません、nullを別なモノに置き換えて出力したいのですが、 次のようにやってもうまくいきません。 select coalesce(*, 0) from table; *が、ひとつの列ならうまくいくのですが、すべてを対象とした*だとエラーになります。 どうやればうまくいくのでしょうか?
MySql初めていじったんだが insert文で複数レコード挿入できんのかよ? 気持ちわるい・・ insert into table values(), (), ()・・・
>>225 都合よく考えないで、coalesceとは何か?というのを調べて。
調べてMySQLの仕組みに沿ったSQLを作ってください。
なぜここの連中は解法をひとつ教えれば済むことに 一々難癖をつけて答えないのか? 一度答えを教えてくれさえすればすぐに質問者は消えるし、みんなにとって有意義であることは間違いない。 文句だけ言って何も答えない輩は立ち去って欲しい。
>>226 気持ちよくなる前に抜けた方がよい。
漏れは既に抜け出せん。
insert & selectを union allして繋げるなんて嫌だ。
>>226 バルクインサート、サポートされてなかった?
>>228 なんで人の仕事の解法を手取り足取り丁寧に教えてやらなきゃならないんだ。
上のレスをちゃんと見返せば解法のヒントが書いてあるというのに。
それを読もうともせずに、「とっとと答えだけ教えろよ」的な
ことを無遠慮に言う奴こそ立ち去って欲しい。
結局、辞書代わりなのさ。俺らは。訊かれたら答えてりゃ良いんだよ。 どうせ、質問に答えて虚栄心を満たしたいだけなんだろう。 神!とか言われたいんだろう。俺らは。 Oracleは知らないんだろ? ちゃいまっせ。 せっせ。
>>228 教えてるジャン。親切に。 つーか、質問するときは
あらかじめ自分で答えを考えておいて YesかNoで
答えられるようにするか、 ヒントだけもらえるように
工夫するか のどっちかなんだよ。
答えがわかっていればそのままズバリ言えば済む問題 わかっていても言わないのは色々なものが小さい 1.人間的に小さい 2.器量が小さい 3.声が小さい 4.ティムポが小さい 5.視野も小さい ほかなんかある?
>>234 簡単に答えだけを教えてあげるような人は
相手を思いやる心、成長を願う心 が小さいかな。
ちょっとしたきっかけを与えるに留めるのが
人間的に一番大きい人
googleで最初の数ページに答が出てくるような それでいて それだけでは決して全ての解答にはならない そんなレスが一番もらって嬉しいし楽しい
俺の場合、その日の気分で ヒントを教える時とぐぐれかすを使い分けてる。
俺の場合、聞かれてもないのに教えまくる
小銭をくれよ、という見知らぬ人に会った気分。
で、断ったら捨て台詞を言われたときの気分。
>>234
>>239 わかる気がする。
小銭を持っていればそのままズバリ渡せば済む問題
持っていても渡さないのは色々なものが小さい
1.人間的に小さい
2.器量が小さい
3.声が小さい
4.ティムポが小さい
5.視野も小さい
ほかなんかある?
きっと
>>234 は街中で寄付しまくりなんだろうな。
盛り上がってる、 と思ったら、これかい。
「よお、おっさんちょっと小銭恵んでくんね?」 「いや、ちょっと持ち合わせが無い。金ならそこでバイトを募集している。働けば小銭くらいにはなるぞ。」 「そんなタリーことやってられるかよ。なんだよ。このケチ、貧乏人。死んじまえ!」 まあ、こんなところか?
そのおっさんが、この後オヤジ狩りに合おうとは!
>>244 そのおっさんが空手の有段者だったとは!・・・・ってつまらん。
ところであるところにMySQLは5000万件でも大丈夫って書いてあったけど、
そんな実績あるのかいな?
>>225 coalesceでnullになり得るカラムを1つずつ設定するのが正解だが、coalesceは
スペルが難しいし(関係ない)カラムの初期値を設定して既存のnullを更新しちゃうとか、
caseを使うとかはどうか?
> update config set value='aa' where key='XXXXXXXXXX'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key='XXXXXXXXXX'' at line 1 これってMySQLのバグですか? mysql> desc config; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | key | varchar(255) | NO | PRI | | | | value | text | NO | | | | | description | varchar(255) | NO | | | | +-------------+--------------+------+-----+---------+-------+ OS: Fedora Core MySQL: 5.0.37-log Source distribution Java: 1.5.0_11 Tomcat: 5.5.23
249 :
248 :2007/06/11(月) 19:36:00 ID:???
ひとまず代替案できりぬけました。 key= を CONVERT( `config`.`key` USING utf8 ) = とすれば大丈夫でした。 なぜだかわかりませんが、hibernateを使っているのでどうにもならないんでSQLで実行するようにしました。 ありがとうございました。
単に key を `key` と書けば良くね?
>>250 俺も思った
単にkeyが予約語なだけじゃないのかね?
252 :
NAME IS NULL :2007/06/12(火) 21:20:58 ID:gRZ6KvS4
質問スレが見当たらないので、こちらに書かせて頂きます。 間違えて、テーブルをdropしてしまったのですが、 ib_logfile0、ib_logfile1、ibdata1等から、 テーブルを復旧する方法があれば、ご教授頂けないでしょうか? 宜しくお願いします。
MySQL 5.0.41 Tomcat5.5.23 Connector/J 3.0.6 上記の環境なのですが、TomcatでInitialContextからlookupすると下記のエラーが発生します。 Server connection failure during transaction. Attemtped reconnect 3 times. Giving up. 別のマシンに同環境・同設定で問題無く接続とDB操作ができるのですが、 サーバマシンでは何故か上記のエラーが出てしまいます。 どなたか回避策をご存知ではないでしょうか?
_-─_- 、 // ___vヘ / i' '´ i i i V' ヘ-‐勹 `ヽ | i/i l l l v小 ̄ `ヽ ' | i! l l _L -≦ i! |_ハ 'ようわからんのぅ 仁二| l斗‐< == j从 }}__ わからぬことだらけじゃ !| lヘ z≠ ムィ'7⌒丶、 . j从乂ヽ _ /| | | `丶、 / r<  ̄|\__'´_ ィ | | |_ 〉 / l/ \| | ー_ 二「`|只  ̄〉 / / / , 「`| ̄ | ト、 ヽ. / , ′ . / / /-| ト、 | |'^ヽ ∨ / __ / / /丶| l \_,ニ-‐'j乂 V 'ー¬二 ̄ / ̄ . / / / 从ハ、 \ / / / _ 二7 / / / /\ \ / 〈 \/ ̄ _/
256 :
252 :2007/06/13(水) 09:22:32 ID:???
>>255 ありがとうございます。
「〜-bin.xxxxx」と言う形のバイナリログは作っておらず、
mysqlbinlogでは不可能でした…
>>252 データディレクトリにあった "テーブル名.*" を削除ファイルを復活させるソフト
とかで救い出すしかないな。
削除後、ファイルに書き込みが続くと削除領域が食いつぶされて復活できない
ケースが多いが。
259 :
257 :2007/06/13(水) 12:08:26 ID:???
>>257 ありがとうございます。
復元ソフトの体験版を使用して試してみようと思います。
260 :
252 :2007/06/13(水) 12:16:21 ID:???
すみません、名前間違いました。 252です。
261 :
252 :2007/06/13(水) 13:08:25 ID:???
試しに、InnoDBでテーブルを作成、 テーブル名.frmをコピーし、テーブルをdrop、 その後コピーしたfrmファイルを戻し、 select文を実行したところ、 ibdファイルが開けないと言われました。 frmのコピーを行った際には、 ibdファイルは存在しなかったのですが… どうすれば正常に元に戻るのでしょうか?
>>261 そりゃ、innodb_file_per_tableがOFFになってるから。
>>261 つか、frmとibdだけじゃ、むりだろ。大元のibdataのバックアップ戻しが必要。
264 :
248 :2007/06/13(水) 16:33:31 ID:???
>>250 >>251 確かにその通りでした。
設定ファイルにカラム名を`key`として偽装すれば対応できました。
<id name="key" column="`key`" type="string" >
ありがとうございました。
select `hoge` FROM `hoge_tbl`; この時、`hoge`の値が 「あ」 じゃないときは 「ほげ」を返して欲しいのですがどのようにすればいいでしょうか?
>>265 select `hoge` FROM `hoge_tbl` where ○○○○;
○○○○のところは自分で考えてね。
2次元のテーブルの要素を1セルずつ持っているテーブルがあります。 構造は、id int, col int, value int; の3つのカラムを持っています。 idは行番号、colは列番号で、valueには、その行・列の値が入っています。 このテーブルから、 id, value0, value1, value2, ... , valueN (Nはcolの最大値) というように、 2次元のテーブルを素早く得たいときの定石があれば、教えていただけませんか? Nの値を類推して、多重に join をするぐらいしか思いつきませんので、 えらい人おしえてください。
268 :
253 :2007/06/14(木) 01:06:47 ID:???
FW関係を見ても問題無さそうだったので、Connectorのバージョンを上げさせてもらいました。 Connector/J 3.0.17にしたら問題無く接続できました。 同環境別PCだと駄目な理由が分かりませんが、とりあえず回避できたのでこれで良しとします。 スレ汚し申し訳ありませんでした。
>>267 >2次元のテーブルを素早く得たいと
1,A,B,C
2,E,F,G
3,H,I,J
つー並びで表示したいってこと?
手法によってはバージョン縛りあり。
>>265 select if(hoge='あ',hoge,'ほげ') from hoge_tbl;
>>269 はい、
id, col, value
1, 1, 10
1, 2, 20
1, 4, 30
2, 2, 40
というデータから
id, value1, value2, value3, value4
1, 10, 20, null, 30
2, null, 40, null, null
というテーブルを得たいんです。
( 歯抜けの部分は null でも 0 でも良いです。 )
バージョンは、MySQL 5.0.22 を使っていますが、
もっと新しい物に良い手法があるなら、変えても良いです。
>>271 nullありなら、言う通りで結合しなきゃむり。
無いものはselectできない。
存在するデータだけでよいならgroup_concatで括る。
>歯抜けの部分は null でも 0 でも良いです。
なら、自分でデータを補完する仕組みを作る。
もしくは呼び出しアプリ側で補完。
>>272 かなり希望に近いです。
なんとか歯抜けを処理できないかな。
昨日5.1の英語マニュアルを読んでいたら、
5.1の日本語マニュアルがまだ完全ではないものの公開されていました。
これまで 4.1 しか日本語になってなかったので、これはうれしいですね。
274 :
NAME IS NULL :2007/06/14(木) 12:05:02 ID:SdR9kA2a
>>272 select id,GROUP_CONCAT(CONCAT(col,':',value) ORDER BY col) from table group by id;
こんなかんじでデータを取得した後、クライアントで分解すれば、なんとかなりますね。
ありがとうございました。
>>274 一応解決っぽいんですけど、GROUP_CONCAT でなく、
create table <name> as select 〜〜〜
って形で2次元tableを作る方法があれば、引き続きお願いします。
で、2次元テーブルにしないといけないわけ? どうせアプリで取り込んでから、その様な処理や 表示するわけでしょ? 別に1次元縦並びで、idでソートしてすりゃいいじゃん。
277 :
NAME IS NULL :2007/06/14(木) 14:12:35 ID:SdR9kA2a
>>276 もちろんそれでもいいのですが、SQL内で view を定義できたりすると、
より便利なので、できるとうれしいです。
そういう技があれば知っておきたいですし。
もちろん、group_concat でも表示などには困らないし、とても感謝しています。
>>275 結局、selectするんだから、nullを入れなければならんしょ。
select id,max(c1),max(c2),max(c3),max(c4) from
(select id,if(col=1,val,null)c1,if(col=2,val,null)c2,if(col=3,val,null)c3,if(col=4,val,null)c4 from t)t
group by id;
けどさ。
むりくり、SQLでやるより、アプリ側でやったほうが絶対的にはやい。
上記のSQL(ひどいけど)をexplainしてみたら、ひっくりかえる。
所詮DBは入れ物なんだから、出し入れが速ければよいと思う。
>>278 >でもさ
他の人が指摘してたね。
知識と実践は異なるから、理解できる。
スマソ。
280 :
269 :2007/06/14(木) 15:51:57 ID:???
>>278 はい、今の実装では必要はないのですが、
こういう要求は結構多いので、なにか定石的な技があれば知りたいな、とおもったわけです。
あと、何度が sageるの忘れてました。すみません。
答えだけ求める香具師は有料サポートでも使えばいいじゃん。 無料で訊いてるくせに、答える内容の文句言うな。
>>280 技とかそんなのからいきなり入ったって…。
これはそもそもが、そんな表を念頭に置いてないテーブルを
無理矢理そうした所で、スピードも遅いし技術的に意味もない。
やりたいのであれば、テーブル設計から全て変更して、
SQL時点で負荷をかけない様にするべき。
結構上司が帳票を出せ、とか言ってくるんじゃないの? 不得手な人はデータベース≒エクセルのセルみたく考えているから、こういう要求も実は多い。 そういう職場に居る不幸な人をあんまり責めるんぢゃないよw 特に280は、マニュアルも読んでいるみたいだし、頭空っぽ宿題おせーて君とは違うっぽ。
むしろ、そういう要求をうまく処理するのがDBで飯食ってるプロの腕の見せ所だと思うが。 出来ませんって言うだけなら、素人でも出来るよ。 表作りながら、こういう要求来そうだなとイメージできないとプロとは言えないよ。 mysqlはオープンソースだから、力技でソースに機能追加も出来る訳だし。
API側で最適化するような奴にDB屋さんを自称して欲くないね。
俺は272,278,279のヒドイSQLを書いた者ですけど。 285,286なら、今回の271,275の疑問をどのようなSQLを書いて解消しますか?
見せてもらおうか、プロな腕の表作りとやらを
APIというより、mysqld内部な。ヲレSQLにして組み込んでもいい訳だし。 create2dとかつくればよろし。
で、「API側で最適化するような奴」って何?
291 :
NAME IS NULL :2007/06/17(日) 11:25:00 ID:7X42UV05
いろいろとググってみたのですが、見つからなかったので質問します。
WHERE節で「@(アットマーク)」を使用したいのですが、どのようにしたらいいのでしょうか?
具体的には、テーブルからメールアドレスが該当するデータを抽出したいのです。
SELECT * FROM テーブル名 WHERE email = '
[email protected] '
のようなSQL文で試したのですが、どうも「@」が入っていると上手く抽出できないようです。
基本的なことなのかも知れませんが、「@」や「アットマーク」で検索しても、求める情報にめぐり合えませんでした。orz
よろしくお願いします。
>>291 当方普通に結果を選択できますが
WindowsXP + MySQL5.0.37
select * from テーブル名
を行った結果、本当にemailフィールドに文字列 「
[email protected] 」が入ってる?
>>292 お返事ありがとうございます。
きちんと入っているのですが、抽出できませんでした。
XSASを使ってローカルで試したのですが、環境は
WindowsXP
Apache updated to 2.0.54;
MySQL updated to 4.0.26;
PHP updated to 4.3.11;
です。
使用するサーバで試したところ、無事に抽出できましたので、とりあえずは解決というか、何と言うか。
phpmyadminでrootユーザーでのログインを禁止したいのですが そのような設定は可能でしょうか?
>>294 君の質問文よか、検索ワードの方が短い。
「phpmyadmin rootユーザー ログイン 禁止」
さあ、ググレ。
mysqlヴァージョン5でストアードプロシージャ一覧を見る方法 を教えてください
>>296 そういうのはmysqlデータベースの表に格納されている。
select type,name from mysql.proc;
ありがとうごさいます↑
>>298 SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
こちらの方が一般的らしい。
>>287 私の何気ない書き込みが波紋を広げてしまいました。 m(_ _)m
2chらしい精神論もいいのですが、私も具体的なテクニックが聞きたかったです。
(emacsスレみたいな雰囲気になるとイイですね。)
仕事でさわり始めたSQLですが、少し慣れてくるととても奥が深いですね。
プロのみなさんには当たり前のことかもしれませんが、
クエリやキーなどのちょっとした工夫で性能が劇的に上がったり、
フロントエンドの大幅な省力化が出来たりと、感動の連続です。
>>301 group_concat 作戦を使いました。
仕事の合間にいろいろ調べてますが、今のところこれ以上のTIPSは見つかりませんねー。
全然関係ないけど、MySQL 5.1 の partitioning がなかなかおもしろそう。
はやく5.1の安定リリースがでないかな。
>>302 278だが、俺の書いたNULLを入れられるSQLの方はどう?
まとめたやつ。
select id,
max(if(col=1,val,null))c1,
max(if(col=2,val,null))c2,
max(if(col=3,val,null))c3,
max(if(col=4,val,null))c4
from t group by id;
こいつをcreate and select
mysql> create temporary table temp_t
-> as
-> select id,
-> max(if(col=1,val,null))c1,
-> max(if(col=2,val,null))c2,
-> max(if(col=3,val,null))c3,
-> max(if(col=4,val,null))c4
-> from t group by id;
Query OK, 2 rows affected (0.16 sec)
レコード数: 2 重複数: 0 Warnings: 0
mysql> select * from temp_t;
+------+------+------+------+------+
| id | c1 | c2 | c3 | c4 |
+------+------+------+------+------+
| 1 | 10 | 20 | NULL | 30 |
| 2 | NULL | 40 | NULL | NULL |
+------+------+------+------+------+
2 rows in set (0.00 sec)
でた!テンポラリ攻撃!
>>304 めんどくせぇな。
275の質問があって、303があるんだよ。
temporaryにしたのは、俺がdropコマンド打たなくてもすむだろ。
drop table temp_t;
ココで書いちまったじゃねぇか。
bind-address 設定するのって常識か?
307 :
302 :2007/06/20(水) 00:48:36 ID:???
>>303 colの最大値を知った上でクエリを作らないといけないけど、
出力形式は理想の形です!
数十万しかデータがないので、呼び出しもそれほどかかりませんし。
次の設計の時は提案してみようかな。
( えらい同僚に怒られるかもしれないけど、そんなの平気! )
見える、見えるぞ! 1ヶ月後、その同僚がここでそのやりかたを質問しているレスが!
偉いのに同僚? 同僚が変な表を作って困っています。どうやって辞めさせればいいでしょうか? 負荷がかかるから辞めろと採算逝っても訊いてくれません。orz って感じ?
>>303 sum(if(col=0,value,0))
にすると、null じゃなく 0 で埋められますね。
なかなかイイ!
>>310 最初の用件
>>271 がNULLを埋めたい、つーことだった。でnull。
俺の考えじゃないよ。
MySQLのコマンドラインクライアントからなら問題無くUPDATEできるのですが、 TOMCAT5.5とコネクタ5を使ってUPDATEしようとしてもUPDATEされません。 SELECTは出来ているのですが、、、 何か設定とか必要でしょうか?
313 :
312 :2007/06/20(水) 22:35:34 ID:???
すいません、解決しましたorz 誰かがcontext.xmlにdefaultAutoCommitをfalseにしてました。。。 スレ汚し失礼しました。
使わなくなったカラムは削除するべきですか? それとも使わなくなったものは削除フラグだけたてとくべきですか? データ削除した時に番号に穴があくのが気になります。
復元する必要が無ければ削除
>>314 質問1: カラムとロウ、列と行を言い(書き)間違えてない?
質問2: 番号に穴があくとなんか不都合でもあるの?
317 :
NAME IS NULL :2007/06/21(木) 13:58:28 ID:/r3UPCk3
レプリケーションに関して質問です。 1. データディレクトリごとバックアップ 2. マスタから特定のテーブルをtruncate 3. バックアップからリストア(データディレクトリにバックアップを上書き) この状態だとマスタは正常にリストアされますが、スレーブ側で truncateしたテーブルがないとエラーが出ます マスタ側でtruncateしたテーブルをdropして再作成すると直るんですが、 良いリストア方法はないでしょうか? データ量が多いので、hotcopyやmysqldumpは使えないです。
reset slaveだと全体のリカバリになってしまいますよね。 他にやるとしたらやはりbinlogから手動復旧しかないのでしょうか。
>>317 3の後、スレーブ側でのリストアを行わないのは何故でしょうか?
ちなみにバージョンと下記パラメータ設定値を教えてください。
innodb_support_xa
sync_binlog
innodb_safe_binlog
321 :
NAME IS NULL :2007/06/21(木) 17:10:06 ID:yai2bY76
質問です。 商品のマスタテーブル id name 1 大根 2 人参 3 豆腐 と 商品に関するキーワードテーブル(それぞれのレコード数は非固定) id keyword 1 野菜 1 国産 2 外国産 3 特価 3 国産大豆使用 3 健康 があり、ユーザがWEBサイトにて半角スペース区切りで入力した複数のキーワードに and検索で完全一致した結果を表示したいのですが、上手いSQLが思いつかず悩んでいます。 皆さんならどうされますか?
>>321 条件数分のサブクエリでも連鎖させときなさい
ヒット数と入力キーワードの総数を比較するとかどうかしら?
324 :
NAME IS NULL :2007/06/21(木) 17:45:44 ID:yai2bY76
>>322 絞り込んで、絞り込んで、という感じですね。
参考になります。
>>323 なるほど、or検索でヒットしたレコードをgroup by idにしてcount(id)すると。
SQLがシンプルでよさげです。
さっそく試してみます。ありがとうございました。
325 :
317 :2007/06/21(木) 18:09:59 ID:???
>320 すいません抜けてましたが、3の後にスレーブで「テーブルがないよ」的な エラーがでるので、skip_counter+1してます。 バージョンは4.1(myisam)なので下記パラメータのみ設定してます。 sync_binlog = 0 #速度優先なので やりたいことは、1テーブルのみデータ更新に失敗した場合、迅速に リストアする方法が知りたいです。(スレーブ側も同期を取りたい)
slave側にもマスタの全データを入れて CHANGE MASTER TO から設定して やんないと出来なくないか。
そして何よりも 速さが足りない
萌えすきゅーえる
phpMyAdmin と GUI Tools両方ともインスコしてみたんだけどさ、 MyAdminの方がいいとこってなに? ブラウザで使えるってことだけ?
GUI ToolsはWin限定じゃん。
>>330 phpMyAdminとQueryBrowser(以下QB)の比較ってこと?
phpMyAdminの方が表定義など変更がちょっとだけ楽だな。
例えば、フィールドタイプなどを変更するときに、Typeのリストが出るので選ぶことができる。
一方、QBの方はリストは出ない。
QBは、日本語表示に弱い。
SQLに日本語は表示することはできるけど、なんか見づらい。
経験則だけど、日本語あり(カラム名でない)のSQLを書いていると突然落ちたりする。
それは、一回や二回でない。
phpの方があまり日本語で困ったことはないかな。
セマフォって何ですか?
おまえのかぁちゃんセーマーフォー
PerlかPythonかRubyか、PHP以外で書かれたphpMyAdminみたいなのありますか?
クライアントが Windows でサーバが Debian だと コネクション貼るだけだったりクエリを叩くだけで数秒かかります (クエリの実行時間は数ミリ秒で完了) サーバを Windows にすると即応答が返ってきます Debian で動作している SSH 等の接続の応答は問題なしです 同じ現象の方っています? Windows - Query Browser 1.2.12 Debian - MySqlServer 5.0.32 Windows - MySqlServer 5.0.41
337 :
NAME IS NULL :2007/06/25(月) 09:34:03 ID:Zjd7F7GG
質問です。 1件の得意先情報を抽出するために得意先テーブルと 9つのテーブルと結合する必要があります。 PHPでプログラムを書いています。 1、left join等を使用し9つのテーブルを結合し一つのsql文で結果を得る方法 2、まず、得意先テーブルの値を抽出し、その結果を元に他の9つのsql文にて他テーブルの値を得る方法 のどちらがパフォーマンス的にいいでしょうか? よろしくお願いいたします。
338 :
NAME IS NULL :2007/06/25(月) 12:25:45 ID:+ngh1xNX
再起動の方法について教えてください。 Redhat使っているんですが。 /etc/rc.d/init.d/ にmysqlがないんです。 こういう場合はどこから再起動かけるんでしょうか?あとなぜ無いんでしょうか? お分かりできるかたお願いいたします。
339 :
NAME IS NULL :2007/06/25(月) 12:53:22 ID:+ngh1xNX
XAMPP Liteを使ってみたところ、innoDBがデフォルトでは使用できないようになっているのですが、 これにはどういう理由が考えられるのでしょうか? また、innoDBでテーブルを作成したところ、 その後、テーブルにカラムを追加等の処理に数十秒時間がかかったりするのですが、 それはフラッシュメモリへのアクセス速度等が理由となるのでしょうか? どなたかご存知の方教えてください。
質問ばっかだけど。 回答うけとって、どうだったとか、 自己解決でも解決したら、自分はこう解決したみたいなやつ、書いてくれよ。 こんなスレで、回答する気にならんよな。
342 :
NAME IS NULL :2007/06/25(月) 15:47:04 ID:DgJUlJQr
MySQL、4.1以降日本語の自動変換処理による文字化け問題あり、それを日本国内向け
にソース手入れしたMoSQL(萌えSQLと呼ぶ)を発表、ダウンロード開始。
http://MoSQL.jp/
>>335 MySQL GUI管理ツール でググレ。
>>336 F/Wかも iptablesを止めてみたら。
MoSQL スレまだー?
>>336 DNSかも。mysqld に --skip-name-resolve つけてみては?
347 :
336 :2007/06/25(月) 22:57:58 ID:???
>>346 ビンゴでした。
IPアドレス直で接続してるのに/(^o^)\
解決しました。ありがとうございました。
>>344 さんもありがとうございました。
>>347 ___
/ ̄ /\
/ - /,- |
|( (■) ll (◎ )
(6 、_,/ , ヽ |
| /ヽ(__(_ノ)、ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|, ( 'ー─一ノ|< 逆引きしたんだよ ホスト名を・・・
\λ_ ⌒ ,ノ \______________
INSERTの際、(`number`値のMAX+1)を入れたいのですが一クエリで実行可能でしょうか? `number`はユーザー毎のユニーク数字のためauto_incrementにはできません。 一応、テーブルも書いておきます。 CREATE TABLE `hoge_tbl` ( `auto_seq` int(11) unsigned NOT NULL auto_increment, `user_seq` int(11) unsigned NOT NULL, `msg` text, `number` tinyint(4) unsigned NOT NULL, PRIMARY KEY (`auto_seq`), INDEX (`user_seq`), INDEX (`number`) ) TYPE=MyISAM DEFAULT CHARSET=ujis;
サブクエリを使えば可能です。
> `number`はユーザー毎のユニーク数字のためauto_incrementにはできません。 ?どうして auto_increment を使えないの?
>>350 `auto_seq`と`number`の違いが激しく謎。
>>352 そうだよな。auto_increment使えばいいじゃん。
unique indexでも問題ないよ。
なんか問題があるなら、おせーて。
エスパーするとuser_seq毎にnumberを振りたいんジャマイカ? つかuser_seqをPRIMARYにできるんじゃね?
すみません、質問です mixiみたいな会員数不特定のブログサービスがあったとして、 ああいうサービスの日記のログ管理DBってどうなってるんですか トラックバックのないコメント機能だけの日記だと、 全会員のログを一つのnikkiTABLEで管理してるんでしょうか? nikkiTABLEのフィールドの内訳は以下のみたいな感じでしょうか? userID kijiID p_kijiID(コメント用) title content(text) date 書いてみてこれじゃ返信機能つき掲示板と変わらないって思いましたが、 自分にはこれくらいしか思いつきません(初心者です) 他にどんな機能がいりますか? それとも、全ユーザの日記を同じテーブルで 管理なんてしないんでしょうか? 上のはありえない馬鹿仕様ですか?
うまく探せばMySQLのユーザー会かなにかの発表で使ったぱわぽんのデータもあるよ。 結構な事をやってるから、357の段階で引っかかってるならやらない方がいいと思う。
他のサーバーに移管したいので、 DB内のデータをSQL文でとりたいのですがどうすればいいでしょうか? ほかに簡単に移管する手がありましたら教えてください。 自鯖から専用鯖への移管です
361 :
350 :2007/06/27(水) 19:20:20 ID:???
`user_seq`ごとに `number`が存在するからプライマリにはできません(多分) `user_seq`=1の人の`number`が1,2,3,4,5 見たいな感じです。 引き続きお願いします
362 :
360 :2007/06/27(水) 19:27:50 ID:???
訂正します。 自鯖からxreaへの移管です。
364 :
360 :2007/06/27(水) 19:49:07 ID:???
>>360 大型ダンプじゃなくても双方近しいバージョンならDBファイルをまんまコピー
でも大丈夫。(まれにバージョンによっていけない場合もある)
>>361 多分とか、言っててビビるんだが。
質問者がわからんテーブル構成を漏れが判断できるわきゃねーだが。
複合インデックスにすりゃーいいだが。
その前にサブクエリーを使えって誰か言っているわけだが、なぜ黙殺するのか、答えろ。
369 :
360 :2007/06/28(木) 12:10:20 ID:???
>>363 さん
364はアンカーミスです。
すみません。
>>366 さん
XREA(共有サーバ)なのでDBファイルの置き場所にアクセスできません。
mysqldumpでSQL文として吐き出してもらうのが、一番手っ取り早いとは思うのですが
マニュアル見てもどこに書いてあるのか分かりません。(mysqldumpの項)
くれくれですみませんが、詳しく解説しているサイトなどありましたら教えていただけませんでしょうか?
>>369 どこ見てんだか…
[Mysql ダンプ]でググれば一発
>>369 mysqldump でググレばトップじゃねーの。これは久々に偉人が出るな。
372 :
360 :2007/06/28(木) 13:47:26 ID:???
>>370-371 さん
レスありがとうございます。
マニュアルのmysqldumpは既に見ています。
ただ、コマンドを書いてもうまくいかないのです。
mysqldump --c database > backup.sql;
これでやってみましたがエラーになります。。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqldump -c datebase > backup.sql' at line 1
今後の展開に期待
>>372 自分で「コマンド」って書いてるのになんでSQLクエリとして実行するかね。
笑った。
>>372 mysql内でなくて、コマンドプロンプト等で以下コマンド発行でつ。
mysqldump --user=ユーザー名 --password=パスワード データベース名 > backup.sql
これが基本だが、ホントはもう少しパラメータが必要。
ソケットや、キャラクターセットなどのパラメータ。
innodbだけをしている場合とそうでない場合など。
blobのデータがある場合。
色々なケースによりパラメータが違うのでつ。
>>373-374 中学生がホームレス襲撃して遊んでいる構図と一緒でつ。
傍目からみていると醜いでつ。
>>358-359 ありがとうございました!
テーブル分割という概念を知らなかったので勉強になりました
>>376 コマンドをクエリとして打っちゃうような人に対して
その説明で足りると思ってるの?
所詮自己満足、
>>374 と50歩百歩だよ
start transaction; SQL文1; SQL文2; SQL文3; IF エラーが無ければ THEN COMMIT; ELSE ROLLBACK; END IF; こう言うSQL文を書きたいのですが エラーが無ければの部分が分りません 教えてください
>>380 アプリは無いのでsql側でお願いします
どんなときエラーになるのさ?
create table aaa( bbb int ); start transaction; insert into aaa(bbb) values(0); insert into aaa(bbb) values(3); insert into aaa(bbb) values(bbb); <<ここです。 IF エラーが無ければ THEN COMMIT; ELSE ROLLBACK; END IF;
>>379 それってさ。
ttp://forums.mysql.com/read.php?98,139540,139582 このサイト見て自分も同様にやりたかったが、ストプロ使えないバージョンだった。
で、代案をココで訊いてみた。
つーこと?
バージョンくらい書いてくれよ。
ファイルにそのsql文を書いて実行すれば代用できる。
start transaction;
うまく通りinsert文1;
うまく通りinsert文2;
うまく通らないinsert文3;
commit;
mysql -uユーザ名 -pパスワード -Dデータベース名 < 上記sql文.sql
「うまく通らないinsert文3」があるから、ロールバックされとるやろ?
385 :
360 :2007/06/29(金) 11:44:33 ID:???
>>376 さん
ありがとうございます!
無事SQL文として取り出せました。
ご親切にありがとうございます。
ただ、深刻な問題があります。
取り出したSQL文の日本語が文字化けしてしまうのです。
こちらは376さんのアドバイスを参考に自力でやってみます。
>>384 やりたかったのはそのサイトに書いてあるやつです。
start transaction;
うまく通りinsert文1;
うまく通りinsert文2;
うまく通らないinsert文3;
commit;
としてもロールバックされなかったのでそのサイトのように
できたらいいかなと
versionはmysql5です
start transaction; うまく通りinsert文1; うまく通りinsert文2; うまく通らないinsert文3; rollback; <<明示的にロールバックするとロールバックされます。
>>386 なぬぅ?
つーことはさ。
MyISAMでテーブルを作ってないか?
InnoDBで作ったやつで再度やり直してみてくだつぁい。
と書いたところ、
>>387 が更新されていた。
つーことは、InnoDBで作っているみたいだねぇ。
>>384 このstart 〜 commit;までをファイルに書いてリダイレクトすんだよ?
mysql -uユーザ名 -pパスワード -Dデータベース名 < 上記sql文.sql
これはmysqlの中で打つコマンドじゃないよ。
mysql> exit
c:\> mysql -uユーザ名 -pパスワード -Dデータベース名 < 上記sql文.sql
まあ、バージョンが5.xxらしいのでストプロも研究してみてくだつぁい。
入っている文字(日本語)が奇妙な形で文字化けします。 以下のような感じなのですが、どなたか同じ経験ありますでしょうか? サーバから見たときやPHPMyAdminから見た時は日本語が文字化け PHPで取り出して表示すると普通に見れる(この際、EUC-JPからSJISに変換している) 入れる際の文字コードの問題か、とも思いましたがきちんと(SJIS->EUC-JPに)変換していた。 データベースによってこの現象が起きるDBとおきないDBが存在(testというDBでは正常に入っているのにtest2だと文字化け)→DB内部文字が原因? こんな感じなのですが、もし何かご存知の方、宜しくお願いします。 私も引き続き調べてみますが私の知識レベルではなかなか原因の究明が出来ません。。
>>389 こちらの環境ではまったく問題がないです。
バージョン5.027
WindowsXP
version
mysqlサーバのos、あるいはクライアントのos
show variable like 'char%';
create database時のcharacter set
create table時のdefault charset
これらを聞かされていないのに調査のしようがありません。
基本的にサーバとクライアントのキャラクターセット不一致が原因ですから、
その辺りから調査されてはいかがでしょうか。
>>390 あと、
insert時のキャラクターセット
phpスクリプトによるinsert文発行なら、phpスクリプト・ファイル自体のキャラクターセット。
コマンドプロンプトなら、set namesもしくは、charcter_set_client。
392 :
389 :2007/06/29(金) 16:28:02 ID:???
>>390-391 ありがとうございます。
mysqlサーバのOSはFedoraCore5です。
クライアントはWindowsXP(これは関係ないと思います)
以下がshow variable like 'char%';の結果です。
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
各テーブルをstatusで調べてみると以下が違うことが分かりました。
■文字化けするほう
Db characterset: utf8
■文字化けしないほう
Db characterset: latin1
これが原因っぽい…
Db charactersetをlatin1にしてみます
>>392 utf8なら、insert時に
set names utf8;
でインサートすればよい肝。
latin1だと日本語で困りそうですが、その辺りは問題ないですか?
むしろcharcter_set_database、charcter_set_serverをutf8にする検討をしたほうがよさそう。
あ。
>入れる際の文字コードの問題か、とも思いましたがきちんと(SJIS->EUC-JPに)変換していた
insert時にeuc変換?、utf8のサーバに?
ちょっとこの辺が意味不明ですねぇ。
データが "渋谷駅:5分" という形で格納されています。 この5という数字に対して比較演算子を使いたいのですが、どのような方法があるでしょうか? 正規表現を使っても後方参照が無いので意味ないですし・・・ テーブルの設計を間違えたのは重々承知ですが、何かいい方法があればアドバイスお願いします。
395 :
389 :2007/06/29(金) 16:48:28 ID:???
>>393 何度もご解答いただきましてありがとうございます。
普通にUTF-8じゃなくEUC-JPでいれてました。。
でも文字化けしてないし、きちんと見れる。。
なんかやばいですね^^;(既に稼働中)
latin1ですが、文字化け等していないです。
度々の質問で申し訳ないのですが、
既にデータが入っているんですがcharcter_setを変えちゃって大丈夫でしょうか?
>>395 いやぁ、それはヤバイっしょ。
文字コード毎に固有の文字がありますんで。
sjis -> cp932とかなら、良いかもですが。
>>394 やもえないということなので、文字列をこねくり回す方法があります。
「mysql 関数」でググッた方が速いです。
mysql> create table test (c varchar(20));
Query OK, 0 rows affected (0.64 sec)
mysql> insert into test values
-> ('渋谷:10分'),('渋谷:5分'),('新宿:5分');
Query OK, 3 rows affected (0.17 sec)
レコード数: 3 重複数: 0 Warnings: 0
mysql> select * from test where replace(substring(c,locate(':',c)+1),'分','')='5';
+------------+
| c |
+------------+
| 渋谷:5分 |
| 新宿:5分 |
+------------+
2 rows in set (0.00 sec)
>>388 なるほどクエリでやってました。
コマンドからバッチを流すと出来ました。
しかしクエリで処理する方法は無いのでしょうか?
ストアドプロシージャはストアドプロシージャを
呼び出せないためリンク先の方法は難しいようなきがします
>>398 そのストプロからストプロを呼び出す云々は聞いていない用件だし、
詳細不明なので割愛させてもらいます。
俺はふつーにやってるけどな。
バッチもストプロもダメなら、ない。
400 :
400 :2007/06/30(土) 05:19:00 ID:???
400get
MySQL 3.23なのですが、レコードの複製で効率的なものはないのでしょうか? 同じテーブルでのINSERT ... SELECTは、このバージョンでは無理とのこと。 一度SELECTしたものをINSERT ... VALUEするしかありませんでしょうか?
>>401 temporaryテーブルを介すればいいんじゃまいか
>>395 小さいDBなら、DB側はこんな感じでちょこちょこっと弄ればよい(ujis→utf8への変換例)
1)ダンプを吐き出し
mysqldump -uユーザ名 -pパスワード --default-character-set=binary DB名 > dump
2)dump.sql内のcharset置換
sed 's/DEFAULT CHARSET=ujis/DEFAULT CHARSET=utf-8/g' dump > dump_tmp
3)nkfで文字コード変換
nkf --utf8 -Lu dump_tmp > dump_utf8
4)
DBの作り直し
mysqladmin -uユーザ名 -pパスワード drop DB名
mysqladmin -uユーザ名 -pパスワード create DB名
5)ダンプデータを流し込む
mysql -uユーザ名 -pパスワード DB名 < dump_utf8
以上
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
尚、当然ながら、自己責任でおながいします。いきなり本稼働中環境にやらないように。
404 :
NAME IS NULL :2007/07/01(日) 10:57:43 ID:9kR/4Q9k
myspl5で int unsigned のカラムにマイナスの値をいれると0が挿入されたり 値がマイナスになるように引き算をしアップデートすると 最大値近くの値になるのは仕様でしょうか?
>>404 create table からinsertまで画面ログを見せてくだつぁい。
漏れの環境では再現できなかったでつ。
5.0.27。
詳しいバージョンもよろ。
mysql 5.0.26 create table testtable( testcol int unsigned ); insert into testtable(testcol) values(-6) これで入ってしまいます。一応警告はでるのですが
407 :
405 :2007/07/01(日) 22:49:58 ID:???
>>406 降参。
一応漏れのshow create tableと結果を書いておきます。
mysql> show create table testtable;
mysql> show create table testtable;
+-----------+-------------------------------------------------------------------
----------------------------------------+
| Table | Create Table
|
+-----------+-------------------------------------------------------------------
----------------------------------------+
| testtable | CREATE TABLE `testtable` (
`testcol` int(10) unsigned default NULL
) ENGINE=InnoDB DEFAULT CHARSET=sjis |
+-----------+-------------------------------------------------------------------
----------------------------------------+
1 row in set (0.00 sec)
mysql> insert into testtable(testcol) values(-6);
ERROR 1264 (22003): Out of range value adjusted for column 'testcol' at row 1
mysql> select * from testtable;
Empty set (0.00 sec)
408 :
406 :2007/07/02(月) 00:24:28 ID:Jq59+b9l
別のVersionでためしたら405さんのように跳ねられました。 バグか設定がへんな用です。
410 :
405 :2007/07/02(月) 00:48:42 ID:???
>>409 おービバビバ。409、ありがとん。再現できた。
mysql> SELECT @@global.sql_mode;
+----------------------------------------------------------------+
| @@global.sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@session.sql_mode;
+----------------------------------------------------------------+
| @@session.sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into testtable values (-1);
ERROR 1264 (22003): Out of range value adjusted for column 'testcol' at row 1
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into testtable values (-1);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from testtable;
+---------+
| testcol |
+---------+
| 0 |
+---------+
1 rows in set (0.00 sec)
411 :
406 :2007/07/02(月) 17:55:26 ID:Jq59+b9l
なるほどこんな設定があるとは ありがとうございます しかしこんな設定を使うシステムもあるんですかね
412 :
406 :2007/07/02(月) 21:02:52 ID:???
CREATE TABLE `testtable` ( `testcol` int(10) unsigned default NULL ) ENGINE=InnoDB insert into testtable(testcol) values(300); update testtable testcol = testcol - 400; -->NG update testtable testcol = testcol -(100*4); -->OK こんな結果が出ました。 ちょっと不安になってきました。
MySQLって商用として使えるの?
>>413 使えるでござる。
ただしクライアント部でリンクしている部分は
バイナリ保有者にソース公開の義務があるゆえ
徹底した機能分割にて非GPL部分との隔離を
図る必要があるでござる
お金出すなら、無料でダウンロードできるという採用価値の意味は無くなるけどな。 GPL除去がめんどいのでオラクルを使ってる。 ライセンス量はお客負担だし。
>>416 >GPL除去
詳しく。
接続してSQL投げて結果を取得するだけのプログラムの場合、
SQL投げるところは、非公開でOK。
SQLを受け取ってDBに接続、SQL結果取得する部分は、公開の義務。
ちゅーこと?
つか、MySQLはBSDライセンスじゃんか。 GPLがどうして出てくるんだろうか・・・・
>>418 オレはてっきりPostgreSQLの方がBSDライセンスで
MySQLはGPLと商用のデュアルライセンス形態だと
ばかり思っていた。 反省しなくてはいけないな。
教えてくれてありがとう。
整理しよう。(笑) MYSQLはLGPLライセンス・・だっけか? PostgreSQLはBSDライセンス・・・かな? もう何が何だか全然分からなくなってきたな。(笑)
すみません 質問させてください 出会い系でもミクシでもいいんですが、「友達リストに登録」機能って、 ユーザプロフィール用のテーブルとは別に、友達一覧専用のテーブルを持ってると 考えるのが自然でしょうか? ユーザプロフィール用のテーブルと一緒だと、friendsフィールド中にカンマセパレーションで 流し込むことになるのかなと思いますが…
>>421 friends テーブルとか作って、会員テーブルの主キーを自分と相手でマップする感じに作るのが理想。
423 :
336 :2007/07/04(水) 20:16:15 ID:???
MySQL のコードを利用しないアプリに関しては BSD ライセンスってこと? 俺も分からなくなってきましたよw
>>424 今オレが書いてるこのソースもMySQLのコードは使ってないから
自動的にBSDライセンスになるってことか。BSD強いなぁ。うん。
426 :
NAME IS NULL :2007/07/05(木) 11:02:35 ID:3+rCMbiR
3.23です。 自動インクリメントする整数型フィールド id を持つ、テーブル hoge があります。 まず、新規レコードをINSERTし、その後コネクションを切断します。 次に、別途MySQLに接続し、UPDATEでこのレコードを更新しました。 この時、MySQLの関数などを用いて、このレコードの id を取得することは可能でしょうか? LAST_INSERT_ID() はちょっと違いますし……。 現在、アプリ側でSELECTする方法を考えています。
427 :
426 :2007/07/05(木) 11:05:11 ID:???
hoge には、id 以外にも幾つかのフィールドを持ちます。 その中にはユニークなものもあり、SELECT〜WHEREで id を取得することは可能です。
>>426 文面通りなら、max()使えばよろし。
ただし、3.23は、使ったこと梨。
申し訳ありませんが質問させてください。 UPDATE `table` SET `name` = '名前1' WHERE `id` = 1; UPDATE `table` SET `name` = '名前2' WHERE `id` = 2; このような複数のUPDATE文を一つのSQL文にまとめたいと思います。 どのように書けば良いでしょうか。
>>430 UPDATE `table` SET `name` = '名前'+id;
'名前'+idのとこは文字列化して文字列連結
あとは冴子先生に聞け
>>431 ありがとうございます。お陰様で解決致しました。
今までSQLは一文ずつしか送れないのだと勘違いしていました・・
hoge_tblのhogeが空の場合(NULLのものと空白のもの)のみを取り出したいのですが以下ではうまく動作しません。 どうすれば意図した動きをしてくれるでしょう? SELECT * FROM hoge_tbl WHERE (`hoge`=NULL || `hoge`='');
436 :
426 :2007/07/05(木) 17:38:19 ID:???
>428 ありがとうございました。 UPDATEを行う前に他のコネクションからINSERTされる可能性を考えると、MAX()は使えなさそうです。 素直にSELECTすることにします。
GPLは汚染されるからねえ。
MySQLをCygwinか、若しくはコマンドプロンプト以外のターミナルで 実行することはできますか? コマンドプロンプトでは全角/半角の切り換えに いちいちAltを押さないといけないので、その手間が煩わしいのです。 なお、当方の環境(WinXP Pro)では、Cygwinでmysqlコマンドを打つと、 何も表示されず、実行されている気配も無いです。
>>439 438はクライアントの話をしているんじゃ?
>>438 teratermでcygterm
あとは冴子先生に聞け
すみません、ちょっとここで聞くことなのか悩んだんですが質問です
あるサーバで、サイトをA B Cの三つ作るとして、SSLを導入することに
なったときに、全サイトに入れると経費かかるから、そのうち一つに入れて
他からの代用にするって出来ますか?
B・Cのサイトから、
https://www.A.com/ のフォームを開き、そこからB・C用のsqlDBに
登録するっていう流れになると思うんですが、それでセキュリティは問題なく保持されるでしょうか?
>>442 SSLじゃなくてSQLだえお
つーかフォームを開くのかよやめろよそういうのは裏でやれよ
クロスサイトすんなお
444 :
NAME IS NULL :2007/07/07(土) 22:04:26 ID:wxVu8uZj
kkk
445 :
442 :2007/07/08(日) 02:12:47 ID:???
>>443 回答ありがとうございます
>SSLじゃなくてSQLだえお
どういうことでしょう? あのー、ベリサインとかのあのSSLを導入したいって
意味なんですが… すみません知識不足でご指摘の部分が理解できてないかもしれません
板違いだろーという意味でしたら、ごめんなさい
>フォームを開くのかよやめろよそういうのは裏でやれよ
つまり、www.B.comからwww.A.comのフォームを開くの自体がまずいってことでしょうか?
それがクロスサイトスクリプティングにつながると…?
B.comのフォームを開いて、そこからA.comのSSLを利用するなんて出来ないですよね
違うホストの証明書が利用出来たらSSLの意味ない 板違いを自認してるならサッサとお帰りください
たしかに! そりゃそうですね ごめんなさい ありがとうございました
448 :
NAME IS NULL :2007/07/08(日) 10:09:07 ID:/xzmDBMK
MysqlAdministratorについて質問です。 DBサーバが別サーバになっていてローカルIPを振られているような 環境でも設定次第では接続可能でしょうか? クライアントがローカルネットワーク上であれば単にHOSTを ローカルIPにすれば大丈夫だと思うのですが、そうではなく ローカルネットワーク外から上記環境に接続したいと思っています。 よろしくお願いいたします。
目的を書いたら? 社内LANとかで他のMySQL鯖に繋ぎたいってこと? ローカルネットワーク外からローカルネットワークに通信できるのか?って疑問がある。
トンネル掘れば(port forwarding)一応何でも出来る けどね。
>>448 できるよ。 ウォール他、ネットワークの話しになりますね。
ポート転送は邪道だけどな。動けばいいならそういう解決法もあるが。
453 :
NAME IS NULL :2007/07/10(火) 17:47:02 ID:NqzHTtFx
mysqldumpで--add-drop-databaseのオプションが機能しないのですが、何か他に必要なことがあるのでしょうか? コマンドラインにてmysqldump --add-drop-database --user=hoge -phoge HOGE_DB > c:\hoge_db.sql を実行したところ、ファイルは作成されたのですが、 中をのぞいてもdrop database HOGE_DBの文あるいは該当する記述が見当たりません。 このオプションは使用できないのでしょうか? xamppliteのmyxql4.1.14を使用しています。 どなたかご存知の方教えてください。
>>453 いや、そのDBもうDROPされてるよ。 確認した?
つまらない釣りだ。orz
456 :
NAME IS NULL :2007/07/11(水) 15:44:43 ID:0py3B+oq
質問です DB一つの中に10個テーブルつくるのと、DB2つの中に5個づつつくるのとで どう違うんでしょう 一つにまとめると負荷が大きくなって危険とかあるんでしょうか? 両パターンでのバックアップとるときの短所や長所などがあれば教えてください 切り分けルールをどう定めていいのか分かりません よろしくお願いします
>>456 切り分ける必要が無いなら切り分けない。絶対に。
アクセスするとき、テーブル違いを意識するかしないか程度。 テーブル単位でバックアップ?なんて変な事するなら多少のご利益はあるだろうけど。 普通はデータベース単位でバックアップ取るから関係ない。 負荷が集中したら、テーブル分けるだけじゃ駄目で、鯖を分散化しないと意味が無い。 テーブル単位でロックするなら、テーブル分ければロックの競合頻度が下がって処理時間が短くなる可能性はあるだろうけど、その次元に逝ったらオラクルとか自動的にロック回避のメカニズムを持ってパフォーマンスが出せるデータベース製品に乗り換えを考えるべき。
459 :
453 :2007/07/12(木) 13:23:42 ID:???
>>454 2つの異なるDBを同期するのに試してみたのですが、
同期元で削除したテーブルが、mysqldumpで作成したファイルから復元した同期先のDBから削除されませんでした。
また、作成したファイル内にて全てのテーブルについてdrop tableが付加されているので
やはりDBがdropされていないと思うのですが、
何か必要な手順が他にあるのでしょうか?
460 :
NAME IS NULL :2007/07/12(木) 22:19:16 ID:U0XvRs/R
郵政公社の郵便番号CSVから住所データをMySQLに取り込みました。 構成は area_id int 11 not null auto_increment primary zip_code int 7 not null pref_id tinyint not null middle_area varchar(255) not null INDEX middle_area_kana varchar(255) not null small_area varchar(255) not null INDEX small_area_kana varchar(255) not null という構成でデータは119000件くらい入っています。 select * from area order by area_id limit 10 とやると一瞬で結果がかえってきます。 select * from area order by rand() limit 10 とやると、タイムアウトになってしまいます。 order by rand() ではレコード数が増えると扱えなくなるのでしょうか? バージョンは5.0.41です。
実際どうすればいいんだろうね
463 :
NAME IS NULL :2007/07/13(金) 04:33:09 ID:9zDJRs1G
1対多の関係のレコードを1発でinsert/updateする方法はありますか?
>>464 どんなプログラム言語からMySQL使ってるのかしらないけど、
文字列型の変数にバイナリデータを入れるっていう概念が理解できないと
わからないと思う。
文字として扱う限りはtext型でいいでしょ。
>>460 これ前に悩んだけど潰せなかった。
rand 用のインデックスなんて作れそうも無いし。
アプリで主キーの乱数を取って欲しい分回すしかないのかな。
>>460 >>466 select * from area where area_id in ( select area_id from area order by rand() ) limit 10;
とかどうよ?
>>469 ごめん
select * from area where area_id in
(select * from
(select area_id from area order by rand() limit 10) as a
);
でやってみてちょ 、
ちなみに 2行目を取っ払うと
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' と言われてしまうっす mysql (5.0.27)
471 :
469 :2007/07/13(金) 15:36:01 ID:???
>>470 補足
select * from itemregsub where area_id in (select area_id from (select area_id from area order by rand() limit 10) as a)
order by rand();
最後にorder by rand() が必要だった。
一応ランダム抽出でかつ初めに area_id のインデックスが効くから速くなると思うけど、、
472 :
464 :2007/07/13(金) 15:54:42 ID:???
>>465 返信ども。主にPHPから使ってます。
>文字列型の変数にバイナリデータを入れるっていう概念が理解できないと
>わからないと思う。
概念というか理由がイマイチ理解できないのですよ。
作る人のクセかも知れないけど、1000文字ぐらいの文字列なんかも
blob型で保存してたりして「なんでだろー」と。
473 :
460 :2007/07/13(金) 15:57:09 ID:ujex21Rt
答えてくれたみなさんありがとうございます。
なんだか複雑ですね。
>>470 ,
>>471 のSQLでやってみたらできました、がやっぱりちょっとレスポンスが悪いですがしかたないですよね。
サブクエリの入れ子とは難しいですね。
とりあえず、教えていただいたものでやってみます。
ありがとうございました。
>>473 area_id に対して
create index してる?
explain さっきのSQL で、 Using index て出てこないなら、してみたら?
475 :
470 471 :2007/07/13(金) 16:18:02 ID:9Bt5Ot0u
何度もスレ汚しごめん、しかもコテハン番号間違えてるし、、 select v1.* from area as v1, (select area_id from (select area_id from area order by rand() limit 10) as a) as v2 where v1.area_id=v2.area_id order by rand(); がたぶん最速 もっといい方法あったら教えて、エロい人。
476 :
NAME IS NULL :2007/07/15(日) 18:37:44 ID:OG/QKv5e
初めまして。一つ質問させてください。 group_concat等で「4,1,4,1,1」と言う値が取れたとします。 この値から「1が連続している回数の最大値」をSQLで取るにはどうすれば いいのでしょうか? 事情ありましてSQL限定での処理をしなくてはなりません。 恥ずかしい質問ですが、お助けください。 以下現在のソース SELECT group_concat(c) as c_t FROM c_table WHERE name = 197029
>>476 group_concat()を使わなければならない理由は?
cでgroup byしたもののcount()で最大値とればいいんじゃないの?
478 :
476 :2007/07/15(日) 22:06:24 ID:OG/QKv5e
>>477 そうすると結果が「3」になってしまいます。
上記のケースで取りたい値は「2」なのです。(末尾の『1,1』の部分)
group_concatを使ったのは複数レコードをまとめられたのでこのままイケるかな?
と思いまして><
php使えれば一発なのに・・・
はじめまして。質問なのですが現在タグでデータを管理するシステム (youtubeやニコニコに似た感じです)を開発しています。 テーブル構成ですが、 Tags には TagId, Caption Items には ItemId, Caption, Data ItemsInTags には TagId, ItemId というフィールドがあります。 アイテムとタグを関連付けるために、ItemsInTagsというテーブルを使用しています。 こうすることで、アイテムに関連付けられたタグ一覧と、ひとつのタグに関連付け られたアイテム一覧を取得できるようになりました。 しかし、二つ以上のタグに関連付けられたアイテム (たとえば、「TagId=10に関連付けられており、かつ、TagId=8に関連付けら れている」という条件です)を一覧するSQL文を考えようとして分からなく なってしまいました。 こういう場合、どういうふうにSQL文を記述すればよいのでしょうか? サブクエリを何重にもネストしたりするのでしょうか? ご教授いただけると助かります。 ちなみに、現在一つのタグに関連付けられたアイテムを取得するために SELECT i.* FROM ItemsInTags it INNER JOIN Items i ON (i.TagId = it.TagId) WHERE i.TagId = 10 という風にしています。
480 :
NAME IS NULL :2007/07/16(月) 00:32:20 ID:q17Bppan
>>478 ファンクション使っていいなら こんな感じ? 一応動くが大量レコードへの実行は遅そう。変数名わかりにくいのはすまん
drop function if exists get_cnt;
delimiter //
create function get_cnt(in_c int,in_num int) returns int
begin
declare maxc ,tmpc,lastval,nowval,eod int;
declare cur1 cursor for select c from c_t where name = in_num ;
declare continue handler for not found set eod=1;
set maxc = 0; set tmpc = 0; set lastval = 0; set eod = 0;
open cur1; fetch cur1 into nowval ;
while eod=0 do
if lastval <> nowval then set tmpc = 1 ;
else set tmpc = tmpc + 1; end if;
if nowval = in_c then
if maxc < tmpc then
set maxc = tmpc ;
end if;
end if;
set lastval = nowval;
fetch cur1 into nowval ;
end while;
close cur1;
return maxc;
end;
//
delimiter ;
こんな感じで作っておいて
select get_cnt(1,197029); ←1の数の場合
select get_cnt(4,197029); ←4の数の場合
みたいに呼んでカウントをとる。
481 :
480 :2007/07/16(月) 00:39:49 ID:???
>>480 set lastval = 0; は必要なかった。 あったら0のときカウントがずれる。
482 :
NAME IS NULL :2007/07/16(月) 10:17:53 ID:J+xm2Lgb
483 :
476 :2007/07/16(月) 12:13:36 ID:???
>>480 >>481 レス有難う御座います。
一見見ただけではまだ理解出来ていないphpとSQLとHTMLとJAVASCRIPTしか
触っていないプログラム一年生な自分でありますが、解読して役立たせて
頂きます。
上手くいきましたら報告させていただきますね
DBにDateTimeで予定を入れてるんですが、 問い合わせする時って、時間ごとにSQL文作ってていいんでしょうか。 1回のビューで24回DBに問い合わせる事になるんですが、 スマートな方法って何かありますか?
485 :
NAME IS NULL :2007/07/16(月) 15:44:02 ID:4NQxSNLF
CREATE TABLE `t1` ( `a` char(2) default NULL, `b` char(2) default NULL, `c` char(2) default NULL ) TYPE=MyISAM; INSERT INTO `t1` (`a`, `b`, `c`) VALUES ('01', '02', '22'); INSERT INTO `t1` (`a`, `b`, `c`) VALUES ('01', '03', '23'); INSERT INTO `t1` (`a`, `b`, `c`) VALUES ('01', '04', '24'); CREATE TABLE `t2` ( `a` char(2) default NULL, `b` char(2) default NULL, `d` char(2) default NULL, `e` char(3) default NULL ) TYPE=MyISAM; INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '02', '01', 'aaa'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '02', '02', 'bbb'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '02', '03', 'ccc'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '03', '01', 'ddd'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '03', '02', 'eee'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '04', '01', 'fff'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '04', '02', 'ggg'); INSERT INTO `t2` (`a`, `b`, `d`, `e`) VALUES ('01', '04', '03', 'hhh'); こんな感じに二つテーブルをつくっていて、 SELECT t1.a, t1.b, t1.c, t2.d, t2.e FROM t1, t2 GROUP BY t2.a, t2.b, t2.d これで問い合わせると8件でてきます。 これを項目a,bの3グループ中の先頭2グループ分だけ表示したいとき 1度のSQLで問い合わせできるでしょうか? いまはこれで件数を出し、3+2=5件をとってきてから select count(*) from t2 group by t2.a , t2.b limit 0 ,2 SELECT t1.a, t1.b, t1.c, t2.d, t2.e FROM t1, t2 GROUP BY t2.a, t2.b, t2.d limit 0 , 5 と、2回問い合わせています。 わかりにくい質問の仕方ですいません。
>>485 途中にsqlを抜けるのがいやなだけで、
実質的な問い合わせ回数は2回のままでもいいのなら
480みたいにファンクション作ってやってみれば?
すみません。質問です。 MySQLで初めてViewを使ってみようと思ったのですが CREATE VIEW test_view AS SELECT * FROM table_name; すると ERROR 1044 (42000): Access denied for user 'user_name'@'localhost' to database 'db_name' と出てしまいViewが作成できません。 SELECT * FROM table_name; だけなら問題なく、ちゃんとQueryが通り、普通に結果が表示されます。 GRANT ALL してあるので、権限的には問題ないかと思うのですが これはどのあたりが問題なのでしょうか…??皆目わからず困っております。。 何かお気づきの点などありましたらアドバイス下さい。 使用しているMySQLのバージョンは mysql-5.0.27-1で、DBはInnoDBです。 どうぞよろしくお願い致します。
>>487 もう一回、
[root@localhost]# mysql -uroot
mysql> use mysql
mysql> select Host,User, Create_view_priv,Show_view_priv from user ;
して
| Host | User | Create_view_priv | Show_view_priv |
| localhost | ユーザー | Y | Y |
ってなってるか確認汁
>>484 いまいち曖昧な質問だけど、between とかで時間帯絞り込んで、1日分を一回で取得してくれば良いだけじゃないの?
490 :
NAME IS NULL :2007/07/16(月) 20:27:02 ID:4NQxSNLF
>>486 いえ、PHP+mysqlなのでSQL抜けることには
全然問題ありません。
SQLの文法を詳しく知らないので簡単な方法があるなら
問い合わせ回数を減らした方が良いかと思い質問しました。
ありがとうございました。
492 :
487 :2007/07/17(火) 15:21:14 ID:???
>>488 さん
ご回答ありがとうございます。指定されたコマンドを打ちましたら
mysql> select Host,User, Create_view_priv,Show_view_priv from user;
ERROR 1054 (42S22): Unknown column 'Create_view_priv' in 'field list'
m
と出ました。という事はこれは、Viewが使えないという事でしょうか。。。
MySQLのバージョンの問題でしょうか??
>>492 じゃぁとりあえず、
select * from user;
で良いじゃん、中を見てみ。
(rootでmysqlに接続することをお忘れ無く)
494 :
479 :2007/07/17(火) 19:00:03 ID:???
>>482 自己結合のことですか?
AがBを参照し、BもAと同じテーブルに存在するという場合(社員テーブルの社員と上司など)
に使えると記憶していますが、どういうふうにこの問題に応用できるんでしょうか?
最近使うようになったばかりでまだ知らない部分が大いにあるので教えて
いただけるとありがたいです。
色々調べていて他のSQLサーバーでは以下のようにすればいけることが分かりました。
(SELECT i.*
FROM ItemsInTags it INNER JOIN Items i ON (i.TagId = it.TagId)
WHERE i.TagId = 10)
INTERSECT
(SELECT i.*
FROM ItemsInTags it INNER JOIN Items i ON (i.TagId = it.TagId)
WHERE i.TagId = 8)
これをMySQLサーバー用に書き換えるにはどうすれば良いでしょうか?
495 :
NAME IS NULL :2007/07/17(火) 21:58:15 ID:jLoUe55A
orderby で質問があります。
MySQLはVer5です。
http://www.geocities.jp/livrersdream/1.html 上にある表が現在のデータです。
それをORDER BY句で下の表の並びで取得したいのですが、1回のクエリでできますでしょうか?
試したのは
SELECT * FROM `bg_category` ORDER BY IF(category_parent_id > 0, category_parent_id * 1000 ,sort_order)
ですが、当然期待通りにはなりません。 PHPと絡めて複数回のクエリを送ればできるのですが……
よろしくおねがいします。
496 :
NAME IS NULL :2007/07/17(火) 22:12:57 ID:Nmyq7DKR
MySQL4.1.2 を使用しています。 重複行の削除をしようとしているのですが、 オラクルのように rowid がないので悩んでいます。 やはり一度 distinct したデータで一時テーブルつくって、drop したらまた元に戻してという方法しかないんでしょうか?
Windows2000 + mysqld-5.0.45 + ODBC 3.51 Driver + ADO.NET2.0 上記のような環境で、ADO.NETからUTF-8の日本語文字をINSERTしようとしているのですが、 QueryBrowserで見ると文字化けしてしまいます。以下のような設定にしているのですが、 何か間違いありますでしょうか。他に設定すべき項目はありますでしょうか。 (VisualStudio上のウォッチでSQL文にはUTF-8で設定されていることを確認済) 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 ※「my.ini」で「skip-character-set-client-handshake」指定 ちなみに、MySQLをsjisで設定して、ADO.NETからMS932(Shift-JIS)でSQL文を 発行すると文字化けせずに表示されます。ただし、ODBC3.51にバグがあり、 ダメ文字(ソ、十とか)が文字列の最後に来ると例外が発生して更新できません。 よろしくお願いします。
>>497 mysql> SHOW VARIABLES LIKE 'character\_set\_%';でどうなってる?
>>497 追補 my.cnfはこんな感じか?
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
old_passwords=1
default-character-set=utf8
init-connect=SET NAMES utf8
character-set-server = utf8
[client]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
>>496 mysqlには無いのでなんとか工夫しましょう。
501 :
497 :2007/07/18(水) 01:37:46 ID:???
>>498 以下のような感じです。
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| 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 |
+--------------------------+--------+
>>499 mysql5.0を使用しているので、my.iniで良いですよね?
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.0/"
datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"
default-character-set=utf8
skip-character-set-client-handshake
「mysqldump」の領域はありませんでした。
>>501 [client]
default-character-set=utf8
って必要なかったっけ?ぱっと見コレが無いんだが、
あとは
ODBC側の Initial Statement→ SET NAMES cp932
が必要だったっけなぁ、
あんまり使わないんで、うろ覚えでスマン 知っている人つっこんでください。
>>495 一発でとろう30分考えたけど挫折した。
こんな時はいつもファンクションに逃げる。phpで複数回クエリ投げるよりは速いと思う。スマン
>>494 select B.* from Items as B where
exists
(
select * from ItemsInTags as A
where exists
( select * from ItemsInTags as it where it.TagId = 8 and A.ItemId=it.ItemId)
and A.TagId=10 and B.ItemId=A.ItemId
);
とか、
もっと美しくできんかなぁ
505 :
504 :2007/07/18(水) 03:42:54 ID:???
>>494 select it.* from Items as it , ItemsInTags as a1, ItemsInTags as a2
where a1.TagId=8 and a2.TagId=10 and a1.ItemId=it.ItemId and a2.ItemId=it.ItemId
でいいね、
>>504 は忘れてください
506 :
475 :2007/07/18(水) 04:01:30 ID:???
>>460 >>473 あとで見返してみたら
select
v1.*
from
area as v1,
(select area_id from area order by rand() limit 10) as v2
where
v1.area_id=v2.area_id
order by rand();
でいけるね。
>>497 ODBCってあまり経験ないが、Initial Statement に"SET NAMES SJIS" とか入れんじゃねぇ。
508 :
479 :2007/07/19(木) 06:28:49 ID:???
>>505 あぁなるほど!
そういうふうに使えるわけですね。目からうろこです。
すっかり上司と部下のイメージに取り付かれてそういう発想ができません
でした。まだまだ勉強不足です。
とても助かりました。心から感謝します。
>>508 気分的には
select it.* from Items as it , ItemsInTags as a1, ItemsInTags as a2
where a1.TagId=8 and a2.TagId=10 and a1.ItemId=it.ItemId and a2.ItemId=it.ItemId
and a1.ItemId = a2.ItemId
ってした方がなんか落ち着くね。
510 :
NAME IS NULL :2007/07/19(木) 17:02:01 ID:+h4+/7J/
mysqldumpの出力するテーブル作成SQLで CREATE TABLE IF NOT EXISTS `table` ・・・ と 「IF NOT EXISTS」を付けるオプションってありますでしょうか? mysqldump --help で調べた範囲ではそれらしいものがなかったので すいませんがご存知の方、お助けください。
-n, --no-create-db 'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;' will not be put in the output. The above line will be added otherwise, if --databases or --all-databases option was given.}. だから↑をつけなきゃいいじゃねぇ?
512 :
NAME IS NULL :2007/07/19(木) 21:05:45 ID:RSThEGcc
CREATE DATABASE IF NOT EXISTS ではなく CREATE TABLE IF NOT EXISTS となるようにしたいのですが・・・
>>512 mysql> create table if not exists hoge ( fuga int);
Query OK, 0 rows affected, 1 warning (0.00 sec)
出来たけど?(5.0.27)
514 :
NAME IS NULL :2007/07/19(木) 22:02:41 ID:RSThEGcc
>>513 ありがとう。
申し遅れましたが、私512は510でもありまして
事の発端は
>>510 のmysqldumpでCREATE TABLE IF NOT EXISTSの付いた
出力ができないかと・・・という問題を抱えております。
>>513 dump結果を直でいじれば。
または、create table をdumpさせないとか。
>>514 sedで一括置換なら
mysqldump -uroot --default-character-set=binary hoge_db > dump
sed 's/^CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' dump > dump_tmp
sed 's/^DROP TABLE IF EXISTS/--DROP TABLE IF EXISTS/g' dump_tmp > dump_conv
dump_convを使ってDB再構築
みたいなこんな感じ?(未テストだけど、たぶんうまくいく気がするけど、テスト環境つくってやってみてね)
517 :
NAME IS NULL :2007/07/20(金) 04:29:05 ID:X7gTU+GY
>>516 やっぱりそうゆうオプションには無いみたいですね。
ちなみにDROPは--skip-add-drop-tableで出力しないようにできました。
ありがとう。
GRANTコマンドでSYNTAXエラー続発で嘆いております。 GRANT ALL PRIVILEGES ON pp.* TO pp@'192.168.1.%' IDENTIFIELD BY 'pp' WITH GRANT OPTION; 自分で何が悪いのかさっぱりわかりません。 間違い個所を指摘してください。お願いします。
× IDENTIFIELD ○ IDENTIFIED
520 :
518 :2007/07/20(金) 21:28:44 ID:???
>>519 ありがとうございます。2時間ぐらい気付きませんでした。
select * from table where column1 = *** order by column2 これにcolumn3にある単語を含む情報を上位に持ってくるようにしたいんですけど なにかいい方法はありますか? column2 でソートした上で column3でソートしたいです。 where column3 = ('%abc%')とかにしてしまうと含まないものは出てこないし…。 わかる方どうかお願いします。
522 :
NAME IS NULL :2007/07/21(土) 16:24:14 ID:RWw8kA+l
質問です winXP php5.2.3 mysql5 apache2 で開発してます phpで書いたフォームからdbに日本語のデータを登録できない状況です SQL文は $sql = "insert into dbtest values(0,'$name')"; mysql_query($sql); アルファベットでなら登録できます。なにが原因に考えられるでしょう? phpの文字コードはutf-8 mysqlの文字コードもutf-8です 今、以下のコマンドをcmdから実行しました。 insert into dbtest values(0,'bakamono'); insert into dbtest values(0,'ばか者'); 上のほうは反映されますが、下の方は以下のようなエラーが出ます。 mysql> insert into dbtest values(0,'ばか者'); ERROR 1366 (HY000): Incorrect string value: '\x82\xCE\x82\xA9\x8E\xD2' for colum n 'name' at row 1 ご意見よろしくおねがいします。
5.0.45来た。
ALTER DATABASE pp DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; COMMIT; 上述のようなSQL文を実行したのですが、実行した事実をいつでも確認できるようにしたいです。 ppの今現在のCHARACTER SETやCOLLATEを見るにはどうしたらいいでしょうか? よろしくお願いします。
phpMyAdminで「character set」を変更したいのですが、どうすれば良いでしょうか?
526 :
524 :2007/07/21(土) 21:53:27 ID:???
CHARACTER SETはSHOW CREATE DATABASE pp;で見ることができました。 COLLATEの方は見ることができないようです。
>>522 俺のときは
set names utf-8
を先に実行してからinsertしたら出来た。
528 :
NAME IS NULL :2007/07/22(日) 08:38:38 ID:ihfm4iWJ
>>527 ありがとうございます しかし解決しません。
調べたところ Mysql4.Xまでは my.cnf で set names utf-8 と同じ処理を
デフォルト定義できたみたいですが、 自分のMysqlフォルダの中を探しても
my.cnfが見つかりません。
これが関係してるんでしょうか。。
Mysql 5 以降では my.cnf は存在しないものなんですか?
もう2日もここで止まってる…はぁ〜〜
>>528 php側で
$name = "ほげ”;
$name = "'" . mysql_escape_string($str) . "'";
$sql = "insert into dbtest values(0,$name)";
@mysql_query("SET NAMES utf8");
@mysql_query($sql);
してもだめ?
>>521 order by column2, column3 とかすればいいんじゃなかったけ。
531 :
530 :2007/07/22(日) 11:05:11 ID:???
あ、ごめん。そういうことじゃないのか。
532 :
NAME IS NULL :2007/07/22(日) 15:51:36 ID:ihfm4iWJ
>>529 ありがとうございます
ただ、もうどうしてもダメだったのでmysql5から4にバージョンダウンしました
そしたら一応入力はできるようになりました。
今度はphpでブラウザに表示すると文字化けしてますが…
mysql4に比べてmysql5の長所ってどんなとこだったんでしょうか?
すみませんが、間違い個所を指摘してください。お願いいたします。 create table USER_TBL ( USER_NAME VERCHAR(10) CHARACTER SET 'latin1' NOT NULL PRIMARY KEY, PASSWORD VERCHAR(10) CHARACTER SET 'latin1' NOT NULL, USER_ID INT NOT NULL UNIQUE KEY, Created timestamp, Last_Modified timestamp, Last_Accessed timestamp );
534 :
533 :2007/07/23(月) 01:11:20 ID:???
実行ユーザーに権限が無いのかも・・・と、今考えています。 ユーザーの権限の調べるのも時間かかるなあ・・・
535 :
534 :2007/07/23(月) 01:28:27 ID:???
権限の問題かと思いましたが、エラーメッセージを見るとどう考えても権限ではありませんでした。 エラーコード 1064, SQL 状態 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VERCHAR(10) CHARACTER SET 'latin1' NOT NULL PRIMARY KEY, PASSWORD VERCHAR(10' at line 3 1 行目 1 文字目
原因がわかりました。 VERCHAR ==> VARCHAR NetBeans5.5.1で編集していたのですが、VERCHARでも色が変わるんです。まったく疑いもしませんでした。
また質問なのですが、INT型の列(甲とする)に1,2,3,4,5,6・・・・・・nとあるとき、その幾つかがデリートされたとします。 このとき、1,,3,,5,6・・・・・・・nとなったとします。削除された2と4に新しくINSERTするのに効率的な手段はありますでしょうか? 私が考えた手法は、 1. 新たに1,2,3,4,5,6・・・・・・nという内容の列(乙とする)のあるテーブルを作り、WHERE 甲 != 乙 で存在しない2と4を見つける。 2.
538 :
537 :2007/07/23(月) 03:47:16 ID:???
途中でエンター押しちゃった。orz 2. 他のプログラミング言語からループでSELECT i++ FROM 〜 WHERE 甲 != i++; で存在しない2と4を見つける。
539 :
537 :2007/07/23(月) 03:55:40 ID:???
続き・・・ 3. 1,,3,,5,6・・・・・・・nを定期的に1,2,3,4,5,6・・・・・・nとなるように詰め直す。(普段は最後にINSERTした数字を記録しておき、 INSERTが必要になったら、+1してINSERTする。) 自分が考えたのは以上、三つです。いっそのこと、ハッシュコードみたいなの生成して、デュプリケートがめったに起こらないようにする方がいいのかもしれないとも思います。 でもそうすると、メモリー食いそうな気もするし・・・難しいです。
540 :
538 :2007/07/23(月) 03:59:09 ID:???
ミステイクに気付きました。i++を二回も呼んだら同じ数字にならないですね。毎日徹夜で頭がおかしくなっているのかも・・・。orz SELECT i++ FROM 〜 WHERE 甲 != i++;
541 :
537 :2007/07/23(月) 04:04:58 ID:???
また間違ってた・・・。 WHERE 甲 != 乙 ===> WHERE 乙 != 甲 もう寝た方がよさそうだ・・・・orz
詰めないとならない、という仕様にする無駄。
543 :
537 :2007/07/23(月) 08:56:04 ID:???
>>542 レスありがとうございます。
なるほど、3.はDELETEした数字をすべて記録しておいた方が効率よさそうですね。
>>528 Windowsにおいてmy.cnfは短縮ファイルとして表示されてしまうので
右クリックから「送る」からテキストエディタを指定するか、
テキストエディタの「ファイル」→「開く」から編集します。
コマンドプロンプト上で日本語を取り扱う場合、
[mysqld]
default-character-SET=utf8
skip-character-set-client-handshake
とskip-character-set-client-handshakeを追記しておかないと
一つ目は接続とクライアントのデフォルトのキャラクタセットがlatin1で
固定されてしまいます。(statusで確認できます)
>>537 とりあえずお茶でも飲んで落ち着け。書き込むのはそれからだ
546 :
537 :2007/07/23(月) 10:09:51 ID:???
>>545 文章だけで焦りが伝わってしまっているようで申し訳ないです。
547 :
NAME IS NULL :2007/07/23(月) 10:23:38 ID:lWbeE31F
>>544 ありがとうございます。
僕のmysqlは4.1.7なんですが、これだと
C:\Program Files\MySQL\MySQL Server 4.1 にも
C:\Program Files\MySQL\MySQL Server 4.1\bin にもmy.cnfがありません
C:\Program Files\MySQL\MySQL Server 4.1 以下のどこにもないのです。
これって普通ですか? その場合はc\my.ini を修正するしかないの考えてOK?
また、文字化けする原因はクライアントとサーバの文字コードが違うからだとあるサイトに
書いてありましたが、現状は以下の通りです
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
これに加えて[mysqld]skip-character-set-client-handshake としてるんですが
まだ化けます。。 どうしたらいいんでしょう? 4.0にダウンした方がいいんでしょうか…
>>537 まさか、AUTO_INC 項目の数字を詰めようとしているのか…?
549 :
537 :2007/07/23(月) 10:33:10 ID:???
>>548 いや、AUTO_INCREMENT 属性などという便利なものを知らずに無駄な質問をしてしまったようです。
すみませんでした。
551 :
500 :2007/07/23(月) 10:54:09 ID:???
たいした量じゃないので両方書いておきます。
PHPの場合の対策は下記のblogにまとめられています。
http://www.asial.co.jp/blog/206 コマンドプロンプト上ではコードページ932(Shift-JIS)しか扱えないのと
いわゆるダメ文字によって挙動がおかしくなるので、私の場合は毎回
mysql -u root -p --default-character-set=cp932
set names cp932
をしています。
>>547 Windows なら、%WinDir%\my.ini
Linux なら /etc/my.cnf
553 :
NAME IS NULL :2007/07/23(月) 11:13:35 ID:lWbeE31F
>>550 ありがとうございます
文字化けするのはphpスクリプトとcmdの両方です
以下のphpスクリプトで文字登録して
<html><head><meta http-equiv="content-type" content="text/html;charset=UTF-8"></meta>
<title>登録</title><body>
<?php
extract($_POST);
$db=mysql_connect('localhost','root','oraora');
mysql_select_db('peartest');
if($name != ""){
$sql = "insert into dbtest values(0,'$name')";
mysql_query($sql);
}
?>
<form action="adodb_write.php" method="post">
名前:<input type="text" row=1 name="name">
<input type="submit"></input></form></body></html>
続きます
554 :
NAME IS NULL :2007/07/23(月) 11:17:56 ID:lWbeE31F
以下のスクリプトでMysqlから読み込んでいます
<html><head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8"></meta>
<title>表示</title>
<body>
<?php
require'adodb/adodb.inc.php';
$sqltype = "mysql";
$server = "localhost";
$user = "root";
$password = "oraora";
$dbname ="peartest";
$DB = NewADOConnection($sqltype);
$DB -> pconnect($server, $user, $password, $dbname);
if(!$DB)die("接続に失敗しました");
$DB->Execute("SET CHARACTER SET EUC-JP;");
$result = $DB->PageExecute("select * from dbtest",100,1);
if(!result){
echo "エラー:".$DB->ErrorMsg()."\n";
}
echo "<pre>";
while($array = $result->FetchRow()){
print_r($array[1]."<br>");
}echo "</pre>";
?>
</body></html>
また、phpから登録したデータをcmdで確認しても、cmdからinsert文で直接登録しても
select * で化けています
あと、良ければ教えて欲しいのですが、mysql5以上にバージョンアップした理由はなぜですか?
決定的な優位性があるんでしょうか?
>>552 ありがとうございます。安心しました、myiniを編集しています。
>>553 データベースとhtmlはutf8としている一方で
$DB->Execute("SET CHARACTER SET EUC-JP;");
とクライアントのキャラクタセットはeuc-jpにして下さいと
命令しているのはおかしいと思いませんか?
それとあれもこれもやるのは混乱の元なので、
まずはmysql関数のみで動作をしてから(変数分離の原則)
次にadodbを確認をお願いします。
>>555 ありがとうございます
$DB->Execute("SET CHARACTER SET EUC-JP;"); に関しては、
これなしでやっても上手く行かなかったので、試しにやってみたものです。
でも、PEARを一旦やめてテストするのは有効そうですね 試してみます
557 :
556 :2007/07/23(月) 17:54:26 ID:???
だめだ… 下のスクリプトでもまともに日本語表示しないです mysql_connect($server, $user, $password); mysql_select_db($dbname); $sql ="select * from dbtest"; $result = mysql_query($sql); while($row = mysql_fetch_array($result)){ print($row["name"]."<br>"); } もう4.0にバージョン落とすか… 4.1以降の方が優秀なんですかね…
[MySQL Server] -> [MySQL Client] -> [PHP] -> (HTTP Header) -> [表示アプリケーション] この5箇所でどの時点でおかしくなったかわからないとどうしようもない。
>>557 select文を発行する前にmysql_query("SET NAMES 'sjis'");
を追加する、もしくはprintの行を
print mb_convert_encoding($row["part"],"SJIS")."\n";
と置き換えることでコマンドプロンプト上からも日本語が表示できました。
私の環境は以下の通りです。
XAMPP1.6.2(Apache HTTPD 2.2.4 PHP 5.2.3 MySQL 5.0.43)
php.ini
extension=php_mbstring.dll
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
my.cnf
[client]
default-character-set=utf8
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
560 :
556 :2007/07/24(火) 09:28:34 ID:lv4xBGF9
>>559 ありがとうございます
PHPでDBに接続後 SET NAMES UTF8 とすることで、
DBからの日本語引き出しを化けることなく成功できました。
cmdでSELECT * すると全部化けてるんですよね これはしょうがないのかなぁ
LINUXで作れば化けないんですかねー
どう考えても作り手の問題、っていうか同じ話題でスレ汚し杉
コマンドライン(BASH)からコマンドを実行するにはどうすればいいでしょうか? 以下のようにやっているのですが出来ません。 mysql --user=hoge --password=hogehoge prof -e 'SELECT * FROM `user_data` WHERE `reg_time`>='2007-06- 01' and `reg_time`<='2007-06-30'
>>563 おお外のクォーテーションはダブルクォーテーションで囲み、
中のクォーテーションはシングルクォーテーションを使ってみ。
また、カラム名は予約語っぽくないのでざわざわ囲む必要なし。
565 :
NAME IS NULL :2007/07/24(火) 17:08:39 ID:NeXV1fCV
すみません。下のphpコードがうまく動きません… $db = DB::connect("mysql://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME); ここで止まる if (DB::isError( $db )) { die($db->getMessage()); } 試しに1行目を $db = DB::connect("postgresql://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME); に変えるとなぜか動きます… どこに原因があるかすらわかりませんのでどなたか教えてください。
566 :
565 :2007/07/24(火) 17:09:30 ID:NeXV1fCV
565です。 ちなみにエラーはでなく画面は真っ白になります。
>>565 $db = DB::connect("mysql://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME);
じゃなくて
$db = DB::connect("mysqli://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME);
じゃなかったっけ?mysqlじゃなくてmysql「i」。
>>565 情報少なすぎ
まずWEBサーバかPHPのエラーログを確認するのが先決
569 :
565 :2007/07/25(水) 11:41:51 ID:ANMV9j4t
>>567 $db = DB::connect("mysqli://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME);
でやると
DB Error: not found
が表示されます。
でも
$db = DB::connect("mysql://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME);
でやると
真っ白で何も表示されません。
ちなみにこの行の前に
echo "hoge";
とやると表示するのですが、
行の後に書くとやはり何も表示されません。
んで、
$db = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
if (!$db) {
die();
}
else {
echo "OK";
}
こうするといけるんです;
>>586 申し訳ありません。
環境としては、
OS:CentOS 3.6
PHP Version 4.3.2
MYSQL Version 2.6.3-pl1
PEAR.php,v 1.50.2.4
になります。
WEBサーバとPHPのエラーログを見てみたんですが特にエラーは出てないんです。
どうもDB::connect()のどこかでdieみたいな感じで止まってるような気が…
申し訳ありませんが引き続きお願いします。
570 :
565 :2007/07/25(水) 12:07:28 ID:ANMV9j4t
訂正です。 MYSQL Version 3.23.58 です。 phpMyAdminのバージョンを書いてしまいました;
571 :
NAME IS NULL :2007/07/25(水) 12:10:24 ID:vso8Zt4w
>>565 構成が古いみたいだけど
既存システムのメンテナンスかなんかの作業?
だとしてら今まで動いてたとおもうんだけど
動いてたときと動かなくなったときの違いを
示してみたら?
572 :
565 :2007/07/25(水) 12:26:16 ID:ANMV9j4t
>>571 実は今年の5月に借りた専用サーバなんです。
(ちなみにマイティサーバのスタンダード)
んで今回開発用のローカルサーバ(Win)で作成して、
そのファイルを本サーバでテストしようとしたら今回の問題に遭遇してしまいました。
最悪PEARを使わない手もあるんですが、そうなるとDBまわりのソースを全部書き換えないといけないんで
出来ればそれは回避したいです。
引き続きお付き合いお願いします。
573 :
NAME IS NULL :2007/07/25(水) 12:35:36 ID:vso8Zt4w
実機と開発環境のツール類の違いは?
574 :
565 :2007/07/25(水) 12:52:03 ID:ANMV9j4t
>>573 | 実機 | ローカル
OS | CentOS 3.6 | Windows Vista Ultimate
PHP | 4.3.2 | 4.4.6
MYSQL | 3.23.58 | 3.23.49
PEAR | 1.50.2.4 | 1.98
こんな感じになります。
Windows…と思われるかもしれませんが、テスト用のlinuxが社内になく、
致し方なくwinでテストしています;
今年借りたサーバでMySQL3ってなんか嘘くさいっつーか。
576 :
NAME IS NULL :2007/07/25(水) 14:06:03 ID:vso8Zt4w
今皿おそいがWindowsを実機と同等のツールで環境を張った方がよかったね >テスト用のlinuxが社内になく っていうのは共感するけどw linuxのインストールと設定ができるのであればWindowsにVMWare とかで構築するといいよ。オレはそうしてるから。
577 :
565 :2007/07/25(水) 15:48:54 ID:ANMV9j4t
今プライベートのテストサーバ(さくらの共有サーバ)
でさっきのを動かしてみたんですが、問題なく動きました;
どうもPEARのインストールあたりでつまづいてる感じがします…
(レンタルサーバなんでデフォルトでインストールされてる物なんですが…)
一度PEARを再インストールしてみてもう一度試してみようと思います。
>>576 >linuxのインストールと設定ができるのであればWindowsにVMWare
>とかで構築するといいよ。
ありがとうございます。早速試してみます。
社内にテストサーバが無いのは自分とこだけだと思ってましたが、
結構あるんですねw
578 :
565 :2007/07/25(水) 16:21:10 ID:ANMV9j4t
追加情報 $db = DB::connect("mysql://".DB_USERNAME.":".DB_PASSWORD."@".DB_HOST."/".DB_NAME); の"mysql://"の所に"mysql"とか"pgsql"とか本来使えるDBの種類を指定するとだめみたいです。 その代わり"aaaaa"とかありえない文字列にすると$dbにエラーが返ってくるので、 まったくDB.phpが動いてないってわけじゃないみたいです。 ん〜〜Pear自体にバグがあるんですかねぇ?
579 :
NAME IS NULL :2007/07/25(水) 16:34:55 ID:vso8Zt4w
ん〜〜 借りてる専用サーバにどこまで手を入れられる自由度が あるのか知らないけど 環境更新ができるんだったらyumしてみたら。 これまでの流れで一番疑わしいのはPEARだし。
>>578 エラーメッセージじゃなくて、PHPとMySQLの
「エラーログ」を見せてよ。
MySQLに繋がったなら、接続ログ残ってるはずだし
それに続いて何か記録されてるでしょ。
581 :
565 :2007/07/25(水) 18:49:36 ID:ANMV9j4t
>>580 phpのエラーは出てないみたいでログは無いです。
MYSQLのログはなぜか見つからなくて…
(保存設定の場所に何故か無い)
現在そっちで格闘中ですw
582 :
NAME IS NULL :2007/07/25(水) 20:55:16 ID:dIip1FAH
とみーたのメーリングリストはきもーい
583 :
NAME IS NULL :2007/07/26(木) 00:38:49 ID:pBQax6Oq
データインポート後に、後から各レコードにユニーク番号を振ろうとしてるんですが いくら修正しても、255以降のレコードが全部勝手に255になってしまう、という現象に悩まされてます。 何が原因なんでしょう?
>>581 phpのエラーがでないのは
display_errorsがoffになってるからじゃないだろか
586 :
565 :2007/07/26(木) 10:17:08 ID:l0TK3yeO
>>585 いえ、他のエラーはちゃんとログに残っているんでそれはないです。
587 :
NAME IS NULL :2007/07/26(木) 10:45:44 ID:ZNlBUxEh
何故に、Using temporary; Using filesort が行われてしまうのか、 エロい人お答えください。 (MySQL 5.1.9にて) DROP TABLE IF EXISTS TABLE1; CREATE TABLE TABLE1 ( FIELD1 INT(11) NOT NULL DEFAULT 0, PRIMARY KEY (FIELD1) ); DROP TABLE IF EXISTS TABLE2; CREATE TABLE TABLE2 ( FIELD1 INT(11) NOT NULL DEFAULT 0, FIELD2 INT(11), KEY INDEX1 (FIELD1,FIELD2) ); INSERT INTO TABLE1 VALUES(1); INSERT INTO TABLE1 VALUES(2); INSERT INTO TABLE2 VALUES(1, 1); INSERT INTO TABLE2 VALUES(1, 2); EXPLAIN SELECT * FROM TABLE1,TABLE2 WHERE TABLE1.FIELD1=TABLE2.FIELD1 ORDER BY TABLE1.FIELD1;
ORDER BYで2つのカラムから並び順を指定したい場合、どのようになるでしょうか? 例えば hogeテーブルのseqの降順で並べて同じseqのものはtimeの昇順で並べるといった感じです。 SELECT * FROM `hoge` ORDER BY `seq` DESC `time` ASC これだとエラーになりました。
>>588 カンマが抜けてるだけとか
>ORDER BY `seq` DESC `time` ASC
ORDER BY `seq` DESC , `time` ASC
590 :
565 :2007/07/26(木) 12:42:22 ID:l0TK3yeO
565です やっと解決しました!! PEARが問題あると思ってヴァージョンアップしたんですが… 結果は×… そこで 上のソースには書いてなかった部分ですが、 インクルードパスの部分で ini_set('include_path','.:/usr/share'); require_once('pear/DB.php'); を ini_set('include_path','.:/usr/share:.:/usr/share/pear'); require_once('DB.php'); に変えたら… いけました! 元々shareにはsmartyやらなんやら入れていたんで、 そのパスにしていたんですが、DB.phpがrequireしている PEAR.phpの中の諸々のパスが通ってなかったみたいでした… でもなんでエラーログに残ってなかったんだろう… とりあえず原因もわかったのでスッキリです! 571さんをはじめレス頂いた皆さんどうもありがとうございました!!
591 :
565 :2007/07/26(木) 13:00:36 ID:l0TK3yeO
今思ったんですが激しく板違いな質問でしたね… 本当にお騒がせしました;
>>589 さん
ありがとうございます。
自分の視野の狭さにびっくりです。。。
えー加減、phpの問題はそっち関連の板でやれや
595 :
NAME IS NULL :2007/07/27(金) 00:03:57 ID:gg0JCmU1
Windows Vista に MySQL を入れたら異様に接続に時間がかかるんだけど(3秒くらい) そういった症状ありますか?ver.4.1でも5.0でも変わらず。 ファイアーウォールとかアンチウィルスなんかを切っても変わりません。 接続した後はなんら問題ないんですけども。
596 :
593 :2007/07/27(金) 00:28:34 ID:???
解決しますた。
597 :
595 :2007/07/27(金) 02:18:11 ID:???
なぜか今やってみたら正常ですた・・・。 なんだったんだろうか。
598 :
NAME IS NULL :2007/07/27(金) 14:33:57 ID:Xo6cJhj9
DATE型のフィールドに誕生日を保存しているのですが、 そこから20歳未満のデータを取得したいのですが何かいい方法はありませんか? 年齢で別に保存しておかなくてはいけないのでしょうか?
>>598 where 誕生日 > date_sub(curdate(), interval 20 year)
600 :
NAME IS NULL :2007/07/28(土) 14:53:20 ID:X4hyAVEd
自作PHPスクリプトからだとMySQLに接続できるのですが phpMyAdminを使って接続しようとすると、 Access denied for user 'username'@'localhost' (using password: YES) とエラーが出てしまいます。 どうすれば良いのでしょうか…?
601 :
NAME IS NULL :2007/07/28(土) 15:18:38 ID:eFtPhvG6
テーブルをまたいでsum値をとりたいのですが、SQLで可能でしょうか? select sum(data) from table1; これで、table1のdataの積算が取れますが、同じテーブル構造の table1,table2,table3 があり、三つのdataの合計値を求めたいんです。
>>600 phpMyAdminに設定されてるパスワードを確認しる
>>601 sum(table1.data)+sum(table2.data)+sum(table3.data)
ブルブルブル
>>604 その質問の仕方だと、Cの初心者?
言語そのものをもう少し勉強するか、使いやすいスクリプトにかえたほうがいいんじゃない?
mysqlコマンドのソースぐらい解析してパクればいいのに。
607 :
604 :2007/07/31(火) 00:49:52 ID:???
クライアントライブラリにリンクしていないだけなのか? プログラムの問題より開発環境を整えなければ・・・
WHERE INで検索する値は最大何個なんでしょう。 公式ドキュメント見ても書いてない…。
ざっと400
610 :
NAME IS NULL :2007/07/31(火) 13:59:13 ID:WUqKUQvr
tbl1 [id][name][point] [1] [山田][25] [2] [大川][69] [3] [東野][78] [4] [品川][11] というデータがあり、 tbl2 [id][test][date] [1] [30] [2007-07-31] [3] [43] [2007-07-28] [4] [88] [2007-06-30] [2] [29] [2007-06-27] [1] [21] [2007-06-14] [3] [57] [2007-05-27] というデータを結合させたいのですが、 tbl2のデータはそのidごとの最新の1件のみ結合させたいのです。 つまり、これをLEFT JOINしてみると SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id = tbl2.id [1] [山田][25] [30] [2007-07-31] [1] [山田][25] [21] [2007-06-14] [2] [大川][69] [29] [2007-06-27] [3] [東野][78] [43] [2007-07-28] [3] [東野][78] [57] [2007-05-27] [4] [品川][11] [88] [2007-06-30] と、同じIDでも複数行になってしまいます。 これを [1] [山田][25] [30] [2007-07-31] [2] [大川][69] [29] [2007-06-27] [3] [東野][78] [43] [2007-07-28] [4] [品川][11] [88] [2007-06-30] のように、dateが一番最新の1件のみずつ結合させたいのですが可能でしょうか?
611 :
NAME IS NULL :2007/07/31(火) 14:49:21 ID:HtfeXAjK
>>551 質問する前にログ呼んでいたら俺にとって神っぽいのがあったyo!
613 :
NAME IS NULL :2007/07/31(火) 16:41:36 ID:WUqKUQvr
>>612 たまたま苦手な科目だったので大丈夫です。
彼は結構努力家なので頑張ればできる子だと思います。
>>610 グループ化中の最大小値の行抽出は
サブクエリ使うしかなかった様な(?)
viewってどのタイミングでデータ取得してるんですか? 参照してるテーブルがちょっとでも変わるとコロコロデータ変わるの? それともviewを参照した時点で変わるんですか?
test
>>610 tbl2 を id で group by した結果を join する訳だが、group byで
チョイスされるレコードを制御できれば解決だよね?
group by は最初に見つかったレコードをチョイスする特性があるので、
まずサブクエリで並べたい順番に order by した結果を group by する。
DISTINCTしたテーブルの行をCOUNTで返すことは可能でしょうか? 以下のようなsql文で行の数を返した見たのですが、 重複したすべての行の数も返されてしまいます。 SELECT DISTINCT host, COUNT( host ) AS `行` , `url` FROM access GROUP BY `host` ORDER BY `行` DESC LIMIT 0 , 30
620 :
NAME IS NULL :2007/08/01(水) 15:57:17 ID:UEnuxYzb
質問、、というかおねがいです。 今、「mysql入門以前」という本を使っていて、ユーザはroot でのみ作業しています。 それで、PHPとの連携とかは多少できるようになったんですが、DBのバックアップなど運用系については 知識皆無です rootユーザで全部やるとまずいんだろうと思いますが、どのヘンがまずいかなども よくわかっていません。 なので、その辺について詳しく書いている本を教えてもらえないですか? 単純にcmdからの操作やコードについてでなく、mysqlの運用・保護・セキュリティまで 概念の面でもさっくり解説している解説書を希望してます。 皆さんの経験上これは良かったぞというものがあったらお願いします。 また、ついででいいですが、LINUX+APACHEでのwebサーバ運用のセキュリティ本 (初級〜中級レベル)でオススメの物があったらそれもおねがいします。 済みませんが、よろしくおねがいします。
621 :
620 :2007/08/01(水) 16:00:01 ID:UEnuxYzb
すみません 書き忘れてました。 mysqlのバージョンは5です 今の開発はwinXP+apache2ですが、将来は centOS4 + apache2 で運用したいと思います どなたかお暇な方おねがいします。
それぞれのCollationが どういう順序で照合していくのかは どうやれば分かりますか?
show collation
>>624 それぞれのcollationの詳細が知りたいんです
たとえばutf8_general_ciとutf8_unicode_ciがどう違うのかとか…
mysqlにおける データベース名、テーブル名、カラム名の 最大長はいくつでしょうか?
>>619 count(distinct host) で、どない?
628 :
620 :2007/08/02(木) 06:39:25 ID:???
UPDATE文の中でINNER JOINを使うには どう書いたらよいでしょうか?
>>629 UPDATE tbl1 INNER JOIN 〜 ON 〜 SET
でいけるんじゃない?
631 :
629 :2007/08/02(木) 19:15:24 ID:???
>>630 できました!構文の順序を間違ってたみたいです。ありがとうございます。
テーブルではなく、テーブル内の特定行を誤って削除してしまいました。 操作ログはどうやらないようなのですが、これを復旧する方法はあるのでしょうか? もしあれば、教えていただけないでしょうか……。
mysql 4.1.20 です。
以下のように、varchar(100) のカラムを作りました。
create table foo (
hoge varchar(100) NOT NULL
)
PHP で、101 文字以上の文字列をこのカラムに insert しても、
桁あふれエラーにならず、100文字で切り捨てられて格納されます。
↓をみても、このような動きは正しいようなのですが、
http://dev.mysql.com/doc/refman/4.1/ja/char.html > CHAR 型または VARCHAR 型のカラムに、そのカラムの最大長を超える値を割り当てると、
> カラムのサイズに合わせて値が切り捨てられます。
MySQL ってこういうものなのでしょうか??
Oracle とかだと桁あふれで ORA-ほにゃらら が発生するので、
いつもアプリ側で桁チェックしていたのですが・・・
634 :
NAME IS NULL :2007/08/03(金) 08:52:42 ID:zkXqSFX2
MySQL Version 5 UTF-8 という作りのレンタルサーバーを利用しています。 このサーバーに、SJISからEUC-JPにエンコードしたデータを格納し、 EUC-JPからSJISにエンコードして参照している状況なのですが、 「ひらがなによるソート」を試みたときに並びが滅茶苦茶になってしまいます。 「あ→か→さ→た」となるべきところが「た→あ→か→さ」となる感じです。 サーバーのサポートが当てにならないのでここにきました。どこに問題があるのか分かる方がいましたら教えてください。
>>633 5.0以降ならsql_modeを指定すればOracleのようにできます。
4.1でもsql_modeを指定すればできるかもしれないけど調べてません。
>>633 create table時にcharsetにujisかeucjpmsを指定すればいいでしょう。
あるいはtextじゃなくてblobにすればソートされる気がするけど、お勧めはしない。
637 :
634 :2007/08/03(金) 10:57:30 ID:zkXqSFX2
>>636 このレスは
>>634 宛とみてよいでしょうか?
ありがとうございます。
早速試してみて、また経過を報告させていただきます。
>>632 バイナリログか定期的なdumpをしていないのならば諦めるほかあるまい。
mysql 5.0.x MyISAM だけれども、 ・あるはずのデータがqueryされないことがある ・count(*) では正しい件数が出てくる ・原因不明なので、テーブル repairすると特にエラーがあった訳ではないがその後正しくqueryされる という怪現象に遭遇中、同じ経験をし克服したヤツいますか?
>>639 indexが壊れてる気がする
myisamchkとかしてみそ
>>640 ありがとう。
check table すると壊れてないって言ってくるけど、repairすると直る。やはりエラーはなし。
"myisamchk -r xxx" = "repair table xxx" だと理解しているが今度出たらやってみる。
クエリキャッシュがなぜかリフレッシュされないことがあるのか?
と思ってきたので、RESET QUERY CACHE をしてみる。
642 :
634 :2007/08/03(金) 19:59:18 ID:???
色々といじってみましたが、解決しないのでもう一度お願いします。 試行したことは以下の通りです。 MySQL の文字セットは UTF-8 Unicode (utf8) ブラウザはShift_JIS ・接続照合順序、テーブルの照合順序をujis_japanese_ciにしてSJISで格納しSJISで出力→ソートが上手くいかず、「か」等の文字で文字化け ・接続照合順序、テーブルの照合順序をujis_japanese_ciにしてSJISで格納しEUC-JPで出力→文字化け ・接続照合順序、テーブルの照合順序をujis_japanese_ciにしてEUC-JPで格納しSJISで出力→「か」やさ行の文字で文字化け ・接続照合順序、テーブルの照合順序をujis_japanese_ciにしてEUC-JPで格納しEUC-JPで出力→文字化け ・接続照合順序、テーブルの照合順序をeucjpms_japanese_ciにしてSJISで格納しSJISで出力→文字化け ・接続照合順序、テーブルの照合順序をeucjpms_japanese_ciにしてSJISで格納しEUC-JPで出力→文字化け ・接続照合順序、テーブルの照合順序をeucjpms_japanese_ciにしてEUC-JPで格納しSJISで出力→文字化け ・接続照合順序、テーブルの照合順序をeucjpms_japanese_ciにしてEUC-JPで格納しEUC-JPで出力→文字化け ・接続照合順序、テーブルの照合順序をutf8_general_ciにしてSJISで格納しSJISで出力→文字化け ・接続照合順序、テーブルの照合順序をutf8_general_ciにしてSJISで格納しEUC-jPで出力→文字化け ・接続照合順序、テーブルの照合順序をutf8_general_ciにしてEUC-JPで格納しSJISで出力→文字化けはないがソートに失敗 ・接続照合順序、テーブルの照合順序をutf8_general_ciにしてEUC-JPで格納しEUC-JPで出力→文字化け ・接続照合順序、テーブルの照合順序をutf8_general_ciにしてUTF-8で格納しUTF-8で出力→文字化けはないがソートに失敗 phpmyadminで格納されたデータをみると、どの場合でも「??????」あるいは他の意味不明な文字列になっていました。 localhostではソートも上手くいっていたのですが・・・なぜ上手くいっていたのかもわかりません。 どなたかご指摘お願いします。
>>642 その調子だと、格納がちゃんとされているのかも怪しいけど
644 :
634 :2007/08/03(金) 20:34:38 ID:???
>>643 insertしたい文字列を
$str = mb_convert_encoding($str, "EUC-JP", "SJIS");
としたあとにinsertしていますが、こことは違う問題でしょうか?
>>642 クライアントの文字セットが何になってるか確かめてちょ。
とりあえずeucjpでつっこむなら、一番最初のSQLで
set names eucjpms
か
set names ujis
を実行すること。
(上がダメなら set names binary って手もあるけど、オススメはしない)
646 :
634 :2007/08/03(金) 21:46:49 ID:???
>>645 643さんとあわせてありがとうございます。
クライアントのほうは| character_set | sjis となってます。
インストールしたままの状態で利用しています。
set namesについては今から試してきます。
647 :
634 :2007/08/03(金) 22:23:15 ID:???
>>645 set names UJISを実行したうえで
接続照合順序、テーブルの照合順序をeucjpms_japanese_ciにしてEUC-JPで格納したところ
phpmyadmin上では綺麗にひらがなで表示されていました。うれしいです。
しかしこれをSJISに出力しようとするとやはり文字化けしまうようです。
>>647 データベースに格納している文字セットに関わらずクライアントで指定している文字セットで取得するので、
(よーするに格納している文字セットとクライアントの文字セットが違う場合は変換してくれるワケ)
クライアントの文字セットが
ujisやeucjpmsになってるなら出力する前にsjisに変換する必要があるし、
sjisやcp932なら変換する必要はないです。
これ以上はたぶんスレ違いなのでPHPスレでどーぞ。
649 :
634 :2007/08/03(金) 23:03:18 ID:???
>>648 すみません、言葉足らずだった部分があったのでここだけ訂正します。
PHPの話題になってしまうのですが、
$str = mb_convert_encoding($str, "SJIS", "XXX")
を実行して変換は行ったうえで、なお文字化けしてしまうということをお伝えしたかったのです。
アドバイスを元にまた試行錯誤してきます。丁寧に対応してくれてありがとうございました。
650 :
NAME IS NULL :2007/08/04(土) 13:59:02 ID:HPcoDndd
すみません、質問させてください。 今まで2台のサーバでPHPで作ったウェブサイトのデータベースを運用していました。 それぞれ、my.cnfにて文字コードをutf8とujisに設定してました。 が、このたび、それを1台にまとめて、utf8とujisのデータベースを共存させたいのですが、 うまくできません。 ためしに、my.cnfでdefault-character-setを設定せずに、従来のデータベースをmysqldumpからエクスポートしたものを そのまま新しいサーバに入れてみましたが、ブラウザからみると見事に文字化け。 その後いろいろと試してみましたが、うまく行きません。 PHPを全くいじらずに、mysqlサーバの設定だけで全てがうまく行く方法はないものでしょうか?
>>650 運用中である2台のサーバのMySQLバージョンは?
そして1台にまとめたあとのバージョンは?
652 :
650 :2007/08/04(土) 15:06:54 ID:HPcoDndd
レスありがとうございます。 元のサーバのバージョンが4.1.20 移行先のサーバのバージョンが5.0.22です。
>>652 運用中の2台をそれぞれA,Bと、以降先のをCとします。
まず、AとBのダンプをmysqldumpで、オプションに
--default-character-set=utf8を指定して出力する。
そのダンプをCに突っ込めばうまくいくんじゃないのかな?
質問です。 WHERE句で `age' = 10 OR `age` = 20 OR `age` = 30 と `age` IN (10, 20, 30) とやるのでは、効率などに違いはないのでしょうか? 動作的には同じ結果が出たのですが、負荷に違いがでるのか気になります。
INのほうが速い
656 :
NAME IS NULL :2007/08/05(日) 12:21:47 ID:ihsPXEFs
5.1は永遠のベータ版ダナ〜
utf8に統一すれば、問題回避できるのにアフォな香具師が多いな。
UTF-8に統一できない政治的問題が多いからな クライアントの指示が絶対だったりサーバに手を入れることが 不可能だったり
MyISAM VARCHAR(100)のフィールドに数値2.2(引用符囲まず))をINSERTすると 2.1900000000〜〜 と近似値小数点以下数桁で格納されてしまいます、 仕様でしょうか?
4.1.18で上記現象を確認しました、 5.0.27では「2.2」そのままで格納されました・・・4.1系特有の現象(バグ?)でしょうか・・。
>>660 そうだよ。仕様だけどな。
公式にもあったよ。桁数がたんねーから丸まるってさ。
662 :
NAME IS NULL :2007/08/06(月) 16:37:01 ID:/MGn34vw
MySQLで独自の関数みたいなものを作る方法はあるのでしょうか?
MySQL 4.1.20 です。 InnoDB でテーブルを作成しました。 (正確には MyISAM でテーブルを作って、InnoDB に変更しました) 質問が2点あります。 ○1: mysql コマンドで DB に接続し、 > set autocommit=0; を実行すればオートコミットは off になりますが、 たまにやりわすれてしまい、さらにそのあとの更新系の SQL を間違えて データを余計に消したりしてしまいます。 set autocommit=0; をデフォルトの挙動にすることはできますか? my.conf に書けないかなとぐぐったのですが、見つかりませんでした。 ○2: set autocommit=0; や begin; や rollback: は、 コマンドドラインの mysql コマンドで SQL を投げているときは有効ですが、 MySQL Administrator の Edit Table Data で開く MySQL Query Browser では トランザクション管理が効きません。 begin; [alt + enter]して、画面下部に Query returned no resultset. と表示された後、 更新系の SQL を投げて、 rollback; [alt + enter] しても、 ロールバックされずにコミットされているようです。 MySQL Query Browser でトランザクション管理するには どうしたらいいでしょうか?
665 :
NAME IS NULL :2007/08/06(月) 21:35:47 ID:FNS0/TEW
運用中のサイトとのかねあいで mysql4.0をダウンロードしたいのですが mysqlのサイトで該当ページを見つけることができません。 どこでダウンロードできるのでしょうか?
>>665 MySQL入門以前って本に 4.0のバージョンが付いている。どこぞでダウンロードできるかどうかは知らね。
ODBC関数のodbc_fetch_rowと同じものってMYSQL関数にある?
毎週x日リセットのレンタルランキングシステムを作ってるんですが、DB構造で悩んでます。 以下のどちらがいいでしょうか? 1)[site_tbl]サイト情報(`site_seq`,`id`,`pass`,`title`等)にリセット日を入れてcronでチェック 2)別にテーブル[reset_tbl]を作る(`site_seq`,`reset_day`) どちらが一般的でしょうか? また、作成したことがある方いらっしゃいましたらテーブル構成を見せていただけないでしょうか?
>>669 説明が下手だね。
良くわかんないけど、テーブル的に期間は気にせずにdailyとか溜めていってクエリで特定の期間内を条件にランキングを出せば。
671 :
NAME IS NULL :2007/08/07(火) 19:46:33 ID:idn6dm6M
2つのテーブルに入ってるデータの重複カウントを取りたいのですが、 どうやるのが一番軽いでしょうか? select count(*) from a,b where a.data = b.data では応答がなくなってしまいました。 テーブルaには15万行のデータがあります。 またテーブルbには2万行のデータがあります。 実行環境はwindowsのヘボマシンです。 無理でしょうか?
672 :
NAME IS NULL :2007/08/08(水) 02:09:47 ID:lZHQNHvN
phpMyAdminでテーブルのチェックをやると、 table 〜 is marked as crashed and shuld be repaired と表示されるようになりました。 マークをされたのは分かりましたが、 このマークはいつの段階で利用されるのですか? 再起動時でしょうか?
673 :
NAME IS NULL :2007/08/08(水) 02:18:10 ID:lZHQNHvN
myisamchkでrapairしたら出なくなりました 自動で行われるのではなく、 こんなふうに自分でやらないといけないのでしょうか・・・
mysqlで、サーバのメモリが4GBとして、 1GBぐらいのデータベース(書き換えはあっても増えないデータベース) をメモリ上に常駐して高速化する方法ってあるんでしょうか? (更新データは随時ディスクに書き込み)
676 :
NAME IS NULL :2007/08/09(木) 04:36:15 ID:svmYyWXz
677 :
NAME IS NULL :2007/08/09(木) 07:06:23 ID:cTeGMyVr
質問です 以下のテーブルを作成し mysql> create table m_member( -> id mediumint not null auto_increment,username varchar(50), -> password varchar(50),last_name varchar(50), -> first_name varchar(50),birthday char(8), -> ken smallint,reg_date date, -> cancel date,PRIMARY KEY(id)); 以下のinsertをしたところエラーがでました なぜでしょう? よろしくお願いします mysql> insert into m_member(username,password,last_name,first_name,birthday,ken, reg_date,cancel) values('user','1a1dc91c907325c69271ddf0c944bc72','苗字','名前', '20050101','1',now(),NULL); ERROR 1406 (22001): Data too long for column 'last_name' at row 1
>>675 他にメモリを食うプロセスが走ってなければ、
そのくらいならOSがメモリにキャッシュするんじゃないかと期待。
変なOS使ってなければの話だけど。
MySQLで遊んでみたいのですが、ライセンス料金がかかると言われました。 個人で触ってみたいのですが、ライセンスキーを購入しないと行けないでしょうか? 商用でMySQLを使っているサイトは、すべてお金を払って使っているのでしょうか?
FC6でMySQLServerが動作しており,そのマシン上でQuery Browserをインストールして データベースへアクセスすることはできますが,Cのプログラムを用いて, mysql_real_connectで接続することができません. サーバ側に何か設定等が必要ですか.
683 :
676 :2007/08/09(木) 23:11:09 ID:???
やっぱりロックされますね checkしている対象テーブルだけじゃなく 関係ないdbにすらアクセスできなくなる。 稼働中にほいほい気軽に実行できるモンじゃないんですね
684 :
NAME IS NULL :2007/08/10(金) 11:42:33 ID:qyxNqw9Z
ID毎に設定された連番の最大値 + 1をINSERTしたい場合って どうやるのが一番スマート?例えば ID NUM 1 1 1 2 1 3 2 1 2 2 3 1 3 2 みたいなテーブルがあって、IDが1の場合にはNUMに4を入れたいって場合、 いちいち SELECT MAX(NUM) FROM TABLE WHERE ID = 1 やんなきゃ ならんのかね? KEY毎にAUTO_INCREMENT設定みたいのはないよね?
685 :
684 :2007/08/10(金) 11:54:41 ID:qyxNqw9Z
ごめん、
>>684 はID、NUM以外にPRIMARYな列があり、
そこに既にAUTO_INCREMENTがされている状態って前提
686 :
NAME IS NULL :2007/08/10(金) 12:18:28 ID:k2YUxwj6
初歩的な質問ですみませんが 例えば select * from a left outer join b〜 left outer join c〜 みたいに書くと テーブルAに対してそれぞれBとCのテーブルがleft outer joinされるのか それともテーブルBに対してCのテーブルがleft outer joinされるのでしょうか? 自分は前者として考えて使っているのですが間違っていますでしょうか?
687 :
NAME IS NULL :2007/08/11(土) 02:52:31 ID:e9CmJUOZ
show table status; を実行すると、テーブル一覧とその属性が表示されますが、 項目が多すぎて見にくいです。 必要な項目だけ絞って表示することはできますでしょうか。 たとえばテーブル名(Name)と更新日時(Update_time)のみを表示する、 といったことがしたいです。
desc カラム名
689 :
NAME IS NULL :2007/08/13(月) 14:01:48 ID:mHaldFym
データベースの大きさってどのくらいになるのかって話です。データベースによって違うと思うのですが、MySQL を使いたいなと思っているので、ここに書き込みます。 例えば、1 レコードあたり、数値・文字列などの情報で 100 byte のデータを 100,000 件データベースに投入すると、 100 * 100,000 = 100,000,000 byte = 95 MB のようなディスクの領域が必要になるのでしょうか? 検索用のインデックスとかを保存する領域とかも他に必要になってくるんですかね? どんな計算をするものなのか、教えてもらえたらと思います。 または「ここを見ろ」などの情報でもありがたいです。 よろしくお願いします。
690 :
NAME IS NULL :2007/08/14(火) 12:52:48 ID:vLfyd2Go
>>689 です。
人が少ないようなので、他でもきいてみます。
マルチポストになりますが、すみません。
>>689 show table status like 'hoge'; の出力を見ると当たり前だが・・
Avg_row_length * Rows が DBファイル "hoge.MYD" のニアリサイズになる。
Avg_row_lengthを基準にして今後のレコードの増加によるDBのディスクサイズを想定する。
つまり可変長テーブルではある程度データが揃わないと算出できない。
また削除や更新が頻繁に行われるとフラグメーションが起こるので注意。
MyISAM なら optimize table で解消される。
>>684 サブクエリを使え。
SELECT MAX(NUM)+1 FROM TABLE WHERE ID=1 か。
693 :
NAME IS NULL :2007/08/14(火) 15:37:13 ID:r5/gZLeq
ちょいと気になったんだが 一回のクエリに一本のインデックスしか使わないMySQLだけど、 サブクエリの場合、それぞれのクエリに別々のインデックス使えるの?
PHPだとdb_convert_encodingで文字コードのコンバートができますが, C言語はこのような関数はありますか?
>> 693 使える
>>695 そうなのかー
サブクエリ化することで高速化する
みたいなこともできそうだね
ありがとう
>>696 サブクエリでなくて複数テーブルの join でもテーブル毎にインデックスが使われる
>>693 あれ、これって5.0だか5.1で変わってなかったっけ?
700 :
NAME IS NULL :2007/08/15(水) 16:52:21 ID:TNiife/O
Linuxで取得したmysql 3.23のdumpファイルを Windows版のMySQL 3.23にリストアしようと mysql < dumpfile したら Unknown command '\n'. って表示されるんだが、 dumpファイルのTEXT型の列のデータに '\n'が含まれている場合に、 エラー無くリストアする手段を教えてください。
701 :
700 :2007/08/15(水) 17:03:49 ID:???
情報後出しスマソ。 dumpファイルの文字エンコードはutf8だった。 Databaseのデフォルトキャラクタセットはlatin1。 このあたりの問題だとしたら、 どうやったら回避できるのでしょうか?
>>701 で、このまま latin1 で運用続けるつもりかい?
703 :
700 :2007/08/15(水) 18:45:37 ID:???
>>702 latin1にこだわりはないので、
MySQLの再インストールも辞しません。
ちょ・・ま・・・改行コード落ちじゃねぇだろな
1つのテーブルに seq| 種別 | 生産日 | 販売日 | 修理日 | 1 | 1 |2000-01-01|2001-01-20|2002-01-25| 2 | 1 |2000-01-01|2001-01-20|2003-01-25| 3 | 1 |2000-01-01|2001-01-20|2003-02-25| 4 | 1 |2001-01-01|2001-01-20|2003-01-25| 5 | 2 |2000-01-01|2001-01-20|2003-01-25| というデータがあった場合。 修理日2002-01-01〜2003-12-31で検索した場合、SEQ 1,4,5のデータを 修理日2003-01-01〜2003-12-31で検索した場合、SEQ 4,5のデータを1つのクエリで取得したいのですが可能でしょうか? 具体的には、種別、生産日、販売日の組が同じものは同一の品物とみなし、 最古の修理日が指定範囲に入っているかどうかを判定したいのですが上手く行きませんでした。 OS:Windows Xp DB:Mysql 4.0.27 作成し失敗したsql(最古修理日を指定する前にエラーになります。実際のカラム名はローマ字です) mysql> SELECT seq,種別,生産日,販売日 FROM table -> WHERE (種別,生産日,販売日) IN -> (SELECT DISTINCT 種別,生産日,販売日 FROM table -> WHERE 種別 IS NOT NULL -> AND 生産日 IS NOT NULL -> AND 販売日 IS NOT NULL -> AND 修理日 IS NOT NULL); ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp onds to your MySQL server version for the right syntax to use near '生産日,販売日) IN (SELECT DISTINCT 種別,生産日
効率悪いかも知れんけど、こんな感じで行けると思う。 seq無しでもレコードが一意になるなら最後のgroup by等は不要。 select min(seq), 種別, 生産日, 販売日, 修理日 from table1 where(種別, 生産日, 販売日, 修理日) in (select 種別, 生産日, 販売日, min(修理日) from table1 group by 種別, 生産日, 販売日 having min(修理日) between '2002-01-01' and '2003-12-31') group by 種別, 生産日, 販売日, 修理日;
4.0はサブクエリ使えんでしょ
708 :
705 :2007/08/16(木) 07:57:47 ID:???
>>706 さん
>>707 さん
制限の無いサブクエリをサポートしたのが4.1〜だと気づかず構文エラーを繰り返して、悩んでおりました。
JOIN を使うか、アプリ側で制御する事にします。
ありがとうございました。
>>700 Windows版か・・・
Windowsディレクトリとかにある my.ini をエディタで編集し、
[mysql] と [mysqld] の下に default-character-set=utf8
を追加してサービスを再起動する。
Windows版にはadminツールみたいなGUIアプリが付いているみたいだけどそこかも出来るかも。
MySQL 5.0.27 + MySQL ODBC Connector 5.00.11-beta + C でコーディング中 my.ini で [client][mysql][mysqld] 全部 default-character-set=utf8 を指定して再起動 コンソールから status; show variables like '%char%'; で全部 utf8 になってるのを確認 ODBC クライアント側でデータ取り出すと日本語文字化け(なんか余計な変換して壊してるっぽい) 接続後に set character set utf8; ステートメントを発行しても同じ ついでに念のため skip-character-set-client-handshake も指定しても変わらず ODBC 使わずに libmysql (mysqlclient) 使ったら utf8 でちゃんとアクセス出来ている つまり ODBC のバグっぽ こんな漏れに愛の手を
711 :
sage :2007/08/17(金) 07:39:19 ID:???
何が問題なの?
712 :
700 :2007/08/17(金) 23:11:42 ID:???
>>704 改行コードは全てのINSERT文ごとに
入っているように見えるのですが、
確実にCRLFかと言われると
そうでないかもしれませんね。
念のため、dumpファイルの中身を
再確認したいと思います。
>>709 試してみたんですが、
MySQLのサービスが正常に起動しませんでした。
自分のやり方が間違っていないか、
月曜に再確認しながらやってみます。
>>710 MySQLのODBCは昔からバグだらけ
直す気ないみたいだから
素直にlibmysql使うが吉
714 :
NAME IS NULL :2007/08/18(土) 00:37:18 ID:Jizu4jHd
侵入されたようだ。
ネットに似たような症例が見付からなかったので書いとく。
3.23.52をパスワードなしで動かしっぱなしにしていた。
McAfeeのウイルス警告で気付いた。
C:\clown.dll、C:\windows\system32\clown.dll
が突然作成され、McAfeeがこのファイルを削除した。
このときネットワークを確認すると、
mysqld-nt.exeの3306ポートから
外部の220.64.218.159と220.118.88.20に接続した
2つのセッションが存在していた。
ネットワーク停止後、mysqlを自動起動しないようにした。
http://itpro.nikkeibp.co.jp/free/ITPro/USNEWS/20050128/155389/ と発生条件は同じだが、症状は異なるみたい。
データベースmysql内のテーブルは
columns_priv, db, func, host, tables_priv, user
のみ。funcの中身は空。
実害があったのか、今のところ不明。
パスなしで使う香具師は馬鹿 3306を外部に開放する椰子も馬鹿
DB鯖をインターネットに繋いでる時点で論外。 DB鯖は、ファイヤーウォールの中で動かすものだし。
MySQL 4.1.15 テーブル Shouhin Goods_id 5桁の数字 Joken_a 1,2,3 Joken_b 1,2,3 とあり、Joken_aから1,2のみを取り出したいけど、 Joken_aが1のものについてはJoken_bから3のみを取り出したい と言った時にどういう風にSQLを書けば良いんでしょうか
select * from Shouhin where (Joken_a = 1 and Joken_b = 3) or Joken_a = 2;
>>718 あぁ、or でつなげば良いんですよね。すいませんでしたm(__)m
Cでプログラムをしているんですが, int uid = 123; として,UserInfoテーブルからUserIDが123を取り出したいのですが以下ではできません. mysql_query(mysql, "SELECT * from UserInfo WHERE UserID=uid"); 「UserID=uid」この部分はどのように記述すれば良いですか?
>>720 ちゃんとCの勉強してる? intを文字列に変換して連結でしょ。
もいっこのやり方は…書くのめんどい。
すまない.連結?がよくわからない・・・
char *querystring = "SELECT * from UserInfo WHERE UserID=%d"; sprintf(querystring, querystring, uid); mysql_query(mysql, querystring);
725 :
720 :2007/08/19(日) 16:02:03 ID:???
sprintf(querystring, "\"SELECT * from UserInfo WHERE UserID=%d\"", uid); mysql_query(mysql, querystring); このやり方は無理?
726 :
720 :2007/08/19(日) 16:22:04 ID:???
サンクス.できた
個人情報のテーブルを作ろうと思っています。 ex) 名前|性別|年齢|趣味|・・・・ レコードを追加していってレコードの数が大きくなったら、 テーブルを分けた方が良いのでしょうか? ※「良い」というのは、参照効率やメモリ・CPUの負荷、等の面で
そりゃあーた何をどうしたいかによる罠、 依存関係やらどう運用するかで決まるし、 最初の設計で皆苦労しとるんよ。
729 :
NAME IS NULL :2007/08/20(月) 02:49:49 ID:R3oVd09H
ライセンスの件で質問です。 バンドメンバー募集サイトのWebアプリケーションを 個人で作っているのですが、MySQLはサーバー側のみで 使用するので当然アプリやMySQLを配布する訳ではないので 有料ライセンスにはならないですよね。 スポンサーの広告収入で運営したいと思っているので 一応商用サイトにはなると思うのですが。
>>730 ありがとうございます、スッキリしました。
>>724 よく見ると恐ろしい sprintfだな。
しかし小学校では女子だけ体育館に集合する事はあってもCの勉強はないヨ。
ぱっと見でおかしいだろ。
735 :
NAME IS NULL :2007/08/20(月) 22:15:18 ID:prQ3mqs2
5.0.41のWindows用ソース(mysql-5.0.41-win-src.zipかmysql-5.0.41-win-src.tar.gz)を探しているのですが、見つかりません。 Sennaのコンパイルに.dswファイルが必要なのです。 どこにあるのでしょうか?
736 :
735 :2007/08/20(月) 22:17:41 ID:prQ3mqs2
>>735 mysql-5.0.41.tar.gzには.dswファイルはありませんでした。
そんなファイルはありまsenna
mysql-5.0.45-win-src.tar.gz があるけど こっから取り出したらいいんじゃないかな
739 :
NAME IS NULL :2007/08/20(月) 23:20:17 ID:IoKE2vQO
SQLについて(というかデータベースについて)かなり初心者のものです。 いま、JAVAで書けば次のようなインスタンスの配列を管理したいと考えています。 class Student // 生徒データ { int number; String class_name; } class ClassRoom // 教室データ { String name; Vector<String> student; // この教室の生徒のnumberの配列 } この関係をデータベース化するにはどのような構成にすればよいのでしょうか? CREATE TABLE STUDENT ( number INTEGER UNIQUE, class_name CHAR(20) REFERENCES classroom(name), ); CREATE TABLE CLASSROOM ( name CHAR(20) UNIQUE, /* STUDENTの配列の管理方法がわからない */ ); CLASSROOMの新しい要素がINSERTされるたびに、追加されたCLASSROOM.nameと同じ 名前のテーブルを作り、そこに格納するという方法が考えられますが、 その方法はベストといえるのでしょうか? 当方かなり初心者です、ご指導お願いいたします。
Vector<String> student; // この教室の生徒のnumberの配列 は Vector<int> student; // この教室の生徒のnumberの配列 でした、しつれいしました。
>>728 >>732 なるほど、ありがとうございました。
レコードを1行作ってみてどの位の大きさになりそうか見積もってみます。
日本国内をターゲットにしたのサイトなので、最大約1億レコードで
運用上問題なければOKかと・・・(笑)
742 :
735 :2007/08/21(火) 00:05:52 ID:oSdLFFt+
>>738 レスありがd
unix系に不案内なのでよく分からないのですが、そんなモンなのでしょうか?
っていうか、.dswなのでWindowsの話?
とりあえず、やってみます。
743 :
NAME IS NULL :2007/08/21(火) 01:15:19 ID:iiLEoTiD
>>739 CREATE TABLE STUDENT
(
number INTEGER UNIQUE,
class_name CHAR(20) REFERENCES classroom(name),
);
CREATE TABLE CLASSROOM
(
class_id INTEGER,
name CHAR(20) UNIQUE,
/* ここはクラスごとの属性 */
);
CREATE TABLE STUDENTINTHECLASSROOM
(
class_id INTEGER, /* number of ClassRoom */
number INTEGER, /* number of Student */
);
>>743 参考になりました、どうもありがとうございます。m( )m
昔は第三正規化とか言ってたけどいまはそういう名称使われないの?
いや使うだろ。 ただ、不勉強な人にそんなことを言っても通じないだろうから使ってないんじゃね?
748 :
700 :2007/08/22(水) 10:16:01 ID:???
コマンドプロンプトから、 mysql db_name -u user_name --password=password < dump_file_name って実行すれば何の問題もなく流れました。 己の愚かさに反省。orz そして助言してくれた皆様に感謝。 ・・・吊ってくる ノシ
テーブルadminに対してテーブルclientがあります。 adminの特定データを削除するときに関連するclientのデータも 一気に消したいと思い下記のようなSQLを実行しましたが adminのデータは削除できませんでした。 DELETE admin a, client b FROM admin a LEFT OUTER JOIN client b ON a.id = b.id WHERE a.id = 1 このときのclientには、まだ関連するデータが無い状態です。 こういう場合は、別々にSQLを切らなきゃダメでしょうか?
↑これですが、私の確認ミスで問題ありませんでした。 スレ汚し失礼しました。
751 :
NAME IS NULL :2007/08/22(水) 16:18:43 ID:JIJXKf2H
backup200701.sql backup200702.sql … 上記のように、あるテーブルのデータを月別に出力したファイルが数か月分あるのですが、 mysql dbname < backup200701.sql -u root -p pass mysql dbname < backup200702.sql -u root -p pass とインポートすると、一度drop table してるようで、前にインポートしたレコードが消えてしまいます。 これを01を消さずに02,03と追加していく良い方法ないでしょうか?
backup******.sqlの中にdrop tableやらcreate tableやら入ってるだけじゃないの? 元のファイルのエクスポート方法を見直すのが一番速いと思うけど それが出来ないならシコシコとコメントアウト。
公式から、ダウンロードするとき 個人情報を入力しないといけないようになりました?
>>754 あ、小さい文字でなんかありました。
ありがとうございます。
element_tbl user_seq master_seq number user_tbl user_seq name age master_tbl master_seq item こんなテーブルがあった時、 select `user_tbl`.`user_seq`, `user_seq`.`name`, `element_tbl`.`master_seq` FROM `user_tbl`, `element_tbl` WHERE `user_tbl`.`user_seq`=1 and `user_tbl`.`user_seq`=`element_tbl`.`user_seq` GROUP BY `element_tbl`.`elememt_seq`; このとき、element_seqをORDERする際、`number`が一番若いものの`master_seq`を取り出したいのですがどのような書き方があるでしょうか?
758 :
756 :2007/08/23(木) 14:45:09 ID:???
>>757 さん
ありがとうございます。JOINは使ったことがなかったので読んでみます。
なんどもごめんなさいですが、以下の場合も教えていただけるとありがたいです。
select `user_tbl`.`user_seq`, `user_seq`.`name`, `element_tbl`.`master_seq` FROM `user_tbl`, `element_tbl`
WHERE `user_tbl`.`user_seq`=`element_tbl`.`user_seq` GROUP BY `element_tbl`.`elememt_seq` ORDER BY `user_data`.`age` DESC LIMIT 0,5;
>>758 group by は最初に見つかったレコードをチョイスする特性があるので、
まず element_tbl をサブクエリで並べたい順番に order by した結果を group by する。
760 :
NAME IS NULL :2007/08/23(木) 21:23:22 ID:iOrH9/U/
1テーブルに付き、どのくらいのフィールド数にするのが適切ですかね? やたらと入力(フィールド)項目があるアンケート用のシステムを 組まなくてはいけなくなり、フィールド数だけで、100以上はあります。 だから、用途毎に分けてJOINで結合する予定ですが、 それでも、5,6テーブルを結合する必要があり、 処理が重くならないか懸念してます。 皆さんはこういう場合どうしてますか?やはり複数テーブルを結合してますか?
複数テーブルを結合してます
>>760 正規化する必要がなければ1テーブルに入れるのが基本
しかも100オーバのフィールド数なんて珍しくないし
データディレクトリに、ホスト名.lower-testがあって、 mysqld起動時にファイルシステムに書きに行っているようなのですが これって何なんでしょう。。 リファレンスやGoogleさんにも、それらしい記述を見つけることができないので どなたかご存知でしたらお力添えください。。
cygwin on mysql for win. この組み合わせってダメなの? Win 版 MySQL のコマンドラインツールって cmd.exe からじゃないとダメ?
パス次第
>>763 OSがファイル名の大文字小文字を区別するかどうかを
確かめるためのテストファイル。
mysqld起動時にsrc/mysqld.ccのtest_if_case_insensitive関数で
<hostname>.lower-testファイルを作り、
<hostname>.LOWER-TESTという名前でアクセスできるかどうかを試験してる。
誰も気にしてないのでマニュアルには載ってないと思われ。
ほっといてOK。
ちょっと質問なんですが、 reset by peer ってなメッセージで、作業が拒否されるのはどういう現象なんでしょうか。 具体的には、毎日rubyのライブラリ経由でmysqlに、一日どうだろ、10万レコードぐらい入れてるのかな。 今一番多いテーブルが3000万レコードとなっている(株のティックデータだったりする)。 で、毎日そういうのをぶっこんでいると、ここ数週間必ず上記のエラー「reset by peer」と言われて 途中で止まるようになってしまった。直後に再試行すると同じエラーが起き、しばらく寝かすと なんか通るみたいな。その時間間隔はよくわからない。 なんでこういうことになるのか、reset by peerとはなんなのか、もしかして俺なんかまずい事してる? について腑に落ちる方がいましたら教えて下さいな。 具体的データ入れルーチンの手順 あるテーブルに10万レコードをcsvファイルにしてから一括登録 あるテーブルに5000レコードぐらいを逐次追加登録 あるテーブルに5000レコードぐらいを逐次追加登録(中身は画像BLOB) <- ここでエラーが起き出した。
>>767 MySQLが頑張って考えてる最中何も通信しなかったから
勿体無いから回線切ったった
>>768 うーん、でもね、sleep 60秒 入れて再試行しても、あるいは10分後に手動で再試行しても
やっぱり同じエラーが返ってきたりしたんで、それは何?と思ってしまったんですよ。
770 :
760 :2007/08/24(金) 22:55:31 ID:abcdyQsi
>>762 遅レスですみません。
1つのテーブルに100オーバーなんて「普通」なんですか?
確かに、複数テーブルに分けてJOINしまくるというのは、
それだけでSQL文が長くなって、バグやミスに繋がりそうな気がします。
ただ、XOOPSとかphpBBとかOpenPNEとか有名なCMSツールを見ると
1つのテーブルに100オーバなんてないし、細かく分けているので、
どうする方が適切か?汎用性が高いのか、ずっと悩んでいました。
ちなみに、今組んでいるアンケートシステムは、後から変更する事はないです。
「普通」とはなんでしょうか?
772 :
763 :2007/08/25(土) 00:46:58 ID:???
>>766 ありがとうございます。腑に落ちました。
これからソース眺めてみます
普通じゃなくてもいいじゃん やたらと入力(フィールド)項目がある 普通じゃないアンケート用システムなんだろ?
自由に設問を追加できるようにしてくれ、なんて要望が出たときってどうすればいいんだろう。 アプリ側でカラムを追加できるようにさせるしかないかなあ?
775 :
760 :2007/08/25(土) 02:09:18 ID:???
>>773-774 となると、やはり正規化して「個人情報」「カテゴリ」「アクセス情報」など
分けられるだけ分けた方が良いかもしれませんね・・。
設計の段階でずっと悩んでいます。なにせ100以上のフィールドがある
DBを組んだ事がないので、どうするのが後々良いのか悩みます。。
重複した質問とかしてないか?
777 :
760 :2007/08/25(土) 02:52:15 ID:???
それはないです。よくある性格診断アンケートのような感じです。 質問項目がやたら多いような・・。
アンケートの種類にもよるのだろうけど、 キー以外全部CSVかXML形式でText(不定長サイズの文字列)に格納してしまったほうが楽かもしれない。 集計のときは端から全部読んでプログラムで結果を条件毎のマトリックスに加算してゆくことがほとんどで SQLの集合関数は意外と統計には使いづらい。 調査項目の多いアンケートは結果見て何を集計するか決めたいといったケースが多く、 プログラムやデータ構造は作り捨てになりやすい。
ああ回答欄をフィールドに一個一個割り当ててるんだろ。 それ、アホ設計じゃん。 そんなの俺なら質問1万項目あろうが4フィールド前後で生成可能だな。 でも方法は教えられんね。自分で死ぬほど考えて。
項目名と回答で1レコードにするの? それもそうとうだな・・
名前 | 質問 | 回答 ってこと? でもこれだと回答を抽出する時に少し面倒な気がする。良い方法あるん?
何のためのリレーショナルデータベースだよ。 1対多でリレーションすればいいじゃん。
id | 質問形態 | 質問 | 回答 だな
名前も質問のひとつ
>>781 >>783 ちゃんは、正規化できてへんでーー
誰の回答かも分からへんしー。
でも、概要例としてなら分かるわー。
質問マスタ 質問id | 質問形態 | 質問文 | その他 回答者テーブル 回答者id | 質問id | 回答 これで十分
つければ?
こういう持ち方をすると回答フィールドのが型指定できないのが難点。 単純な集計ならいいが、男女年齢層別の集計とかやりだしたら問い合わせが複雑にならないか。 入力システムならいいが集計時は横1レコード形式に変換してそう。
>>788 回答者テーブルに回答idとコメント先回答idを追加する必要があるね
>>769 MySQLのクライアントとサーバーの間にFireWallとか変なルーターとかいない?
>>789 できるからええやん。 ただ、それなりのスキル無いと重いクエリになるが。
793 :
760 :2007/08/25(土) 21:47:27 ID:???
皆さん、いろいろ検討ありがとうございます。 自分が正規化するなら [基本マスタ] ID|ユーザID|質問マスタA・ID|質問マスタB・ID|質問マスタC・ID| [ユーザマスタ] ユーザID|名前|性別|年齢|都道府県| [質問マスタA] 質問マスタA・ID|質問01|質問02|・・・・(質問の数だけフィールドがある) と言うように考えておりました。 一覧表示する時は、すべてをLEFT JOINで結合するような感じで。 でも、これって糞仕様なのでしょうか?
上に出てる通りどこに重きを置くかによって違う。 システムはアンケートの入力それとも集計に重点をおくのか。 1回きりのアンケートなのか。繰り返し使うのか。 記名式かユーザーIDでの管理はあるのかそれとも匿名式か。 アンケートはネットでやるのか紙ベースか、 入力内容の精査はどの低度するのか、 集計方針は決まっているのか分析しながら決めるのか、などなど。
横から失礼します! ググっても分からず、どこで質問したらよいか分からないので、こちらに来てみました。 apache(2.2.4)+php(5.2.3)+mysql(4.1.22)を自宅のWin2kにインストし、 そこへphpMyAdminをインストしようとしてるのですが、apacheでエラーが出て困っています。 apacheを起動すると以下のように表示されるのです。 --------------------------- httpd.exe - エントリ ポイントが見つかりません --------------------------- プロシージャ エントリ ポイント mysql_get_character_set_info がダイナミック リンク ライブラリ LIBMYSQL.dll から見つかりませんでした。 --------------------------- で、調べたところlibmysql.dllのバージョンらしく、phpに付属のlibmysql.dllなら発生しません。 しかしphpに付属のですと、phpMyAdminで「クライアントライブラリのバージョンが違う」 と怒られてしまう、という状況です。(MySQL クライアントのバージョン: 5.0.37) お門違いの質問でしたら申し訳ありませんが、何卒ご教示ください。
>>791 いいえ、同一パソコン上、localhostです。
for code in 1000..9999
"select code from table where code = #{code} and date = 今日"
既に登録されてたら next
登録されてなかったらデータを集めて
"insert into table values xxx"
end
ってな感じで、再試行時にselect文は通ってるので、mysql自体が無反応というわけではなさそう。
でinsert文の所で「Connection reset by peer by mysql (Errno::ECONNRESET)」ってエラーになるです。
90万レコードでその速度なら テーブル設計が悪いか、SQLが悪いか又はその両方
>>799 それ、何かを答えてることになるの?
実質的に何も言っていないに等しいと思うんだけど。
CPUかバスが原因だろ
ユニークキーが重複してるときって上書きや無視しちゃっても大丈夫ですかね?
803 :
NAME IS NULL :2007/08/26(日) 07:54:48 ID:cLbF/99H
on duplicate key update オプション付きなら上書きだし。
>>798 インデックスとExplainの結果を見せてもらおうか
805 :
NAME IS NULL :2007/08/26(日) 09:30:22 ID:f7724A+Z
今、2003stdにMS-SQLが動いてるんですが、MySQLの共存は可能ですか? あまり共存とかしたくないけど、予算の都合上、入れられるのがそのサーバなもので。
806 :
798 :2007/08/26(日) 09:40:58 ID:???
>>801 CPUかバスですが・・
全てのデータをオンメモリにするような設定があれば多少マシになるでしょうか。
>>804 SQL初めてでよくわかっていませんが、実行してみた結果です。
mysql> show index from itemlist;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| itemlist | 0 | PRIMARY | 1 | auctionid | A | 843116 | NULL | NULL | | BTREE | |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)
mysql> explain select * from itemlist where categoryid = 27751 and price < 2000;
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | itemlist | ALL | NULL | NULL | NULL | NULL | 843116 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.01 sec)
プライマリキー(auctionid)で検索すると1秒以下で処理できますが、
それ以外ですとどうしても時間がかかってしまいます。
where節に書く予定のフィールドをがんがんcreate indexすればいいじゃん ってだけの話だね。
そうやって全フィールドにindexを振ってしまったが この先に待つものはいったいなんだろう・・・
>>805 ポート被ってなけりゃ問題なく動く。
ただSQL Serverって制限しないと
ほとんどの物理メモリを押さえちゃうから、
そのあたりの調整は必須。
>>806 categoryidで検索するなら
create index itemlist_cid on itemlist (categoryid);
categoryidとpriceで検索するなら
create index itemlist_cid_pce on itemlist (categoryid, price);
priceで検索するなら
create index itemlist_pce on itemlist (price);
オークションの終了日時で検索するなら
create index itemlist_end on itemlist (endtime);
出品者で検索するなら
create index itemlist_id on itemlist (id);
特定のカテゴリ、特定の出品者、ある入札価格で検索するなら
create index itemlist_cid_id_pce on itemlist (categoryid, id, price);
きりがないな
同じ道具を使っても、出来る物が違う。 それがプロ製作と素人製作の違いなのだよアンダーソン君
812 :
798 :2007/08/27(月) 06:40:24 ID:???
>>807 ,810
がんがん18個ほどindexを作成いたしましたところ、
期待通りの速度を得ることができました。
#index作成に4時間かかりましたorz
どうもありがとうございました。
ちょっと話を戻すようで申し訳ない。 回答者 | 質問内容 | 回答 ------------------------------ 高橋 | 年齢は? | 30歳 高橋 | 好物は? | もやし 鈴木 | 好物は? | コーヒー みたいなテーブルがあるとき(実際には、回答者と質問内容については別のテーブルを参照する) 検索とかしようとすると手間のような気がするんだけど、何かスマートな方法ってある?
なんの検索だよ
>>813 普通の正規化なら、
・回答者マスタ
・質問マスタ
みたいなテーブルを作って、キー項目でJOINすると思うんだが
それが面倒だと思うならVIEWにすればいいんじゃね?
816 :
NAME IS NULL :2007/08/27(月) 13:34:17 ID:y3LbHP1t BE:251556252-2BP(1002)
817 :
813 :2007/08/27(月) 15:31:44 ID:???
>814 検索しないならDBに入れる意味ないんじゃ? >815 いや、正規化の話じゃなく。
818 :
816 :2007/08/27(月) 15:52:09 ID:y3LbHP1t BE:1232624977-2BP(1002)
MySQLバージョンを5.1.20betaに上げましたがだめでした
>>817 検索と一言で言っても、回答者検索から統計から広範囲に渡るがな。
回答者検索なら、どこが面倒なんだ? という事だ。
>819 ごめん、回答者検索。 SQL初学者なもんで、すげー回りくどい方法で書いてたのかもしれない。
もぅ知らない!
ローカル内の2つのサーバにおけるmysqlデータベースデータを 同期しようと思っています。 メインのサーバで更新したら、サブのデータベースを更新したいのですが、 リアルタイム制は必要なく、3分程度の遅れでもいいと思います。 この場合、どのような方法で同期を取ることができますか? データベースの内容は、2000レコードぐらいの個人情報です。
MySQLのConnectorっていたるところでバグ多いよな 一番マシなのがjdbcくらい
サブが先に更新された場合は?
826 :
823 :2007/08/28(火) 00:28:26 ID:???
>>825 サブは読み込むだけなんです。
メインもほとんどが読み込みですが、たまにメインの方で更新されるぐらいです。
高度な技は持っていないので、
何かシェルレベルでも支障が無い同期が取れるでしょうか?
828 :
NAME IS NULL :2007/08/28(火) 10:47:09 ID:bE9ZNEtp
mysqlのレプリケーションのバイナリログが膨らんであたふたしてるんだが、 バイナリログ作成止める方法ってどうすればよいんでしょう? ちなみに、my.cnfのserver-idをコメントアウトしただけじゃダメですたorz
>>828 my.cnfのlog-binをコメントアウトして再起動。
だけど、使い終わったバイナリログを消すだけでいいのでは?
PURGE MASTER LOGS TO 'xxxxx-bin.xxx';
831 :
805 :2007/08/28(火) 20:25:27 ID:???
>>809 ありがとうございます。
参考にします。
832 :
NAME IS NULL :2007/08/29(水) 11:55:41 ID:UjsiDPtN
どうか、お知恵をお貸し下さい。 以下のような2つのテーブルが有ります。 tableA | uid | name | +-----+------+ | 001 | aaaa | | 002 | bbbb | | 003 | cccc | | 004 | dddd | | 005 | dddd | Primary = uid tableB | uid | snum | food | +-----+------+-------+ | 001 | 0001 | apple | | 001 | 0002 | orange| | 003 | 0001 | apple | | 004 | 0001 | melon | | 004 | 0002 | apple | | 004 | 0003 | banana| Primary = uid , snum tableBにデータの無い tableA.uid を求める場合どうしたらよいでしょうか? 上記の例ですと、002 と 005 が取得したい結果です。 よろしくお願いいたします。
>>832 tableA と tableB を left join して snum が null のレコードを探すでどうよ?
834 :
NAME IS NULL :2007/08/29(水) 13:13:00 ID:OUZw7AOU
WEB上のフォームでは誕生日の欄が [昭和・平成] []年[]月[]日 みたいに分かれているとします。 これをテーブル設計する時、どのようなフィールドにしますか? 単に「birth」というフィールド内に詰め込むのか、 「年号」「年」「月」「日」っと4つに分けるのか。 OPENPNEなどを見ると分ける形になっているのですが、 このように範囲が定まっていないデータを扱う場合、 出来るだけ項目毎にフィールドを分けた方が良いのでしょうか?
>>834 全部西暦で管理。
データの参照の時には西暦→和暦変換、
格納の時には和暦→西暦変換をそれぞれ実行する。
exists使えばいいんじゃねーの? select uid from tableA where not exists (select * from tableB where tableA.uid = tableB.uid);
837 :
NAME IS NULL :2007/08/29(水) 15:16:31 ID:UjsiDPtN
>>833 ありがとうございました。
SELECT
tblA.`uid` AS 'uid'
FROM `tableA` AS tblA
LEFT JOIN `tableB` AS tblB ON tblB.`uid` = tblA.`uid`
WHERE tblB.`snum` is NULL
で上手くいきました。
>>836 ありがとうございます。そしてスミマセン。
環境書くの忘れていました。
現在は4.0なのでサブクエリが使えないのですが、
いつか使える環境で開発する時の参考になりました。
>>834 データベースとしては、date型一つに収めるべし
利用(表示)によって適宜変換すればよし
839 :
834 :2007/08/29(水) 23:00:17 ID:???
>>835 ,838
なるほど。入力時は複数にしていたとしても、date型に納めれば
西暦から平成・昭和に分けることは出来るし、如何様にも対処出来ますね。
ただ、会員登録フォームなどで「平成・昭和」+年で
入力するフォームがありますよね?その場合も実際の登録は西暦なのでしょうか?
例えば、[平成][19]年 として入力した場合も、登録は2007にするような。
あとで再利用するかどうかだな 聞くだけ聞いて利用しないならそれでもいい 利用するつもりならそのままなら面倒だろ
てか、西暦と和暦は正確に1:1で対応してるんだから わざわざ和暦で記録する必要性があるようには思えない。 「昭和70年」みたいな存在しないはずの数値は扱えなくなるけど、 それはすっきりした設計を犠牲にしてまでデータベースの側が 面倒を見る問題なのか? という疑問もある。 データの入り口(入力フォームとか)で適切なチェックをかければ いいだけの話だし。
波長60の周期関数じゃなかったっけ
>>842 年月日で考えれば、キリの良い箇所はあるだろ。
昭和64年1月7日と平成元年1月8日とかな。
それなら西暦年月日と和暦年月日は1:1対応だ。
845 :
NAME IS NULL :2007/08/30(木) 13:04:09 ID:aMigI0oO
PHPでわざと間違えたクエリーを$queryに入れて if(!mysqli->query($query)) print("Error!: ".mysqli->error); ってやってもError!って表示されるだけでmysqli->errorの部分が表示されないんですけど どうしたらいいんでしょうか?
847 :
NAME IS NULL :2007/08/30(木) 17:33:03 ID:3/8QntVY
datetimeのフィールドを使ってYYYYMMなどの月ごとにデータを集計しているのですが データ数が多くなってきて、集計に時間がかかるようになってしまいました。 使用SQL SELECT date_format(datetime,"%Y%m") AS dateMonth,count(*) FROM table WHERE dateMonth='200708' date_format()を使った場合は、当然インデックスが使われないので遅くなってしまうと 思うのですが、こういった月ごと集計などを高速にやるやり方ってあるんでしょうか?
>>847 明らかに date_format が原因
851 :
NAME IS NULL :2007/08/30(木) 17:53:30 ID:xXyjZ2jf
>>847 そのsqlならインデックス効かなかったっけ?
どっちにしても、月を切り出す程度なら 定石では
当月一日以降、翌月一日未満 って指定だよね。
>>847 つべこべ言わずに explain しる。
854 :
NAME IS NULL :2007/08/30(木) 18:28:33 ID:2zV5thfK
phpMyAdminにて、エクスポートしたファイルをインポートしようとすると、 #1193 - Unknown system variable 'SQL_MODE' と表示されてインポートできません。 MySQL5のデータをMySQL4に移したいのですが、 'SQL_MODE'というのはMySQL5からの対応になるのでしょうか? また、何か対処法はありませんでしょうか。 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; の部分を削るとNOT NULL関係のものがインポートできないとエラーが出ます。 (#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'collate utf8_unicode_ci NOT NULL, `date` datetime NOT NULL)
855 :
847 :2007/08/30(木) 18:38:07 ID:???
explainは使っていたのですが、検証が足りなかったみたいです。 特定の月のデータを抜き出す場合 SELECT * FROM table WEHERE datetime BETWEEN '2007-08-01 00:00:00' AND '2007-08-31 00:00:00' date_format(datetime,'%Y%m')を使うより、50倍ほど高速になりました。 月毎の集計を出す場合 SELECT date_format( datetime, "%Y%m" ), count( * ) FROM table WHERE datetime BETWEEN '2007-07-01 00:00:00' AND '2007-08-31 23:59:59' GROUP BY date_format( datetime, "%Y%m" ) 10倍ほど高速に。 みなさんアドバイスありがとうございました。
857 :
NAME IS NULL :2007/08/31(金) 21:35:02 ID:2Luotq0e
列名が、id, version_id, revision_id, content となっていてidが主キーです。 version_id ごとにデータを取り出したいのですが、それぞれrevision_idが最も大きいデータのみを取り出したいのです。 例えば、以下のデータの場合、 id, version_id, revision_id, content 1 1 1 abc 2 1 2 bcd 3 2 4 acb 4 2 3 dac 5 3 1 cad 下記のデータを得たいのです。 id, version_id, revision_id, content 2 1 2 bcd 3 2 4 acb 5 3 1 cad groupやdistinctを試してみましたがうまくいきません。 どのようなSQLを書けばよいのか教えてください。
>>857 version_idでグループしてrevision_idがMAXな
version_idとrevision_idだけの仮テーブルをこさえて
じょいん
859 :
NAME IS NULL :2007/09/01(土) 21:39:05 ID:lOCeHxsv
create tableやcreate indexのsqlを吐いてくれる、 フリーのExcelファイルってないですか? いくつかあったんですけど、 auto incrementとかPじゃないkeyが設定できないんス。
>>858 一回SQLを発行して仮テーブルを作成し、
ジョインするってことは、一発のSQLでは無理ってこと?
>>860 バージョンが(多分)5以上であればインラインビューを使えば
テンポラリテーブル使わず、SQL一発でできるよ。
select * from tbl WHERE `time`='2007-09-04' こんな感じにすると カラムがdatetimeの場合、 意図したように取り出せません。 2007-09-04 00:00:00〜2007-09-04 23:59:59 まで取り出すにはどうしたらいいでしょうか? select * from tbl WHERE `time`=>'2007-09-04' and `time`<'2007-09-05' これ以外でお願いします。
>>862 > select * from tbl WHERE `time`=>'2007-09-04' and `time`<'2007-09-05'
に
>2007-09-04 00:00:00〜2007-09-04 23:59:59
書きゃいんじゃねーの
>>862 select * from tbl WHERE SUBSTRING(`time`,0,10)='2007-09-04'
>>862 普通、
select * from tbl WHERE date(`time`)='2007-09-04';
じゃね?
関数で分解するとindex効かないっす
autoincrementみたくさ 関数定義しといて なんか追加したら別のカラムに計算して勝手に突っ込む 見たいなの無い?
868 :
NAME IS NULL :2007/09/05(水) 12:04:41 ID:H/eyjQaz
↓空欄に一致させたいのですが、これだとうまくいきません。どうすればいいですか? select * from t_table where id=''
>>868 select * from t_table where id is null;
870 :
NAME IS NULL :2007/09/05(水) 13:19:41 ID:H/eyjQaz
あの。。恥しい質問なんですが、複数ユーザーがいた場合のトランザクションってどのように動作するんでしょう? ユーザー1 ユーザー2 START TRANSACTION; UPDATE tbl SET hoge='1' WHERE id = '1'; UPDATE tbl SET hoge='2' WHERE id = '1'; UPDATE tbl2 SET hoge='1' WHERE id = '1'; COMMIT; この場合、 SELECT hoge FROM tbl WHERE id = '1' は1になるという事でいいんでしょうか? ユーザー2はユーザー1のコミットが終了するまで待たされるという事?
873 :
NAME IS NULL :2007/09/07(金) 18:02:22 ID:2pJ+Fq5j
すみません、どなたかヘルプお願いします。 MySQL Migration Toolkitを起動したのですが、JRE(5.0) Update 8がないから 初期化に失敗したとか言われます。 JRE5.0はUpdate10〜12を入れているのですが・・・ Javaのサイトにいっても古いバージョンをダウンロードできる場所が 見つかりません。 どなたか、対策をお教えいただけないでしょうか?
>>872 実際にコンソール2つでやってみればわかるよ!
LOCKくらいしろ
876 :
NAME IS NULL :2007/09/08(土) 07:47:26 ID:W79c84Ln
ローカルの環境で Microsoft Access 2000/2007 と OpenOffice Base で作成したデータベースがあります。 これらを一括して MySQL データベースにまとめて ODBC 経由でアクセスするようにアプリケーションを 書き換えようとしているのですが、mysqldump のように スキーマとデータをまとめてダンプするようなツールは Microsfot Access や OpenOffice Base には無いでしょうか?
877 :
NAME IS NULL :2007/09/08(土) 08:06:24 ID:W79c84Ln
データ自体は Microsoft Access や OpenOfice Base から ODBC 接続して複製すれば(マクロは追加で書かなきゃいけないのかも) いけそうなんですが、スキーマは手動で移すしかないですか? とりあえず CREATE TABLE などの SQL 文でダンプさえできれば、 あと少々の差異の調整はダンプを何らかのスクリプトで処理して やればなんとかなると思うのですが・・・
Microsoft Access 2007 にはテーブル単位で 「ODBC データベースへのエクスポート」が可能でした。 リレーションは移ってくれないのだろうか…
エクスポートではできない。 リレーションも含めたダンプができればいいんだろうが。 Access 2007 ヘルプ - エクスポート - リレーションシップ 1 回の操作で 1 つのテーブルしかエクスポートできないため、 エクスポート操作でリレーションシップをコピーすることはできません。 複数のテーブルとそのリレーションシップをインポートする場合は、 インポート先のデータベースを開き、そのオブジェクトをインポートします。
880 :
878 :2007/09/08(土) 08:34:19 ID:???
インデックスの有無や制約は一切反映されませんでした。 Microsoft Access のエクスポート貧弱なり・・・
アップサイジングウィザードっつーのがあったんだけどな 今のバージョンにはないのかな
882 :
878 :2007/09/09(日) 10:02:07 ID:???
>>881 Access 2007 からはユーザインターフェイスが大幅に変わって
うまく見つけられなかったけど、「データベースの移動」
っていう項目の中に SQL Server へのデータの移動がある。
なので SQL Server にはスキーマも含めてうまく移行できると思う。
で、あらためて SQL Server から MySQL に移行すればいいのかな。
MySQL Migration Tool を使うのがベスト?
このツールはまだ一回も使ったことないんでこれから検討。
883 :
NAME IS NULL :2007/09/09(日) 22:18:37 ID:8M0+Vljb
ネーミングのせいで評価を落としてしまってる件。 ポスグレの方がずっと使えそう。 名前って大事だよな、ミギー。
かわいいじゃん、まいえすきゅーえる ポスの方がすぐに読めないから名前は嫌い
885 :
NAME IS NULL :2007/09/09(日) 23:56:25 ID:QjCU4T3R
int型に文字列を入れようとするとwarning は出るんですが、INSERTされてしまうんです。 これをされないようにするにはどうすればいいか教えてもらえないでしょうか?
set names hoge って、なんで「NAMES」なんていうキーワードなのかさっぱりわからん。
888 :
NAME IS NULL :2007/09/10(月) 13:11:08 ID:6m8MdV+L
>>886 ありがとうございます。
解決しました。
MYSQL5じゃないと出来ないみたいでしたので、バージョンアップしたらできました。
それと int型に 99.99 を入れようとすると自動的に丸められて挿入されてしまうんですがこれは防ぐ方法ないですか?
>>888 int型って何か分かってる?
前処理で切上げ・切捨て・四捨五入など
必要な処理をすれば、何の問題も無かろうに。
890 :
NAME IS NULL :2007/09/10(月) 13:53:32 ID:6m8MdV+L
>>889 分かってるつもりです。
エラーではじいて欲しいだけなんです。
postgresだと int型に 99.99を入れようとするとシンタックスエラーになるので
mysqlでも出来ないかな?とおもって探しています。
>>890 「そもそもint型に実数突っ込む実装が糞」って言ってるの。
MySQLについて質問です。
今日、PHPの勉強をしようと思ったのですが、
データ管理(メンバー登録)にはMySQLがいいのでしょうか?
ネットで調べたら、下のようなものが引っかかったので不安です。
http://www.ad.vg/voice/modules/tinyd0/index.php?id=8 『メモリー馬鹿食いでswapまで使いまくる』
『とてつもなく大規模な利用目的には活躍の場もあると思いますが、
通常はなんらメリットの感じられないmysqlには落胆しました。』
とあります。
実際はどうなのでしょうか?
うん、アホだから聞いてるw
>>892 メモリ馬鹿食いなのはSQL Serverもだな。
896 :
892 :2007/09/10(月) 17:07:44 ID:???
>>895 ってことは、PHPでDBの勉強するなら
自分のPC、メモリ馬鹿食いは避けれないってことなのかな?
>>896 世の中のRDBMSが全てそうだと思うなよwww
SQLiteでも使えや。
898 :
892 :2007/09/10(月) 17:19:44 ID:???
お、SQLiteってのがあるのですかww 一度調べて出直してきます。 回答ありがとでした^^
899 :
892 :2007/09/10(月) 17:47:06 ID:???
>>897 SQLiteでPHPのプログラム組んだとして・・・、
SQLiteが入ってないサーバでしか動かないって落ちはないよね?
>>899 日本語でOK。
つかSQLiteでググってみてから
それでも分からなきゃSQLiteのスレで訊けwww
901 :
NAME IS NULL :2007/09/10(月) 17:58:33 ID:2g8YrWQX
>>873 古いバージョンはもう手に入らない。
雑誌などから古いバージョンを探すしかない。それか、持っている人にアップロードしてもらう。
それが出来なければ、MigrationToolkitは使えないから諦めるんだな
903 :
873 :2007/09/11(火) 16:39:27 ID:???
>>902 ありがとうございます! 見事JRE 5.0 Update 8をゲット・・・
・・・・J2SE 5.0 Update 8になっててインストールしても
Migration Toolkitが「JRE 5.0 Update 8」を入れろやコラ!!と
相変わらず動いてくれないなあ・・・
なんでなんだろ
904 :
NAME IS NULL :2007/09/11(火) 21:42:16 ID:+zsoqsPe
Javaを使って、ローカルPCからjpeg画像ファイルを読み込んで、 MySQLにBLOB型で格納したいのですが、どのようにやればよいか 具体例を教えてもらえないでしょうか? 参考となるリンクだけでも構いません。 OSはWindowsXP Pro、JDK1.6.0、MySQL5.0.45という環境です。 よろしくお願いいたします。
既にデータが沢山入っているテーブルに新たなカラムを追加しようと思っています。 これは、 ALTER TABLE テーブル名 ADD 追加するカラム名 型; というコマンドで実行可能ですが、その場合、新たに追加されたカラムには NULL が代入されてしまいます。 新たなカラムを追加し、それに "" (文字列無し、ただし NULL では無い。) を入れる場合にはどうしたら良いでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いします。
906 :
NAME IS NULL :2007/09/11(火) 23:58:41 ID:ya4K9LL7
これはアメリカのゲームです。1度やってみてください。 これは、たった3分でできるゲームです。試してみてください。 驚く結果をご覧いただけます。 このゲームを考えた本人は、メールを読んでからたった10分で願い事が かなったそうです。 約束してください。絶対に先を読まず、1行ずつ進む事。 たった3分ですから、ためす価値ありです。 まず、ペンと、紙をご用意下さい。 先を読むと、願い事が叶わなくなります。 @まず、1番から、11番まで、縦に数字を書いてください。 A1番と2番の横に好きな3〜7の数字をそれぞれお書き下さい。 B3番と7番の横に知っている人の名前をお書き下さい。(必ず、興味の ある性別名前を書く事。男なら女の人、女なら男の人、ゲイなら同姓の名 前をかく) 必ず、1行ずつ進んでください。先を読むと、なにもかもなくなります。 C4,5,6番の横それぞれに、自分の知っている人の名前をお書き下さ い。これは、家族の人でも知り合いや、友人、誰でも結構です。 まだ、先を見てはいけませんよ!! D8、9、10、11番の横に、歌のタイトルをお書き下さい。 E最後にお願い事をして下さい。さて、ゲームの解説です。 1)このゲームの事を、2番に書いた数字の人に伝えて下さい。 2)3番に書いた人は貴方の愛する人です。 3)7番に書いた人は、好きだけれど叶わぬ恋の相手です。 4)4番に書いた人は、貴方がとても大切に思う人です。 5)5番に書いた人は、貴方の事をとても良く理解してくれる相手です。 6)6番に書いた人は、貴方に幸運をもたらしてくれる人です。 7)8番に書いた歌は、3番に書いた人を表す歌。 8)9番に書いた歌は、7番に書いた人を表す歌。 9)10番に書いた歌は、貴方の心の中を表す歌。 10)そして、11番に書いた歌は、貴方の人生を表す歌です。 この書き込みを読んでから、1時間以内に10個の掲示板にこの書き込みをコピーして貼って下さい。 そうすれば、あなたの願い事は叶うでしょう。もし、貼らなければ、願い事を逆のことが起こるでしょう。とても奇妙ですが当たってませんか?
907 :
905 :2007/09/12(水) 01:26:52 ID:???
自己解決しました。 default '' というパラメーターをつければおkみたいです。 ありがとうございます。
908 :
NAME IS NULL :2007/09/12(水) 16:20:51 ID:QChlKlei
mysql4.1.20を使用しています postgresばかり使っていたのでmysqlの事がさっぱりわからないのですが SELECT currval や SELECT NEXTVAL の代わりになるようなものはMYSQLには用意されていないのでしょうか?
>>908 postgres あまりわかんないけど、auto_increment と last_insert_id() を調べてみ。
910 :
NAME IS NULL :2007/09/13(木) 01:05:56 ID:vM9MWgfF
>>909 last_insert_id()がちょうどSELECT currvalにあたるようです
ありがとうございます
911 :
NAME IS NULL :2007/09/13(木) 23:08:45 ID:+g8hjTGs
CREATE TABLE文でPRIMARY KEYを指定して 主キーに設定したカラムは、自動的にインデックスが 作成されるのでしょうか?それとも主キーでも 自分でCREATE INDEX文でインデックスを作成しないと いけないのでしょうか?
913 :
NAME IS NULL :2007/09/13(木) 23:38:26 ID:+g8hjTGs
>>912 ありがとうございます。
show index from テーブル名で確認したら、
主キーのカラムでSeq_in_indexの値が1となっていました。
申し訳ないのですが、もう1つ質問させてください。
以下のSQL文を実行するとエラーとなってしまうのですが、
その理由が分かりません。1つのテーブルにAuto_incrementのカラムが
1つしかなく、かつ主キーに設定しているはずなのですが…。
どなたかエラーとなる理由が分かる方いらっしゃいますか?
<SQL文>
create table sample(
id1 integer not null,
id2 integer not null,
id3 integer not null,
id4 integer not null auto_increment,
name varchar(20) not null,
primary key(id1, id2, id3, id4)
);
<上記SQL文に対するエラーメッセージ>
ERROR 1075 (42000): Incorrect table definition;
there can be only one auto column and it must be defined as a key
914 :
NAME IS NULL :2007/09/14(金) 00:10:34 ID:nR/wca1E
>>913 auto incrementで設定したキーって唯一のPKでなければ
ならないんではなかったっけ?
なので
primary key(id1, id2, id3, id4)ではなく
primary key(id4)ならばエラーはなくなる(はず)
915 :
NAME IS NULL :2007/09/14(金) 00:27:09 ID:CZohK/lz
>>914 今試しにPRIMARY KEYの指定順序を以下の通りに
してみたらテーブルが登録できてしまいました…。
Auto_incrementのカラムが唯一の主キーでなければ
ならないとしたら、登録されたしまったテーブルは不正でしょうか?
create table sample(
id1 integer not null,
id2 integer not null,
id3 integer not null,
id4 integer not null auto_increment,
name varchar(20) not null,
primary key(id4, id1, id2, id3) ← auto_incrementのカラムを1番目に移動
) ENGINE=InnoDB;
916 :
915 :2007/09/14(金) 01:01:23 ID:???
何度も失礼します。
show index from sample;を実行したところ、
>>915 のSQL文の主キーがid4しか出てこなかったので、
PRIMARY KEY(id4, id1, id2, id3)のid1, id2, id3は
主キーとしては無視されているようです。
エラーが出なかったためはまってしまいました。
917 :
915 :2007/09/14(金) 01:10:02 ID:???
でも、show fields from sample;を実行したら、
id1, id2, id3, id4は全て主キーになってました…。
もちろんid4はauto_incrementになってます。
やはり
>>914 さんが言うとおりに、
主キーかつAuto_incrementのカラムは表に1つだけ
というのが正しい事なのでしょうか?もう分かりません。
目と目が逢う 瞬間 主キーだと気付いた
919 :
NAME IS NULL :2007/09/14(金) 05:20:39 ID:lPZkncXg
質問させて下さい。 MySQL 5.0.43を使っています。 ■カンマ区切りのデータの一部を曜日に合わせて取得したい ・テーブル構造 CREATE TABLE `info_percent` ( `info_percent_no` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Percent No', `info_percent_daily` varchar(34) NOT NULL default '' COMMENT 'デイリー% カンマ区切りで7日間', `info_percent_up_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新日時', `info_percent_reg_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '登録日時', `info_percent_del_flg` TINYINT NOT NULL DEFAULT '0' COMMENT '削除フラグ 0=未削除 1=論理削除 2=一時削除' ) ENGINE = innodb CHARACTER SET ujis COLLATE ujis_japanese_ci COMMENT 'Percent情報'; ・レコード例 info_percent_dailyには「5,10,11,7,6,8,6」のようなデータが入っています。 ・質問詳細 info_percent_dailyレコードにはプログラムで利用する一週間分(7個分)の数字がカンマ区切りでセットされています。 このレコードからその日の数字を取得したいのです。 テンプレに紹介されているリンクを色々見回って無い知恵を絞って以下のような文を書いたのですが、NULLが返されます。 SELECT MAKE_SET( ( DATE_FORMAT( NOW(), '%w' ) +1 ),`info_percent_daily` ) FROM `info_percent` 本日、金曜日であれば、上記レコードデータで言うと「8」を取得したいのですが、なかなか上手くいきません。 ほとほと行き詰まってしまいました。 お力添えをいただけませんでしょうか。 宜しくお願いします。
>>919 SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(`info_percent_daily`, ',', DATE_FORMAT( NOW(), '%w' ) +1),',',-1)
FROM
`info_percent`
922 :
919 :2007/09/14(金) 22:25:59 ID:???
>>921 ばっちりいけました!
なるほどこのようにすればいいんですね。
勉強になりました。ありがとうございました!
923 :
NAME IS NULL :2007/09/15(土) 01:18:59 ID:ZjADhqZJ
すみません あるフィールドにテーブル名が入っていて そのテーブルと join するようなクエリって書けますか? table1 | id | value | | 1 | 100 | | 2 | 200 | | 3 | 300 | table2 | id | value | | 1 | hoge | | 2 | fuga | table3 | id | tbl | key | | 1 | table2 | 2 | | 2 | table1 | 3 | のときに select table3.id, `tbl`.value from table3 left join `tbl` on table3.key = `tbl`.id; みたいな感じのことがしたいのです
select max(hoge) + 1 from fuga; としたときにデータが空だと NULLが出力されてしまいますが NULLを0とみなして計算して 1を出力してもらうためには どういう記述にすればよろしいでしょうか?
select coalesce(max(hoge),0) + 1 from fuga;
>>923 table1とtable2をまとめてこうすればいいじゃない。
table
| table | id | value |
| table1 | 1 | 100 |
| table1 | 2 | 200 |
| table1 | 3 | 300 |
| table2 | 1 | hoge |
| table2 | 2 | fuga |
927 :
NAME IS NULL :2007/09/16(日) 17:07:51 ID:rVRRSUiB
SQL文の中で、名前にハイフンを含むデータベース名は どのように書いたらいいのでしょうか。 スクリプトからアクセスする場合はhoge-fugaで問題ないのですが、 phpMyAdminからやプロンプトから、例えば CREATE DATABASE hoge-fuga; とするとパースエラーになってしまって・・・ hoge\-fugaなどとしてもダメです。
ハイフンを含まないデータベース名にすれば無問題
929 :
NAME IS NULL :2007/09/16(日) 17:39:28 ID:rVRRSUiB
>>928 データベース名にはすでにハイフンが入っているんです。
スクリプトからはそれでアクセスできていますが
直打ちだとどうしたものか・・・
すべてスクリプトを介してアクセス、というのはナシの方向でひとつ・・m(_ _)m
`hoge-fuga`
931 :
NAME IS NULL :2007/09/16(日) 22:00:21 ID:rVRRSUiB
932 :
NAME IS NULL :2007/09/18(火) 13:59:24 ID:LM+QWEw9
mysqlとphpの連携を学習したいと重いDBを勉強したいのですが、 Mysql5.0をインストールしました。 入門レベルとして、何を覚えていけばよろしいでしょうか? OSはwindowsXPです
まず入門書を数冊読破して下さい
SQL文を覚えてください
935 :
NAME IS NULL :2007/09/18(火) 16:22:18 ID:6uQh2xqH
update hoge_tbl set countup = (select countup from hoge_tbl) + 1; 上記のような自身のカウントアップをさせたいのですが update時に同テーブルをサブクエリに指定しているのが原因という事は わかったのですが、MYSQLにはどのような代替案があるのでしょうか?
936 :
935 :2007/09/18(火) 16:34:37 ID:???
自己解決しました
update hoge_tbl set countup = countup + 1; では問題があるのだろうか??
>>932 mysqlは軽いRDBMSの部類だよ。と突っ込んでみる。
>>932 windowsでは様々な問題に直面します。
まずはLinuxの導入から初めてください。
しかし重いDBが希望のようですので、
windowsのままでOracleかMSSQLでも購入してください。
940 :
NAME IS NULL :2007/09/19(水) 05:24:48 ID:5f6hIkAQ
text型のカラムにalterでunique属性をつけようとすると エラーがでるのですがどうしてでしょうか?( varcharだとうまくいくようなのですが。。) mysql> alter table a_tbl add unique b_item(b_item); ERROR 1170 (42000): BLOB/TEXT column 'name2' used in key specification without a key length ごきょうじゅお願いします。
941 :
NAME IS NULL :2007/09/19(水) 06:30:18 ID:thY75gxD
BLOBやTEXTカラムではインデクスする文字列の長さを指定する必要がある って事なんだけど、エラーメッセージにもそのように書いてあるやん
それだとuniqueにならない恐れがありますよね?
944 :
932 :2007/09/20(木) 10:47:44 ID:fT/6kBZZ
レス遅くなりました。 とりあえずはMysqlで勉強したいと思います。 やはりSQL文をコマンドラインに打ち込んで覚えるのがいいですよね? 教本あるのですがさっぱり
InnoDBを使ってるんですが、 innodb_file_per_tableオプションを付けたほうがパフォーマンスは上がるんでしょうか? ibdata1が肥大化してすごいサイズになってるんですが、これってパフォーマンスには関係ないんでしょうか?
InnoDB使ってるやつなんて いんの?
MySQL User Conf Japan 2007 のInnoDBパフォーマンスチューニングでは?そんなパラメータの話は出てこなかった気が。
>>946 関係ある。あたりまえだが、ファイルサイズが大きくなれば一般に遅くなる。
ibdata1が同一物理ディスク上にあるなら、Windowsでいうデフラグするだけで早くなる可能性はある。
>>949 可変長カラムがあってもInnoDBはフラグメンテーション発生しないんでなかったっけ?
Winじゃなければ関係ないような。
ファイルのフラグメントと、DBのフラグメントは違うんじゃないか? ファイルが大きくても、たくさん開くよりは、たいていは速いよ。
952 :
NAME IS NULL :2007/09/22(土) 14:48:03 ID:SdV4tJcU
DEFAULT CHARSET=utf8を付けるとエラーが出るのですが、 このバージョンではこの指定はサポートしていないということでしょうか? ・Win2k MySQL 4.0.20a-nt ・コマンド CREATE TABLE `test` ( `id` INTEGER ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ・エラー #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT CHARSET=utf8' at line 3
utf8はMySQL4.1からサポート。
954 :
952 :2007/09/22(土) 17:05:08 ID:???
>>953 そういうことでしたか。
ありがとうございました。
955 :
NAME IS NULL :2007/09/23(日) 00:03:21 ID:nJudGDWP
すいません、初心者です。 今、テーブル作ろうと思ってるんだけど、1/7/2007って値が入るカラムのデータ型ってなんになるのかな? 一応、mysqlのホームページでリファレンスマニュアル見たけどわからんかった・・・
957 :
NAME IS NULL :2007/09/23(日) 00:16:14 ID:nJudGDWP
>>そうなんすか?駄目理科・・・ テキスト型じゃまずいのかな・・・そっちの方向で考えているのですが・・・ 初心者かっこわりー
958 :
NAME IS NULL :2007/09/23(日) 00:29:37 ID:nJudGDWP
>956 テキスト型で行けました。ありがとうございました。
959 :
NAME IS NULL :2007/09/23(日) 01:27:31 ID:FBJ1MWDN
すみません、DBを業務で触るのは久々なので教えて下さい…。 以前はSybase(バージョン失念)を2年程弄っていたのですが、 今回MySQL5.xを弄る事になりまして。 DATE_TIME型のカラムをCHAR型にCONVERTし当日よりn日前のレコードを抽出したいのです。 確かこのような構文だったと記憶しているのですが。 datediff ( convert (char(8), dd, now(), 112) - n いまいち思い出せず…。
DATETIMEをCHARにCONVERT? 逆じゃないの? mysql> desc test; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | dd | char(8) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.21 sec) mysql> select * from test where datediff(convert(dd, date), now()) = -22; +----------+ | dd | +----------+ | 20070901 | +----------+ 1 row in set (0.01 sec)
dd列にINDEXが効くように直してみた。 mysql> select * from test where dd = date_format(date_sub(now(), interval 22 day), '%Y%m%d'); +----------+ | dd | +----------+ | 20070901 | +----------+ 1 row in set (0.11 sec)
わけあって Microsoft Access からアクセスする必要が 出てきたんだけど、 ODBC で接続すると #DELETED# って 表示されるよ、Access で。 ググってみるとバージョン依存のような記述もあるんだけど、 「あきらめれ」っていう記述もある。レコード数はあってるから まったく見れてないわけじゃないと思うんだけどなぁ。 やっぱり BIGINT を使ってるのが悪いのか・・・ 既存の MySQL ベースで動いているウェブアプリのメンテナンス 用のツールを、Access フロントエンドで作ってくれっていう 案件なんだよ・・
>>962 datetimeだかなんだかが必要だと聞いた記憶がある
964 :
だよもん!!! :2007/09/23(日) 11:00:10 ID:RN+MewUh
965 :
NAME IS NULL :2007/09/24(月) 10:35:31 ID:0g3D2SCa
ume
966 :
717 :2007/09/24(月) 15:04:50 ID:pceZ+XvF
連続のUPDATEの際、INSERTのように1文で書くことはできますでしょうか? 以下のように書いてみましたができませんでした。 UPDATE hoge SET title='HOGE1' WHERE seq=1, hoge SET title='hoge2' WHERE seq=2;
バックエンドがMySQL4.1でAccess2000がフロントエンドです。 サーバーエンコーディングがujisで、クライアントエンコーディングがcp932。 この環境だと全角のハイフンが化けるんです。フィールドの型はvarcharですが。 データベース作成時にsjis指定したり、my.cnfにdefault-charset=sjisとすると、そんな文字コード知らんて言われるんですよね。 フロントエンドでAccess使いたくて、やってみてるんですが…。 Access2003とかだとまた違ったりするのかな? PostgreSQLと比べるとマルチバイトの設定がムズいっス。
>>967 クライアントがcp932ならサーバではeucjpmsを使うべき。
ただ、eucjpmsは5.0以降の対応だったかも。
つか、4.1使うなら5.0にしたほうがいいんじゃね?
質問させてください。 MySQL5を使用しています。 SELECT column1, column2, column3, 〜 FROM `test` WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP( `datetime` ) > 30 上記のようなSQLにて「UNIX_TIMESTAMP() - UNIX_TIMESTAMP( `datetime` )」部分の計算結果を SELECTで取得するカラムのひとつとして含めたいのですがどのようにすればよいでしょうか? SELECT ( UNIX_TIMESTAMP() - UNIX_TIMESTAMP( `datetime` ) ) AS column4 のようにすればできますが、実際にはサブクエリを含んだSQL文により`datetime`を取得しています。 同じサブクエリをSELECT内でも実行するのは非常に非効率だと思ったのでMySQLのリファレンスを 読みながらユーザ変数をなんとかして使えないか等やってみたのですが、思い通りの結果が得られませんでした。 具体的には下記のような形式です。 SELECT column1, column2, column3, @a FROM `test` WHERE @a:=( UNIX_TIMESTAMP() - UNIX_TIMESTAMP( `datetime` ) ) AND @a > 30 google先生にお伺いを立てていたのですが、それも行き詰まってしまいました。 アドバイス頂けませんでしょうか。
@hoge := UNIX_TIMESTAMP() - UNIX_TIMESTAMP( `datetime` ) > 30; SELECT column1, column2, column3, @hoge as column4, 〜 FROM `test` WHERE @hoge > 30
971 :
967 :2007/09/27(木) 08:10:03 ID:???
>968 thx. 色々試してるけど、やっぱダメっぽい。 うーん、5.0インスコしてみます。
5.0+Access2000とか 5.0+Access2007とか やってみたけどだめだったぽ
973 :
967 :2007/09/27(木) 21:02:21 ID:???
>972 Σ(゚Д゚ υ) アタァ!! mjsk。 _/ ̄|○|||
MySQLの方じゃなくてAccessの方に原因があるから default-charsetとかいじっても無理だろうな
あれ、そうなん? てっきりODBCの設定でなんとかなるものとばかり……
結論:Accessを使うのが悪い
>>967 がエスパー期待の質問とはいえ、話がどんどん面白い方向に行ってるな。w
MySQLのODBCコネクターがバグってるから そこを直さない限り何をあがいても駄目
ODBCもカスみたいなもんだけどなぁーーー