MySQL 総合 Part13
..
359:NAME IS NULL
08/03/20 14:00:42
>>353
OSのarchはi386?
i386だと、ユーザー空間のメモリは2Gが上限で、MySQLマニュアルのどっかにあったと思うけど、
key_buffer_size以外に、各種クライアントが使用する変数郡をすべて足し合わせた合計が
2Gを越えないように設定しないといけないハズ。
i386でも、PAE-kernel使うとか、自前でコンパイルオプションやスイッチ変更したら2G以上使えるらしいけど、
そこらへんは詳しくない。
つうか、そもそも物理メモリ512Mしかないのに、設定で2Gのメモリを使うようにしてるところが
大問題なんじゃないのかね??
(それが、>>324の現象と関係あるかどうかは知らんが・・)
360:324
08/03/20 14:22:51
>>359
すみません、ここ数日色々試してとっかえひっかえしていたため、情報がごっちゃになってしまいまました。
>>324 の時はメモリ512Mだったのですが違うマシンでメモリ4Gにして試してみたのが>>353です。
OSはubuntu7.1 server、x86、32bit版です。
OS上では4Gを認識しております。
あれから512M、1G、2G、4Gを各上限とする設定を試してみたのですが全て同じメモリ使用量となってしまいます。
LinuxのMySQLも通常は起動時にkey_buffer_sizeで指定したメモリ分だけドカンと使用されるのでしょうか?
361:359
08/03/20 15:13:57
>>360
ウチの環境でやってみら、起動直後には確保されてない。
create tableしたり、create indexしたり、select 〜〜 とかやってると、徐々に増えていくようだ。
ちなみに、Win環境でも、おんなじような増え方するけど・・・。
環境1 CentOS/4.6 mysql/5.0.58 mem/256MB
環境2 WinXp-sp2 mysql/5.0.56 men/1GB
Linuxはtop及びfree、Winはタスクマネージャの「プロセス」->「メモリ使用量」の項目で。
362:NAME IS NULL
08/03/20 16:21:56
>>324
>>359
key_buffer_size=2Gでも、起動直後には確保されない。
もしくはmallocで確保はしているが、未使用なのでLinux kernelが実メモリをまだ割り当てていないのかもしれない。
使っているうちにインデックスがメモリに載るようになる。
その辺、最初からのせたかったらサイボウズラボの奥一穂さんの記事が参考になるかな。
URLリンク(labs.cybozu.co.jp)
MySQL のウォームアップ (InnoDB編)
これはInnoDB用だが、インデックスのところはMyISAMでも使えるんじゃないだろうか。
363:NAME IS NULL
08/03/20 16:23:13
>>357
無理。トランザクションでやるしかない。
364:NAME IS NULL
08/03/20 16:25:39
>>359
> i386だと、ユーザー空間のメモリは2Gが上限で、MySQLマニュアルのどっかにあったと思うけど、
> key_buffer_size以外に、各種クライアントが使用する変数郡をすべて足し合わせた合計が
> 2Gを越えないように設定しないといけないハズ。
Linux kernel 2.6なら、3GBまでいける。
ちなみにPAE使っても、プロセス単体は3GBまでしか無理だと思われる。
365:324
08/03/20 16:53:48
>>361
>>362
>>364
みなさんレス本当に有り難う御座います。
頂いた情報を元にもう少し調べてみます。
因みに以前の環境はwindowsXP SP2 でMySQLは5.0.45-community-nt
搭載メモリは2Gでkey_buffeは1G、その他諸々設定で
起動時には1.6G程コミットチャージされていました。
366:357
08/03/20 17:09:49
>>358,363
そうですか・・・。マニュアルには出来そうな感じしたのですが、
ちょっと違うみたいですね。。処理を分けて対処します。
367:NAME IS NULL
08/03/20 19:31:17
>>366
機能は有るんだから構文が間違ってるんだろ?
URLリンク(dev.mysql.com)
そのままSQLを分離して上手く動く事は確認済み?
'2008-03-200'←こんなのを見ると大丈夫か?と思うわけだが。
368:NAME IS NULL
08/03/21 05:57:31 vtga5C69
レンタルサーバでMySQLを使ってるけど
なんだか新しいバージョンでは、デフォルトでUTC-8を使うようになってるらしく
DBをEUCで作成して、そこからcgiでアクセスする際に
予め、コネクションが完了した直後に
まず 'SET NAMES ujis' みたいなクエリーを発行しないと、文字化けしてしまう…
phpMyAdminからなんか設定して回避は出来ない よね…(ローカルのだったらMySQLの設定ファイル変更で回避出来るみたいだけど)
369:NAME IS NULL
08/03/21 05:59:47
×UTC-8
○UTF-8
あぁ…
370:NAME IS NULL
08/03/21 06:23:41
URLリンク(wordpress.rauru-block.org)
URLリンク(puchiko.lowtech.ne.jp)
URLリンク(puchiko.lowtech.ne.jp)
URLリンク(puchiko.lowtech.ne.jp)
371:NAME IS NULL
08/03/21 08:14:44 pV5z+1bm
「mogura」って言うphp+mysqlアクセス解析スクリプトを自鯖に設置したんだけど、
setup.php呼び出してセットアップしようとしたら以下のエラー返ってきた。
調べたら「MySqlが起動していない」って事らしいんだけど起動はしてる。
【エラー内容】
Error Message: DB Error: connect failed
Debug: [nativecode=Can't connect to MySQL server on 'localhost' (10061)] ** mysql://root:パスワード@localhost/analysis
ユーザ名やパスワードも合ってるしデータベースも作成済み、phpもちゃんと設定したし。誰か原因分かる人居ない?
372:NAME IS NULL
08/03/21 08:16:13
あ、PHP5+Mysql5
サーバはAnhttpdでOSはWinVistaでそ。
環境はこれと言って問題ない筈なんだけど
373:363
08/03/21 08:45:25
>>367
複数テーブルのUPDATE出来るのか...。嘘教えてすまん >>357
374:NAME IS NULL
08/03/21 09:15:49
>>371
設定がヘボいと、ネットワーク越しにアクセスできても
ローカルでアクセスできないということはよくある。
375:NAME IS NULL
08/03/21 09:39:11
>>374
設定kwsk
これは「アクセスできない」って事で良いんだろうか。間違いなくmysqlは起動してるんだ。
376:NAME IS NULL
08/03/21 10:03:06 Qg2uDul9
>>352
どこの画面でやるのでしょうか?
377:NAME IS NULL
08/03/21 11:52:08
>>376
って、少しは努力しろよw
378:NAME IS NULL
08/03/21 12:12:04
>>377
知らないならレスしないで下さい。ウザイです。
379:NAME IS NULL
08/03/21 15:01:06
>>378
MySQL Administrator にあるだろ馬鹿
380:NAME IS NULL
08/03/21 15:08:12
>>379
知らないならレスしないで下さい。ウザイです。
381:NAME IS NULL
08/03/21 15:08:44
>>379
全く努力しない聞くだけチャンはほっとけ。
382:NAME IS NULL
08/03/21 15:17:42
>>381
知らないならレスしないで下さい。ウザイです。
383:NAME IS NULL
08/03/21 15:33:05
>>371
コンソールから
mysqladmin -u root -p xxx
でアクセスできるか?
384:NAME IS NULL
08/03/21 15:34:14
もとい。こっち。
mysql -u root -p xxx
385:NAME IS NULL
08/03/21 15:41:50 pV5z+1bm
MySQL Command Line Clientで良いんだよね?
メッセージとか出ないなww少し拍子抜けwww
386:NAME IS NULL
08/03/21 15:44:44
あ、ごめん間違い。
ちゃんとEnter Passwordになるね。
387:NAME IS NULL
08/03/21 15:46:39
って思ってたらなんぞこれー
パスワード入力したら
ERROR 1049 (42000): Unknown database 'ぱすわーど'
C:\Program Files\MySQL\MySQL Server 5.0>
あひー
388:NAME IS NULL
08/03/21 15:52:38
スマン、寝不足のせいかボケてんのか俺?
「xxx」はデータベース名だよね?
一応>>371の[analysis]にしたらちゃんと返って来たわ(Welcom to th MySQL monitor)
389:NAME IS NULL
08/03/21 16:58:03
>>388
起動はしてるんだな。じゃ、ポート番号が合ってないんじゃね?
390:NAME IS NULL
08/03/21 17:06:03
ここで質問していいのかわからないのですが、初心者用のスレがみつからなかったので、書き込ませていただきます。
MySQLが起動できないようです。
MySQL 4.0.20
Mac 10.3
ターミナルで
sudo ./bin/mysqld_safe
としても、
Starting mysqld daemon with databases from /usr/local/mysql/data
mysql ended
とでて先へ進めません。
どうしたらよいか、どなたかよろしくお願いいたします。
391:文字化けらった
08/03/21 17:22:46 ZUe7Mqjc
申し訳ありませんが教えてください。
MS ACCESS (文字コードはおそらくSJIS)で作成したデータを、
mysql(文字コードはUTF8)のDBに移行するには、
どのようにすればよろしいでしょうか。
また、移行後、mysqlのDBのデータを
文字コードUTF8で、挿入、更新、削除を行いたいのですが、
どのようにすればよろしいでしょうか。
392:NAME IS NULL
08/03/21 17:26:47
>>390
データディレクトリのパーミッションとか色々ファクタがあるが、
エラーログファイル見た?
/usr/local/mysql/data に、xxxx.err とかで記録されているはず。
393:NAME IS NULL
08/03/21 17:29:47
>>391
CSVにして LOAD DATA INFILE
UTF-8でDBやテーブル作って文字コード合わせて queryしる。
394:NAME IS NULL
08/03/21 17:32:13 ZUe7Mqjc
>>393
ありがとうございます。
便利ツールなどはご存知ありませんでしょうか。
395:NAME IS NULL
08/03/21 17:39:18
>>394
URLリンク(www.google.co.jp)
396:390
08/03/21 20:08:44
>>392 ありがとうございます。
dateはアクセス不可だったのでパーミッションをかえて開いたところ、
たしかに[pc名].local.errというファイルがありました。
しかし、これをどうやって開ければいいかがわからず。。
とりあえずmiで開いてみたら、なにも書かれていませんでした。
他のアプリケータなどで開くのでしょうか。
ものすごく初歩的な質問で申し訳ありませんが
よろしくお願いいたします。
397:NAME IS NULL
08/03/21 20:24:25
>>396
datadir 内の全てのファイルは、mysqlが読み書き出来るようになってないとだめなんだが、
違ってるんならパーミッションを全部変えてみ。(通常 mysqlユーザ)
398:NAME IS NULL
08/03/21 23:54:49
>>396
> 他のアプリケータなどで開くのでしょうか。
Wikipedia項目リンク
399:NAME IS NULL
08/03/22 01:42:27
>>389
そのPHPにポート指定する所無いなぁ…
ポート番号がセッティングウィザードのデフォルトのままだし…
400:390
08/03/22 09:11:45
>>398 アプリケーションですね。すみません。
>>397
ありがとうございます。
もともとは「オーナー:mysql」になっていました。
それだとfinderから開けなかったので、自分のユーザー名に変えてmiで開こうとしてみたら、
空だったのです。。
401:NAME IS NULL
08/03/23 12:16:20 +Imhz/jV
指定したデータベースだけcharsetを変える方法があれば教えてください
デフォルトのcharsetがutf-8なのですが、互換性の問題からeucjpで格納したいです
テーブルのコレーションをujis_japanese_ciに変えたのですが、
コレーションを変えてもデータ格納形式自体は変わってないみたいです
402:NAME IS NULL
08/03/23 14:06:44
\ │ /
/ ̄\
─( ゚ ∀ ゚ )─
\_/
/ │ \
○○○ ○○○
○,,・ω・○ ○・ω・,,○
○○○ ○○○ o
o〜(,_uuノ とuu_,)ノ
FREE TIBET
403:NAME IS NULL
08/03/23 22:28:01
>>402
NO TIBET!
FREE CHINA!!
404:NAME IS NULL
08/03/23 23:30:16
>>401
一旦 utf8 で作ったテーブルの charset を eucjpms に変えても、カラムの charset は utf8 のまま。
手っ取り早いのはテーブルを作り直すこと。
もしかしたら、
alter table xxx convert to charset eucjpms;
でも出きるかもしれないけど、やったことないからわからん。
405:NAME IS NULL
08/03/24 10:54:10
>>400
データベースの初期化からやり直したらどう?
mysql_install_db --user=mysql
406:NAME IS NULL
08/03/24 17:10:55
mysqlhotcopy でデータベースコピーしたあと
mysqldの再起動以外でデータベース読み込ませる方法ないでしょうか。
常時起動させているものなので極力再起動は避けたいです。
407:NAME IS NULL
08/03/24 18:30:46
>>406
やったことは無いけど、mysqladmin refresh でどう?
408:NAME IS NULL
08/03/24 20:08:29
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 'group
varchar(40),
こんなエラーメッセージが出ましたが、どういうことですか?
409:NAME IS NULL
08/03/24 20:10:30
SQL文も晒してね
410:NAME IS NULL
08/03/24 21:41:31
reate table entry(
mail varchar(15),
domain varchar(15),
is_a_group bool,
name varchar(20),
group varchar(40),
post varchar(20),
prefecture varchar(8),
station varchar(20),
adress varchar(40),
tel1 int(4),
tel2 int(4),
tel3 int(4),
birthday date,
industry varchar(40),
type varchar(40),
job varchar(20),
user varchar(20),
agree bool
);
411:NAME IS NULL
08/03/24 21:53:10
reate table entry(
'mail' varchar(15),
'domain' varchar(15),
'is_a_group' bool,
'name' varchar(20),
'group' varchar(40),
'post' varchar(20),
'prefecture' varchar(8),
'station' varchar(20),
'adress' varchar(40),
'tel1' int(4),
'tel2' int(4),
'tel3' int(4),
'birthday' date,
'industry' varchar(40),
'type' varchar(40),
'job' varchar(20),
'user' varchar(20),
'agree' bool
);
412:NAME IS NULL
08/03/24 22:32:30
ありがとうございます。
413:NAME IS NULL
08/03/25 00:35:21 VYc3xvqf
ファイルをキャッシュするのにmysqlを使おうと思います
ファイルパスをキーにしてインデックスを張ることになるかと思いますが
そうなると255文字程度の長さは必要になります
そんな長いインデックスは実用的なのでしょうか?
414:NAME IS NULL
08/03/25 09:00:49
そんなときは、数値でID付けてそのIDを結合したものにインデックス張るといいよ。
415:390
08/03/25 10:29:09
>>405
ありがとうございます。
「MySQL入門以前」という本を見ながらやっているのですが、
「データベースの初期化」というのは書いておらず、まだ一度もやっていません。
もうすこしよく勉強して、はじめからやり直してみようと思います。
ありがとうございました。
416:NAME IS NULL
08/03/25 11:52:42
ファイルパスからmd5とかでhash値出せばそれなりに実用になる
417:NAME IS NULL
08/03/25 12:17:57 rCxdFsPn
ファイルパスにmd5使うって超いいじゃん
バッティングすることなんて天文学的確率だろ
キャッシュ用途としては充分じゃね?
418:NAME IS NULL
08/03/25 16:02:40
Winnyがそうだから
419:NAME IS NULL
08/03/25 17:11:37
レコードの電話番号フィールドに「012-3456-7890」のような文字列が入ってるとして、
「01234567890」でもselect文で検索できるような方法はありますか?
concatのようなselect文中に挿入してレコードの文字列を置き換え(削除)つつ検索できたら
とても幸せなのですが、何かありますでしょうか?
420:NAME IS NULL
08/03/25 17:50:42
>>419
お幸せに・・
select * from hoge where REPLACE(tel,"-", "")="01234567890"
421:NAME IS NULL
08/03/25 17:51:36
>>419
フィールドが半角のみ確実なら正規表現 REGEXP 使えるよ
422:419
08/03/25 20:55:10
__________
||
|| ⊂⊃
|| ∧ ∧ >>420さん >>421さん
|| ( ⌒ ヽ ありがとう、幸せになれると思います
∧||∧ ∪ ノ
( ⌒ ヽ 彡 V
∪ ノ フワーリ
∪∪
423:NAME IS NULL
08/03/25 23:29:33 fL5GORe0
質問で申し訳ないのですが、こんなトリガを書きました。
create TRIGGER Ins_T101
BEFORE INSERT ON `T101_BizUnit`
FOR EACH ROW
BEGIN
DECLARE PrevVer integer DEFAULT 0;
DECLARE InsVer integer DEFAULT 0;
DECLARE PrevExpiration_Date DATE DEFAULT CURRENT_DATE;
DECLARE PrevRecords integer DEFAULT 0;
SELECT COUNT(`ID`) into PrevRecords from `T101_BizUnit` src WHERE src.`Category` = NEW.`Category` AND src.`ID` = NEW.`ID` limit 1;
SET InsVer = NEW.`Version`;
IF PrevRecords > 0 THEN
IF InsVer = 1 THEN
select max(`Version`) into PrevVer from `T101_BizUnit` where `Category` = NEW.`Category` and `ID` = NEW.`ID` limit 1;
SET NEW.`Version` = PrevVer + 1 ;
SET PrevExpiration_Date = NEW.Register_Date - 1;
END IF;
UPDATE `T101_BizUnit` SET `Expiration_Date` = PrevExpiration_Date
WHERE `Category` = NEW.`Category` and `ID` = NEW.`ID` AND `Version` = PrevVer;
END IF;
END;
で登録自体はうまくいったのですが、テーブルに↓こんな感じで、
mysql> insert into T101_BizUnit set `Category` = 1, `ID` = 4, `Register_Date` = '2008-03-25';
Insertを試みると、↓のように怒られてしまいます。
ERROR 1442 (HY000): Can't update table 'T101_BizUnit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
基本的に、トリガというのは呼び出し元がいじっているテーブルそのものはいじれないのが
仕様なのでしょうか?
よろしかったらご意見お聞かせください。
424:NAME IS NULL
08/03/26 12:35:25
質問です。
データベース名にアンダーバーを入れるとなぜかたまにエラーになります。
たとえば「user_address」と言うデータベースを作るとなぜかエラーになる。
前後を区切りたいときは普通アンダーバーで区切ると思っていたのですがたまにエラーになるのでやめます。
普通はどの文字で区切るのかわかりません。
というかアンダーバー以外で区切る方法他にいい案ありますか?
425:423
08/03/26 13:42:35
>>423 自己解決しますた。
URLリンク(dev.mysql.com)
ストアド ファンクションまたはトリガ内では、その関数やトリガを実行したステートメントが
( 読み取り、または書込みに ) すでに使用しているテーブルを改変することはできない。
うぎゃー! 役に立たねージャン!
別テーブルに意図する操作内容を逃がして、定時トリガとかで反映させるくらいしか
アイディアが浮かばない。
どうしたらいいか、引き続きアイディア募集中!
426:NAME IS NULL
08/03/26 15:22:47
>>424
なんでエラーなるの?エラーの内容は?
427:424
08/03/26 15:36:15
>>426
エラーというかデータベースが作れなかった。
何度やっても作れなかったがアンダーバー外したら作れた。
428:NAME IS NULL
08/03/26 16:39:55
>>427
それは、mysqlというよりかはOSのファイルシステムの問題じゃね。
429:424
08/03/26 19:32:52
>>428
まあそういうことになります。
どこで聞くべきかわからなかったので
とりあえずmysqlでエラーがでたのでここで聞いてみました。
失礼しました。
430:NAME IS NULL
08/03/26 20:55:26
質問です。
CREATE TABLE でPARTITION(TABLESPACEとか)を指定しなかったら
テーブルデータはどこに格納されるのでしょうか?
431:NAME IS NULL
08/03/26 22:21:19 edZp6jWv
SELECT * FROM sales WHERE SUM(price)<'10000' GROUP BY sales_id
としたのですが、SQLが間違っているとエラーになります。
WHEREで検索する時、合計値を検索できないのでしょうか?
MySQLは4.1.20を使っています。
432:NAME IS NULL
08/03/26 23:01:48
>>431
having
433:NAME IS NULL
08/03/27 11:11:21
>>425
別テーブルに書き込んで、SELECTするときにJOINするとかどうよ?
434:NAME IS NULL
08/03/27 13:02:47
>>430
ん?何が知りたい?データディレクトリ?
435:NAME IS NULL
08/03/27 13:22:21 haXSw+o7
insertのときに、たとえ1文字であってもひらがなや漢字等を使うと
Data too long for column と出てしまうのはなぜですか?
436:q
08/03/27 13:56:58
seqtable
---------------------------
id seq notes
a 1 ほげ1
a 2 ほげ2
a 3 ほげ3
b 1 ふが1
b 2 ふが2
b 3 ふが3
....
b 100 ふが100
---------------------------
IDごとにseqが振られているテーブルなんですが、
delete table seqtable WHERE id='b' and (seq=77||seq=97);
したあとに
ID:bの連番の欠番を低い順から抜き出すことはできますでしょうか?
(欠番がない場合は最大値+1を返してくれるようにしたいです。)
最大値は以下で取れるので
SELECT (MAX(seq)+1) As max FROM seqtable WHERE id='b';
>ID:bの連番の欠番を低い順
をお願いします。
437:NAME IS NULL
08/03/27 14:09:24 4i6HCVKz
>>436
URLリンク(codezine.jp)
とか
URLリンク(codezine.jp)
とかかな。
438:q
08/03/27 14:53:09
>437さん
ありがとうございます!
上のものでやりたいことは完璧にできました
439:NAME IS NULL
08/03/27 15:14:54
>>435
テーブルの定義見せて。
440:NAME IS NULL
08/03/27 15:36:58 haXSw+o7
create table railroads(
railroad varchar(20)
);
441:NAME IS NULL
08/03/27 17:22:48
>>440
入力した文字コードとテーブルの文字コードが合っていないに一票
442:NAME IS NULL
08/03/27 18:48:04
>>434
データベースのデータがOS上のどこに
保管されているのか知りたいです。
例えば、Oracleの場合、tablespaceの
容量を超えてデータを入れようとすると
エラーになります。(自動拡張OFFで)
その場合は、tablespaceに対して
物理的なデータファイルを追加して
領域拡張してやるのですが、
MySQLの場合は、あちこち調べても
その部分の説明がほとんどされて
おらず、不思議に思っています。
DISKの領域がゆるす限りいくらでもデータを登録できるのか?
そうだとしてもDISK上のどのパーティション(Windowsなら
どのドライブ)に存在するのか知っていないと最大のデータ
格納量も予測できず、不安ではないかと思うのですが。
443:NAME IS NULL
08/03/27 19:11:34
>>442
どこに置かれるかはここに書いてるよ。
URLリンク(dev.mysql.com)
「データベース」って書かれてるとこね。
んで、実際のファイルは使っているストレージエンジンによります。
URLリンク(dev.mysql.com)
普通はMyISAMかInnoDBなので、該当の部分を読んでください。
444:NAME IS NULL
08/03/27 19:13:09
>>442
つ URLリンク(dev.mysql.com)
ここらへんをよく読もう。
各table typeによって格納される場所は異なる。
445:NAME IS NULL
08/03/27 19:14:00
かぶった・・・orz
446:NAME IS NULL
08/03/27 19:47:28
>>442
っていうか、show variables like 'datadir';
447:NAME IS NULL
08/03/27 21:07:09
下記のようなSQLを書いた場合、
何故か id が 0 のものが抽出されてしまいます。
なぜでしょうか?
また、回避法はありますでしょうか?
※検索に利用する為、0と検索された場合はidが0のものが抽出されるようにしたいので
AND id <> 0
は使わないでやりたいです。
SELECT * FROM users WHERE id = 'うんこ'
448:442
08/03/27 21:16:49
ありがとうございます。
ある意味オラクルよりややこしいですね。
449:NAME IS NULL
08/03/27 21:33:34
>>447
usersのCREATE TABLEみせて
450:NAME IS NULL
08/03/27 23:15:04
>>449
こちらになります。
create table users (
index int(11) not null auto_increment,
id int(11) default '0' not null ,
pw varchar(40) not null ,
PRIMARY KEY (index)
);
451:NAME IS NULL
08/03/27 23:40:57
数値と文字列比べちゃダメでしょ。
452:NAME IS NULL
08/03/27 23:45:22
とりあえず、
SELECT cast('hoge' as signed);
を実行してみればいいと思うよ。
453:NAME IS NULL
08/03/27 23:51:10
その場をしのぎたいだけなら、idを文字列にキャストして比較すればいいよ。
SELECT * FROM users WHERE cast(id as char(11)) = 'うんこ';
でもこれだと、idにインデックスが張ってあっても
インデックスが使われないかもしれない。
というか、列にindexとidがあるのがそもそもおかしい。
普通、indexなんて名前付けずに、idにして、
idはnameとかuserとかにして、varcharとかcharにするのが普通じゃないかな。
CREATE TABLE Users (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT
, user_name char(11) NOT NULL DEFAULT '0'
, pw varchar(40) NOT NULL
, PRIMARY KEY (id)
);
454:NAME IS NULL
08/03/28 10:38:32
>>451
数値に対して文字列で比較しても、そもそも型自体が異なるので絶対合致しないもの、と思っておりました。
しかし何故か0のものが抽出されてしまった為、疑問に思いました。
>>452
実行してみました。0が返ってきました。
要するに、数値型のカラムに対して文字列で比較しようとすると、
mysql内部で自動的に cast('hoge' as signed) のような形に変換され、
その結果返ってきた0で抽出条件を掛けてしまう、という事でしょうか?
>>453
ありがとうございます。
期待した通りの結果が返ってきました。
>indexとidがあるのがそもそもおかしい
こちら当方も感じました(他の方が作ったものの修正をしています)。
あと、CREATE TABLE で主キーに UNSIGNED を付ける辺り、なるほどと思いました。
大変勉強になりました、ありがとうございます。
455:NAME IS NULL
08/03/28 12:57:05
MySQLのコマンドラインツール(mysql.exe)のログを取る方法はありませんか?
一度に大量のSQLスクリプトを実行するとログが流れてしまって、
エラーが出ていても気づかないということがあるんです。
456:NAME IS NULL
08/03/28 13:01:59
リダイレクトしてファイルに落とせば?
457:NAME IS NULL
08/03/28 13:07:56
>要するに、数値型のカラムに対して文字列で比較しようとすると、
>mysql内部で自動的に cast('hoge' as signed) のような形に変換され、
>その結果返ってきた0で抽出条件を掛けてしまう、という事でしょうか?
型が違うと、いちど失敗してから変換が発生するから、
明示的に変換するのに比べてオーバーヘッドが発生することだけ頭の片隅にでも置いておけば、
その理解で大体OK
458:NAME IS NULL
08/03/28 13:52:28
>>456
mysql -u username -p database < hoge.sql 1>>log.txt 2>>err.txt
でいけました!ありがとうございました。
459:NAME IS NULL
08/03/28 14:14:57
URLリンク(www.mysql.gr.jp)
あなたが使用している PHP, MySQL のライブラリ(libmysql.dll, libmysqlclient)
の標準キャラクターセットは何かご存じですか?
とありますが、標準キャラクターセットを調べる方法はあるのでしょうか?
460:NAME IS NULL
08/03/28 15:19:09
正規表現の置き換えはできますでしょうか?
イメージとしては以下のような感じです。
hogeテーブル(id=1)のnameに'A([0-9]+)'があった場合、
(SELECT rep FROM rep_table WHERE id=$1)
と置き換える
A1の場合だと(SELECT rep FROM rep_table WHERE id=A1)
よろしくお願いします。
461:NAME IS NULL
08/03/28 15:40:00
正規表現使いたいときも確かにあるが、
その例の場合単に第一正規化されてないだけじゃ?
idを分割すればそういうのも簡単に実現できるだろ。
SELECT rep FROM rep_table R
WHERE EXISTS (
SELECT * FROM hoge H WHERE H.kind = 'A' AND H.id = R.id)
AND R.kind = 'A';
みたいな。
462:NAME IS NULL
08/03/28 15:56:00
>>461さん
レスありがとうございます。
hoge.nameにはA1A3...見たいな感じでA([0-9]+)に複数マッチする可能性があります。(1つもマッチしない場合もあります)
それらすべてを(SELECT rep FROM rep_table WHERE id=$1)の形でとりたいのです。
現状ではプログラム側で、マッチした場合、そのつどSELECTで取得しています。
preg_replace_callback('/A([0-9]+)/','_preg_rep',$query);
function _preg_rep($matches) {
$sql =
"SELECT rep FROM rep_table WHERE id='$matches[1]'";
..
}
わかりづらい質問ですみませんがよろしくお願いします。
463:NAME IS NULL
08/03/28 16:01:21
意図が伝わらなかったかな。
要は、テーブル定義(というか設計)見直せば?ってこと。
正規表現を使わなくても、テーブルさえちゃんとしてれば
461で示したSQLで実現できるよね?
もし変更が不可能だとしても、
idから部分文字列を切り出すとかすれば十分実現可能。
464:NAME IS NULL
08/03/28 16:04:00
どうしても正規表現が使いたいなら、
URLリンク(dev.mysql.com)
ここを参考にすればいい。
でも、正規表現はそこそこ重い処理だから、
RDBMSでは極力使わないほうがいい。
465:NAME IS NULL
08/03/28 17:53:51
>>459
PHPでmysqldに接続して(mysqld側の起動オプションで、charset絡みを何も指定せずに)
show variables like '%char%' ;
で、clientとconnectのところ。
466:NAME IS NULL
08/03/28 20:02:50 t4tLBd+a
>>455
tee
467:NAME IS NULL
08/03/28 22:31:08
>>466
tee log.txt でコンソールに表示されるログがすべて記録されるんですね。ありがとうございます。
468:NAME IS NULL
08/03/29 00:05:43
% mysql hogehoge | tee log.txt
469:NAME IS NULL
08/03/29 12:17:05
% mysql hogehoge | tee -a log.txt
470:NAME IS NULL
08/03/29 23:35:55 3fgyplCn
為になるHP
URLリンク(u.aniota.info)
471:NAME IS NULL
08/03/31 05:40:50 0Cxuk5my
同一テーブルをサブクエリでselectしてdelete出来ないので
テンポラリテーブルを使おうと思いますが、
テンポラリテーブルを削除する前に
何らかの形で操作側のプロセスが死んだ場合、
テンポラリテーブルだらけになるんじゃないかと思うのですが、
そのあたりはどうなってるのでしょうか?
472:NAME IS NULL
08/03/31 11:24:38
>>471
接続が終了するとDROPされるから問題ないんじゃね?
URLリンク(dev.mysql.com)
473:NAME IS NULL
08/03/31 22:16:20 cXmxkjaY
RHEL 5 + MySQL5.0.26で構築してます。
disk容量の監視をしているのですが、
たまに / の下が圧迫されているようです。
どうやら
/tmpの下にキャッシュファイル?をMySQLが作っているようなのですが
どのタイミングでどのようなファイルを吐いているのかわかりません。
Order by などではテンポラリファイルをつくるようですが
前回 Diskが圧迫されたときには、Order byではなく
600万件ほどのテーブルから、uniqueデータのdeleteを繰り返していました。(対象は100万件程)
/tmpの下ってMySQLは何を吐きますか?
delete,updateをするときでも吐きますか?
474:NAME IS NULL
08/03/31 22:57:45 C7l3mT1c
環境の移行をしているのですが、
DB更新処理が既存と同じように動かず困っております。
#新環境の方がバージョンが古いのは気にしないで下さい。
○旧環境
OS - CentOS release 5
perl - 5.8.8
DBI - 1.52
DBD::mysql - 4.005
○新環境
OS - Red Hat Enterprise Linux ES release 3
perl - 5.8.0
DBI - 1.52
DBD::mysql - 2.1021
【現象】
update で、更新先が更新元と同じ値だった場合
(結局レコードの値は何も更新されなかった場合)、
excute() の戻り値が、
旧環境:1
新環境:0E0
となります。
新環境でも 1 となるようにしたいのですが、
何がマズいのでしょうか?
475:NAME IS NULL
08/04/01 10:38:18
>>473
show variables like 'tmpdir';
デフォルトは確か /tmp
作られるのは最適化されていないクエリを発行した場合
476:NAME IS NULL
08/04/01 10:40:09
>>475
mysqlというよりかは、DBIの問題じゃね?
477:NAME IS NULL
08/04/01 10:40:47
↑ おっと、>>474 へのレスだ
478:NAME IS NULL
08/04/01 11:16:33
>>474
DBD::mysqlのバージョンが違うからたぶんそれだな。
バージョン合わせるわけにはいかんの?
479:NAME IS NULL
08/04/01 16:05:23 cwXA9zGK
大変低レベルの質問で恐縮です。
web上のDBを触るのは初めてです。
レンタルサーバー上のMysqlのサービスを利用しようとしています。
接続方法に「アドレス=localhost 内部からの接続のみ許可 」 とあったのですが、
ファイルを操作するときと同じように
FTPツールでサーバーに接続すればいいのでしょうか?
クライアントにMysqlをダウンロードしておいて、
作ったテーブルをサーバーにアップロードするのでしょうか?
UP先は/public_html以下でいいのでしょうか
accessとOracleの使用経験があるのでSQL文は多少分かります。
今回はそれ以前の問題というか…webのことはさっぱりですみません
※こちらが相応しくなければ該当スレお教えください
480:NAME IS NULL
08/04/01 16:12:32
perl/php などのスクリプトに接続IDとパスを書いて
そのmysql、この場合はlocalhostみたいだから鯖にphp置いてそこから
接続にいく感じ
ftpはそういうスクリプトを上げるときにつかうけど
mysqlにつかうときはバックアップを取るときくらいか
481:使ってるのはPython-SQLObject
08/04/01 19:10:39
ここでいいのかよくわかりませんが、疑問・質問等のスレッドがなかったのでここに書きます。使っているのはMySQLなのでここに書きますがデーターベース全般についてです。
ユーザー
+名前
+役割(役割テーブル)
役割
+名前
+説明
のように作る場合に役割を別のテーブルとして定義するとします、これは理解できるのですが。
駅
+住所
住所
+都道府県
+市町村とかそれ以外
のようにデーターベースでは分けるでしょうか?
Pythonのようなオブジェクト指向言語で組み立てれば「駅」オブジェクトは「住所」インスタンスを持つことになると思うので、このようなテーブル構造を思いついたのですが「駅」には固有の「住所」しか当てはまらないので別テーブルにする利点が無い。
「住所」なんてテーブルだと「家」というテーブルを作ったときにこのテーブルからも「住所」を参照することになって「住所」テーブルには「駅」「家」二つのテーブルの住所が記録されることになって美しくない。このような場合どのようにするのがベストでしょうか?
乱文・長文で失礼いたしました、気に触ったらスルーしてください。
482:NAME IS NULL
08/04/01 19:48:45
とりあえず、リレーショナル理論とか正規化について勉強すれば?
RDBMSとかSQLは、オブジェクト指向だとか、
手続き型だとかとは全然違うことがわかると思う。
483:NAME IS NULL
08/04/01 20:36:08
>482
ここまでオブジェクト指向とにていると、どうしてもそれで考えてしまいますorz
おっしゃるとおり、やはりデーターベースの考え方をしっかり学んだほうがいいようですねorz
URLリンク(www.oreilly.co.jp)
のものを読んでみようと思います。ありがとうございました。
484:NAME IS NULL
08/04/01 22:15:46 ZI2HJoUM
test BETWEEN '100' AND '1000'
で、100〜1000の間を抽出出来ますが、
「100〜1000以外」というNOTにしたい場合、どうすればいいのでしょうか?
485:NAME IS NULL
08/04/01 22:21:36
そこでなぜ引用符をつける。
486:474
08/04/01 22:27:15 GR+VJpfB
> 478
やっぱ、DBD::mysql 怪しいっすよね〜
実は新環境と同じ環境ってのが別にあって、
そいつは自分では触れない環境なのですが
そこではちゃんと動いてるらしく、
バージョンは変えたくないらしいのです。。
487:NAME IS NULL
08/04/01 22:30:35
SELECT hoge FROM Nanika WHERE test BETWEEN 100 AND 1000;
SELECT N1.hoge FROM Nanika N1
WHERE N1.test NOT IN (
SELECT N2.test FROM Nanika N2
WHERE 100 AND 1000
);
・・・ごめんなさい。
SELECT hoge FROM Nanika WHERE test < 100 OR test > 1000;
488:484
08/04/01 22:47:34
すみません、単純に
test NOT BETWEEN '100' AND '1000'
で、目的の結果を得ることが出来ました。お騒がせしました。
489:NAME IS NULL
08/04/02 11:15:13
>>486
ChangeLogのこれかな。
2003-06-22 Rudy Lippan <rlippan@remotelinux.com> (2.9002)
* Changed the default behaviour of mysql_found_rows, so now
'UPDATE table set field=?' will return the number of rows matched
and not the number of rows physically changed. You can get the old
behaviour back by adding "mysql_found_rows=0" to the dsn passed
to connect.
490:NAME IS NULL
08/04/03 16:45:12
mysqlをインストールして適当にデータを入れてみたのですが、このデータをhtml上に呼び出すのってどうすればいいのでしょうか?
491:NAME IS NULL
08/04/03 16:47:14
これまた大味な
492:490
08/04/03 16:54:27
SQLでselectしてデータを取り出すというのは分かるのですが、それをどうやったらページ上に表示できるのかなぁと
javascriptみたいにhtml上に直接かけるわけでもないですし
493:NAME IS NULL
08/04/03 17:03:12
PHP、CGI、JSP、ASP、ASP.NET
さぁ、好きなのをお選び。
494:NAME IS NULL
08/04/03 17:07:39
>>493
MySQLからSQLでデータを取り出し、それからさらにPHPなどでHTMLに渡すという事でしょうか?
めんどくさいですね・・・
495:490
08/04/03 17:13:13
phpを使う場合はphpの中にSQLを書く事ができるんですね
496:NAME IS NULL
08/04/03 17:14:52
他でも一緒だよ
とりあえず、これ以上はスレ違い、というより板違いな気が
497:NAME IS NULL
08/04/03 17:32:17
それが面倒だと思うなら、Flashから直接SQLサーバと通信してください。
サーバ系は一切必要なくなりますよ。
URLリンク(asql.mooska.pl)
498:NAME IS NULL
08/04/03 23:08:13
SQLでデータベースからデータをselectした後、そこからさらにデータを絞り込む事はできますか?
具体的に言いますと、抜き出したデータの5行目〜10行目だけを選択するという感じなのですが、可能でしょうか?
499:NAME IS NULL
08/04/03 23:20:23
可能です
500:NAME IS NULL
08/04/03 23:38:14
>>499
それってSQLだけで可能ですか?
501:NAME IS NULL
08/04/04 02:01:41
WebProgの質問スレにいた、車のデータベースの人?
502:NAME IS NULL
08/04/04 05:27:22
>>500
可能です
503:NAME IS NULL
08/04/04 05:44:09
>>502
マジで?
504:NAME IS NULL
08/04/04 06:26:05
マジで
505:NAME IS NULL
08/04/04 09:53:27
ストアドプロシージャ
506:NAME IS NULL
08/04/04 10:25:42
ストアドプロシージャはSQLじゃないだろ。
というか、なんで5〜10行目が必要なんだ?
それは何かがおかしい気がする。
507:NAME IS NULL
08/04/04 11:55:27
>>502
ありがとうございます
>>501
えっと・・・何のことでしょうか?
508:NAME IS NULL
08/04/04 12:57:49
>>498
limit
509:NAME IS NULL
08/04/04 13:42:21
uniqueキーを削除したいのですがテーブル定義時に
UNIQUE KEY(`hoge_id`,`sequence`)
としてしまいました。
この場合どうやって削除すればいいのでしょうか?
510:NAME IS NULL
08/04/04 14:27:21
>>509
drop index
511:NAME IS NULL
08/04/04 19:34:13
>>493
PHPだってCGIだろ
知ったか乙
512:NAME IS NULL
08/04/04 20:13:39
PHPとCGIは区別するべき
知ったかぶりはどっちだか
513:NAME IS NULL
08/04/04 21:04:28
PHPはSSIだな
514:486
08/04/05 10:35:42 C1KIQxkZ
> 489
それだ!!!
ありがとうございます。
きっと新環境と同じ環境の DBD::mysql は、
2.9002以降が入ってるんだろうな〜
確認してみます。
ありがとうございました!!!
515:NAME IS NULL
08/04/05 15:23:56 gepjJM1m
質問させて下さい。
バックアップについての質問なのですが、テンプレで紹介して頂いているphpMyBackupProを使用してみました。
MySQL5.0.45、phpMyBackupPro2.1、phpMyAdmin2.10.3、PHP5
を使用しています。
phpMyBackupProを使ったデータのバックアップ時に大きいDB(300MB程)のバックアップができません。
数MB程のDBなら何事もなくバックアップできています。
また、何も設定を変えずともphpMyAdminであれば全てのDBをバックアップできることを確認しています。
この状況で、phpMyBackupProの拡張設定:PHP 時間制限 (秒)を600秒にし、
php.iniでmax_execution_time = 600、max_input_time = 600にし、
apacheを再起動したのですが、phpMyBackupProの挙動はかわりありません。
純粋なSQLの質問ではないのでどこに質問したらいいのか迷ったのですが
総合と言うことで質問させて頂きました。
色々調べてみたのですが私には検討がつかず困っています。
お力添え頂けないでしょうか。
宜しくお願い致します。
516:515
08/04/05 16:03:48
すみません、php.iniをmemory_limit = 512Mとすることで解決できました。
自己レスですが失礼致します。
517:NAME IS NULL
08/04/06 07:05:21 UtTMq1DC
教えて頂けますでしょうか。
MySQLのSQL文チューニングに関してもっと知りたいのですが
EXPLAINの見方や、primary、index、unique、複合index等に詳しいサイト、もしくはオススメの本などありますでしょうか?
やっと時間ができたので調べたいなと思っています。
518:NAME IS NULL
08/04/06 09:57:59
教えてください
MySQL始めようと思っています
とりあえず趣味程度で勉強も兼ねて
フォームとかレポートとかを作るのに必要なものは何ですか?
お勧めは何ですか?
当方はAccessしか使ったことなく、そういった知識がありません。
519:NAME IS NULL
08/04/06 12:00:06
>518
フォームもレポートもSQLに関係ない気がするんだけど
それは僕が初心者だからなのでしょうか?
とりあえず使用目的と環境とフロントエンド次第じゃねーの?
520:NAME IS NULL
08/04/06 12:03:00
関係あるかどうかも解らないアフォウです
MySQLのデータをフォームで入出力更新したり、レポートで集計してプリントしたりするためには
何を用意すれば良いですか?
521:NAME IS NULL
08/04/06 12:51:24
フォームを作ったり、データを集計して出力するプログラム。
522:NAME IS NULL
08/04/06 14:34:18
お勧めは何ですか?
523:NAME IS NULL
08/04/06 14:39:38
用途と環境と貴方の知識による。
524:NAME IS NULL
08/04/06 15:36:28
フロントエンドって何ですか?
用途:個人事業で使うデータを扱いたいんだけど、1万件前後、あと簡単な計処理と、3人いる愛人とのプレイデータ管理もしたいです
環境:年々、温暖化が進行してる気がします
知識:Accessを使いこなせる程度と英検1級
525:NAME IS NULL
08/04/06 19:14:05
以前から終わってる ってことだよ
526:NAME IS NULL
08/04/06 20:14:26
インデックスにはユニークID、PRIMARY KEY、インデックスなどがありますが、これって全部同じものですか?
527:524
08/04/06 21:25:16
教えてください<m(__)m>
528:NAME IS NULL
08/04/07 01:40:05
>>526
ちがうよ
529:NAME IS NULL
08/04/07 07:22:36
>527
質問者本人以外に答える必要はないと思うんだ
530:NAME IS NULL
08/04/07 15:35:41
>>528
どのように違うのでしょうか?
531:NAME IS NULL
08/04/07 15:40:35
>>530
用途も意味も何もかも全部ちがうよ
532:NAME IS NULL
08/04/08 00:15:31
人生の選択も含めて全部ちがう
533:NAME IS NULL
08/04/09 11:06:13 rr+k5v3w
MySQLのストアドプロシージャで質問です。
引数を可変にしたいんですが、どうしたらよいでしょうか?
call sp ( 123, 445);
でも
call sp (123);
でも動作する。
445が指定されていれば内部で取得できる。
ということがしたいです。
534:NAME IS NULL
08/04/09 14:19:54
>>517
URLリンク(www.oreilly.co.jp)
535:NAME IS NULL
08/04/09 19:26:18
>>533
なんでそんなことしたいん?
NULLでも渡しておけば?
536:NAME IS NULL
08/04/10 00:35:24 9S23/fv1
MySQL5.1でlock tablesに関する質問なのですが、
lock tables
単一テーブルに対するsql文
unlock tables
とすると、TOPコマンドでのロードアベレージが2前後から一気に30前後になってしました。
ただ、サイトの表示自体は早くなっている感があります。
この場合、ディスクが足を引っ張っているのかデッドロックになっているのか
そもそもロードアベレージは下がると期待していたのですがとまどっています。
同様事例の参考資料が見つからず途方に暮れております。
宜しければアドバイスお願いできないでしょうか。お願いします。
537:NAME IS NULL
08/04/10 09:50:41
すみません、質問させてください。
MySQL5.0を使用しているマシンで、ほぼ毎日午前3時前後に下記のようなエラーログが出力されます。
特に午前3時と指定して実行している処理はないと思うのですが、
下記はどのような場合に出力されるエラーなのでしょうか?
080407 3:15:28 InnoDB: ERROR: the age of the last checkpoint is 188694697,
InnoDB: which exceeds the log group capacity 156653568.
InnoDB: If you are using big BLOB or TEXT rows, you must set the
InnoDB: combined size of log files at least 10 times bigger than the
InnoDB: largest such row.
080408 3:11:29 InnoDB: ERROR: the age of the last checkpoint is 156654082,
InnoDB: which exceeds the log group capacity 156653568.
InnoDB: If you are using big BLOB or TEXT rows, you must set the
InnoDB: combined size of log files at least 10 times bigger than the
InnoDB: largest such row.
538:533
08/04/10 11:21:47 zXvXwiNf
>535
デバッグフラグを立てたいのさ。
通常は使用しないから引数を意識させたくない。
539:NAME IS NULL
08/04/10 13:30:20
hoge_tbl
--------------------
id time
1 21:00
1 22:00
1 21:00
1 23:00
1 12:00
1 21:00
1 21:00
...
--------------------
こんなログを保存しているテーブルがあるとして
時間ごとのアクセス数を取得したいのですがどのような書き方があるでしょうか?
とり方としては
-------------------------
id time cnt
1 01 52
1 02 41
1 03 12
1 04 9
1 05 4
...
-------------------------
もしくは
------------------------------
id 01 02 03 04 .....
1 52 41 12 9
------------------------------
どちらでもかまいません。(可能であれば後者)
以下は自分なりに書いてみたものです。
SELECT
DISTINCT(id),
(SELECT COUNT(*) FROM hoge_tbl WHERE id=a.id and DATE_FORMAT(time,'%H') = '01') As `01`,
(SELECT COUNT(*) FROM hoge_tbl WHERE id=a.id and DATE_FORMAT(time,'%H') = '02') As `02`,
....
FROM hoge_tbl a
WHERE id=1;
一応、自分で書いたSQL文でもできましたがidが複数あり処理に時間がかかりすぎるため熟練者さまのご意見を聞ければと思います。
長文になりましてすみませんがよろしくお願いいたします。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5393日前に更新/244 KB
担当:undef