• 締切済み

phpPgAdminからSQL文を発行し、重複しない文字列を挿入したいのですが・・・

下記のような nickname テーブルがあります。 nickname | id | name | | 1 |あいうえお | | 2 |hogehoge | カラム「name」はユニークな値として設定してあります。 そこで、phpPgAdminを使用し下記のようなSQLを発行するとニックネームが重複しているとエラーが発生してしまいます。 INSERT INTO nickname VALUES (3,'(2)'); INSERT INTO nickname VALUES (3,'(8)'); 「(2)」と「(8)」が同じ文字と判断されているようなのですが、なぜなのか教えて欲しいです。 また、これを回避する方法はあるのでしょうか? 他にも「@@@」と「.BW」も同じ文字として認識されてしまうようです。 SQLのバージョンはPostgreSQL 7.4.7を使用しております。 --追記-- 上記で説明している「(2)」と「(8)」ですが、○に囲まれた数字文字です。 なぜか、gooに投稿すると()半角括弧でかこまれた文字になってしまいます・・・

みんなの回答

  • nao_2
  • ベストアンサー率10% (38/366)
回答No.3

   --追記-- これだとどうでしょうか? INSERT INTO nickname VALUES (3,'?'); ?は丸数字の2 INSERT INTO nickname VALUES (4,'?'); ?は丸数字の8 ってことで(^^ゞ   

  • nao_2
  • ベストアンサー率10% (38/366)
回答No.2

    これだとどうでしょうか? INSERT INTO nickname VALUES (3,'?'); INSERT INTO nickname VALUES (4,'?'); もしくわ INSERT INTO nickname VALUES (5,'@@@'); INSERT INTO nickname VALUES (555555,'.BW'); はたまた INSERT INTO nickname VALUES (39,'サンキュー'); INSERT INTO nickname VALUES (111,'大変失礼で'); INSERT INTO nickname VALUES (222,'すがひょっと'); INSERT INTO nickname VALUES (333,'してidにkey'); INSERT INTO nickname VALUES (444,'設定されて'); INSERT INTO nickname VALUES (555,'いませんで'); INSERT INTO nickname VALUES (666,'しょうかご'); INSERT INTO nickname VALUES (777,'確認ください'); INSERT INTO nickname VALUES (888,'パチパチパッチンそろばん算'); INSERT INTO nickname VALUES (1091,'入れ食い'); INSERT INTO nickname VALUES (2525,'ニコニコ'); INSERT INTO nickname VALUES (3902,'炸裂'); INSERT INTO nickname VALUES (4649,'よろしく'); INSERT INTO nickname VALUES (5213,'ごっついさ'); INSERT INTO nickname VALUES (6080,'老齢バレー'); INSERT INTO nickname VALUES (7833,'ナンパ散々'); INSERT INTO nickname VALUES (8064,'晴れろよ'); INSERT INTO nickname VALUES (9181,'クイーン杯'); INSERT INTO nickname VALUES (22360679,'富士山麓鸚鵡鳴く'); INSERT INTO nickname VALUES (299792458,'肉球鳴く西交番'); とか... クエリーは、成功しました: 1行の影響があり,実行時間は、 20 ミリ秒でした。     SELECT name FROM nickname WHERE id BETWEEN '101' AND '800'; ませ(^^;    

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

DBの文字コードは? 入力している文字コードは? ○に1などは、機種依存文字です。 いわゆる sjis-winな文字 この質問サイトでは、機種依存文字は別な共通な文字コードに変換されます。 ○に数字のほかにも ローマ数字や トンやミリメートル など1文字で表すような文字も変換されます。

関連するQ&A

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • tutorial/funcs.sqlの中のSQL文

    の中に CREATE TABLE EMP ( name text, salary integer, age integer, cubicle point ); INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)'); INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)'); INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)'); INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)'); INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)'); -- the argument of a function can also be a tuple. For instance, -- double_salary takes a tuple of the EMP table CREATE FUNCTION double_salary(EMP) RETURNS integer AS 'SELECT $1.salary * 2 AS salary' LANGUAGE SQL; SELECT name, double_salary(EMP) AS dream FROM EMP WHERE EMP.cubicle ~= '(2,1)'::point; というコードが有るのですが 最後のWHERE EMP.cubicle ~= '(2,1)'::pointの ~= はどういうもので どんなときにつかうのでしょうか? また単なる = ではエラーになるようなのですが=との使い分けはどのようにすれば良いのでしょうか? よろしくお願いします

  • SQL文について

    SQLite バージョン3.7.10 を使用しています。 次のようなテーブル構造で、 PRAGMA foreign_keys = ON; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t2 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t2 (key, name) VALUES ('t2_key1', 't2_name1'); INSERT INTO t2 (key, name) VALUES ('t2_key2', 't2_name2'); CREATE TABLE t3 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t3 (key, name) VALUES ('t3_key1', 't3_name1'); INSERT INTO t3 (key, name) VALUES ('t3_key2', 't3_name2'); CREATE TABLE t4 ( year TEXT NOT NULL, t1_key TEXT NOT NULL, t3_key TEXT NOT NULL, percent INTEGER NOT NULL, UNIQUE(year, t1_key, t3_key), FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2011', 't1_key1', 't3_key1', 10); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key2', 50); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key1', 100); CREATE TABLE t5 ( no INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, t1_key TEXT NOT NULL, t2_key TEXT NOT NULL, t3_key TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t2_key) REFERENCES t2(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-01-01', 't1_key1', 't2_key1', 't3_key1', 3000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-02-02', 't1_key2', 't2_key1', 't3_key1', 2000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2012-01-01', 't1_key2', 't2_key1', 't3_key1', 5000); 例えばテーブル「t5」から、 dateカラム=’2011’ t1_keyカラム= (テーブル「t1」のt1_nameカラム=’t1_name1’のt1_key1) t2_keyカラム= (テーブル「t2」のt2_nameカラム=’t2_name1’のt2_key1) という条件の含まれてる全ての対応する行に、 テーブル「t4」のpercentカラムとテーブル「t5」のamountカラムを 掛け合わせた数値の合計を出力する。 ただしテーブル「t4」に対応するt1_keyとt3_keyがなければ、 percentを「0」としてamountと掛ける。 例えばこの条件だと '2011-01-01'と'2011-02-02'の2つの行のamountの合計を求めることになりますが、 '2011-01-01'の方は、テーブル「t4」にpercent「10」があるので 3000×(10/100)=300 '2011-02-02'の方は、テーブル「t4」にpercentがない(対応する行がない)ので 2000×(0/100)=0 合計 300+0=300 という結果が得たいです。 これはどのようなSQL文になるのでしょうか?

  • エクセルでSQL文を自動で出力させたい

    INSERT INTO `TableInfo` ( `author_id` , `name` , `no` , `addr` ) VALUES ('其一', '其二', '其三', '其四'); 上記のようなテーブルがありINSERTでデータを登録させていきたいと思っています。 そこで、エクセルに打ち込んだデータを、 '其一' '其二' '其三' '其四' に置き換えてSQL文としてテキストファイル等に出力させたいと思います。 エクセルはあまり得意ではなくどうやれば良いか判りません。 どなたか御教授お願い致します。

  • SQLのINSERT文について

    SQLのINSERT文について Accessを使用していて1列目が管理Noとなっています。 その時のレコード数を管理Noに指定したいのですがうまく行きません。 Insert Into TableA Values((Select Count(*) From TableA),'データ') 原因もしくは他の方法があればご教授お願いします。

  • 指定した条件の組み合わせのSQL文

    SQLite バージョン3.7.10 を使用しています。 以下のようなテーブル構造で、 「t1」テーブルの全ての行と 「t6」テーブルのdateカラムの年の部分を グループ化して全ての組み合わせの 「t6」テーブルのamount の合計を出力したいのですが、 どのようなSQL文を書けば良いのでしょうか? 例えばこのデータ内容なら、以下のような結果が得たいです。 +------+-------+-------+ | year | t1_name | 合計 | +------+-------+-------+ | 2011 |t1_name1|  5000| +------+-------+------+ | 2012 |t1_name1| 10000| +------+-------+------+ | 2012 |t1_name2| 45000| +------+-------+------+ PRAGMA foreign_keys = ON; DROP TABLE IF EXISTS t6; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t6 ( no INTEGER PRIMARY KEY AUTOINCREMENT, t1_key TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE ); CREATE INDEX date on t6(date); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2011-01-01', 5000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2012-01-01', 10000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-01-01', 15000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-02-01', 30000); http://ideone.com/I1mMba

  • PHPでInsertを実行したら空白のレコードが追加される

    PostgreSQL 8.0.1 PHP 4 Apache 1.3 で環境を構築しています。 PHPで、 $sql=sprintf("insert into records values('20','test2','cal')"); と入力し実行すると、きれいにDBに登録できるのですが、 $sql=sprintf("insert into records values('%s','%s','%s')",$no,$name,$address); と入力したら、DBには空白で登録されてしまいます。 何がおかしいのか検討が付かなくて困っております 宜しくお願い致します。

  • PDOで文字列が正しく書けない

    PHP5.5(Windows 32bit) with PDO(PostgreSQL) + PostgreSQL 9.3(64bit) + Windows 7 です。 id(integer PK), text1(text), text2(text) の列を持つテーブル test に対して  INSERT INTO test (id, text1, text2) VALUES (41, '\', '<?xml version="1.0"?>') を pgp admin で実行すると正常に行がインサートされます。ところが PDO の prepare にこの SQL を単純に渡して実行すると text2 に <$1xml version="1.0"$2> というおかしな文字列がセットされてしまいます。 どうも 直前の列データが '\' というように、末尾が \ になっている文字列を渡す時だけ 次の列データ '<?xml version="1.0"?>' の中の ? がプレースホルダーとして処理されるっぽいのです。 どう考えてもPDOのバグのような気がするのですが、お心当たりのバグや回避方法などありましたら よろしくお願い致します。

    • 締切済み
    • PHP
  • SQL文のSyntaxエラー

    お世話になります。 以下のSQL文でSyntaxエラーが出てしまい、考えても考えてもエラーが出続けているので「どこでエラーが発生して、訂正したSQL文」をご教授いただければ幸いです。 $sql="insert into 'post' ("name","comment","created_at") values ('" . mysql_real_escape_string($name) . "','" . mysql_real_escape_string($comment) . "','" . date('Y-m-d H:i:s') . "')"; PHP内でのSQL文です。参考にしたのは技術評論社「パーフェクトPHP」p.190です。 以上、よろしくお願いします。

    • 締切済み
    • PHP
  • 指定された趣味を持つメンバーがいるグループを抽出するSQL

    グループテーブル、メンバーテーブル、趣味テーブルの3つのテーブルがあります。 あるメンバーはあるグループに属しており、趣味を1つ持っています。 以下がそのSQLです。 CREATE TABLE groups ( g_id int primary key ); CREATE TABLE members ( m_id int primary key , g_id int , h_id int ); CREATE TABLE hobbies ( h_id int primary key, h_name text ); INSERT INTO groups VALUES ( 1 ); INSERT INTO groups VALUES ( 2 ); INSERT INTO groups VALUES ( 3 ); INSERT INTO members VALUES ( 1, 1, 1); INSERT INTO members VALUES ( 2, 1, 3); INSERT INTO members VALUES ( 3, 1, 4); INSERT INTO members VALUES ( 4, 1, 4); INSERT INTO members VALUES ( 5, 2, 1); INSERT INTO members VALUES ( 6, 2, 2); INSERT INTO members VALUES ( 7, 2, 3); INSERT INTO members VALUES ( 8, 3, 2); INSERT INTO members VALUES ( 9, 3, 3); INSERT INTO members VALUES ( 10, 3, 4); INSERT INTO hobbies VALUES ( 1, 'sports' ); INSERT INTO hobbies VALUES ( 2, 'music' ); INSERT INTO hobbies VALUES ( 3, 'book' ); INSERT INTO hobbies VALUES ( 4, 'drive' ); 指定された趣味を持つメンバーがいるグループを抽出するにはどうすればいいでしょうか? 例えば、「読書が趣味なメンバーとドライブが趣味なメンバーがいるグループは?」「グループ1とグループ3」のような感じです。 一応自分で考えてみたのが、以下ですが、これだと趣味の指定が増減すると大きくSQLが変わってしまいます。 もっといいやり方はないでしょうか? 私はPostgreSQL8を使ってますが、汎用的なSQLであれば、そっちの方がいいです。 SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'drive' INTERSECT SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'book';