重複チェックの問題:半角と全角の違い

このQ&Aのポイント
  • 重複チェックにおいて、半角と全角の文字が同じものとして判定される問題があります。
  • 例えば、「ABCD」という商品が登録されている状態で、「ABCD」と全角文字の商品を登録しようとすると、重複チェックに引っかかります。
  • 半角と全角は実際には異なる文字コードとして扱われるため、本来は別の商品として扱われるべきです。しかし、現状では同一の文字として判定されてしまいます。
回答を見る
  • ベストアンサー

重複チェックはこれでいいの?

重複チェックはこれでいいの? VB2010とSQL Server R2で開発しています。 商品の二重登録を防ぐために重複検索をしています。 '重複チェック '■Shohin_name の重複チェック whereString = "" whereString = whereString & "Shohin_name = '" & txtShohinName.Text & "'" rtn = dbtShohin.getDoubleFind(whereString) でこの後以下のSQLに渡しています。 sql = "" sql = sql & " SELECT * " sql = sql & " FROM " sql = sql & " tbl_shohin" sql = sql & " WHERE " & whereString 当然Shohin_name はstringですし、SQL Server中は「varchar」です。 既に「ABCD」という商品が登録されているところに、「ABCD」と全角文字の商品を 登録しようとすると、重複チェックではねられてしまいます。同じものがある、といってきます。 これって、おかしくないですか? 本来半角と全角ではぜんぜん別物ですよね。 何がいけないんでしょうか? それともこういうものなんでしょうか? 教えて下さい。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

はじめまして、通るすがるともうします。 全角/半角についてなのですが、以下サイトとおなじような現象ではないでしょうか? http://www.horikawa.ne.jp/cgi-bin/showlog.cgi?kd=2&no=1627 あと、書き込みのための存在チェックなのですが、なるべく付加をかけないように 心掛けてチェックを行ったほうがよいと思います。ダミーで読み込むようにしても 実際必要のないデータを読み込み、不必要にメモリ-を消費し、他プロセスのレスポン ス等に影響を与えてしまうからです。 存在チェックそのものは、条件さえ同じであれば、その条件にマッチする件数が 1件以上存在していることを確認すれば済むのではないでしょうか? 件数のみ確認するのであれば、dbとapのやり取りにかかるデータ量は数値のみ の情報となり低コストで判断できるかと思います。

その他の回答 (1)

noname#140925
noname#140925
回答No.1

>これって、おかしくないですか? >本来半角と全角ではぜんぜん別物ですよね。 >何がいけないんでしょうか? >それともこういうものなんでしょうか? DBの設定見直して、全角と半角を区別するように設定変更してください。 [参考]SQL 照合順序の選択 http://msdn.microsoft.com/ja-jp/library/ms144250(v=SQL.90).aspx DBの設定そのままでやるなら、DataSetのCaseSensitiveを設定すれば区別出来るようです。 [参考]DataSet.CaseSensitive プロパティ http://msdn.microsoft.com/ja-jp/library/system.data.dataset.casesensitive(VS.71).aspx [参考]DataViewのRowFilterでの全角半角区別 - Insider.NET - @IT http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36915&forum=7

関連するQ&A

  • 重複が

    新規登録の時の重複をチェックしたいです テーブルのカラムはシンプルにidとnameとpassだけです nameに同じ名前の人がいると困るので、HTMLフォームから送られた名前と登録してある名前の重複がないかチェックするようにできますか? やってみましたが動きません(ーー;; $name = mysql_real_escape_string($_POST['name']); $name3=array(); $name2 = mysql_query('SELECT name FROM hoge2 WHERE name=$name'); while($data = mysql_fetch_assoc($name2)) { array_push($name3, $data['name']); } if(isset($name3)){ print "重複があります"; }else{ //ここからsql $sql = sprintf('INSERT INTO hoge2 SET name="%s", pass="%s"', $name, mysql_real_escape_string($_POST['pass']) ); //ここまで mysql_query($sql) or die(mysql_error()); }

    • ベストアンサー
    • MySQL
  • SQLの質問です。

    Oracle Database Express Editionを使って勉強中の者です。 商品TBL、予約TBL、明細TBLと3つのテーブルを使用して、商品に対して予約と受取の明細がきちんと出ているのか、件数を出すSQLを組みたいと思っています。 例えば、 【商品TBL:shohin】 shohin_no / shohin_nm / price ----------------------------- s001 / name1 / 1000 s002 / name2 / 1500 s003 / name3 / 2000 【予約TBL:yoyaku】 yoyaku_no / shohin_no / status(1:予約, 2:受取) ----------------------------- y001 / s001 / 1 y001 / s001 / 2 y002 / s001 / 1 y002 / s002 / 1 y002 / s002 / 2 【明細TBL:receipt】 shohin_no / status / receipt ----------------------------- s001 / 1 / abc.. s001 / 2 / def.. s002 / 1 / ghi.. 【想定結果】 商品NO / 予約数 / 予約明細数 / 受取数 / 受取明細数 ----------------------------- s001 / 2 / 1 / 1 / 1 s002 / 1 / 1 / 1 / 0 s003 / 0 / 0 / 0 / 0 としたいのですが、どうにも上手くいかず、下記のような結果が返ってきます。 【結果】 商品NO / 予約数 / 予約明細数 / 受取数 / 受取明細数 ----------------------------- s001 / 2 / 2 / 2 / 2 s002 / 1 / 1 / 1 / 0 s003 / 0 / 0 / 0 / 0 私が実行したSQLは下記です。 恐らく何か初歩的な所で間違っているような気がするのですが、自分では分からず…。 一体何がいけないのか、ご教授の程、よろしくお願い致します。 select shohin.shohin_no as "商品NO" ,count(yoyaku_1.shohin_no) as "予約数" ,count(receipt_1.shohin_no) as "予約明細数" ,count(yoyaku_2.shohin_no) as "受取数" ,count(receipt_2.shohin_no) as "受取明細数" from shohin ,(select * from yoyaku where yoyaku.status = '1') yoyaku_1 ,(select * from yoyaku where yoyaku.status = '2') yoyaku_2 ,receipt receipt_1 ,receipt receipt_2 where yoyaku_1.shohin_no(+) = shohin.shohin_no and yoyaku_2.shohin_no(+) = shohin.shohin_no and receipt_1.shohin_no(+) = yoyaku_1.shohin_no and receipt_1.status(+) = yoyaku_1.status and receipt_2.shohin_no(+) = yoyaku_2.shohin_no and receipt_2.status(+) = yoyaku_2.status group by shohin.shohin_no order by 1

  • sqlで重複チェック

    よろしくお願いします。 会員サイトのマイページにて住所などの情報を更新するページを作成しておりますが、つまづいております。 情報の更新は住所や電話番号なのですが、住所のみを更新する際、電話番号の重複チェックで、 重複チェック用にデータをSELECTした時、自分自身のレコードが含まれているため、自分自身のレコードで重複となってしまい、先に進めません。 WHERE句をうまく利用すればできると思うのですが思いつきません。。。 どのようにSQLを書けばいいのかご伝授ください。

    • ベストアンサー
    • MySQL
  • 重複チェックの記述でご教授くださいませ。

    日頃はデザイン関連の作業担当なのですが、、、、 データの重複チェック方法で  会員番号と店舗番号を入力するのですが 登録画面には //会員番号重複チェック if(Duplication_Check2("store_table","'".$kaiin_no."'",$tenpo_no)){ $err .= "会員NO「".$kaiin_no."」で店舗NO「".$tenpo_no."」は既に登録されています。<br />"; } としてまして、重複のエラー表示をさせています。 重複チェックの関数定義では //重複チェック2 function Duplication_Check2($kaiin_no,$tenpo_no){ global $db; $sql = "select * from store_table where kaiin_no='".$kaiin_no."' and tenpo_no=".$tenpo_no; $rst = pg_query($db,$sql); if($rst){ if(pg_num_rows($rst) = 0){ return true; }else{ return false; } }else{ return false; } } としたのですが ここに文法エラーが出ます。 初心者の質問で恐縮なのですがどこをどうすればいいのでしょうか? ご教授いただければ幸いです。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。

  • MySQLで戻り値が重複している

    PHPとMySQLを使っています。 下のようなSQL文を作成し、値を引き出そうとしています。 <SQL文> SELECT * FROM table_name WHERE A = "あ" AND B='い' <DBに登録済みの取り出したいデータ> あ、い、う、え、お ところが、戻ってくる値が、 あ、あ、い、い、う、う、え、え、お、お のように、値が重複して戻ってきます。 いろいろ調べましたが、原因がさっぱりわかりません。 ご存知の方、教えていただけると助かります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • php+mysqlでの重複チェックについて

    phpからCSVに吐き出して重複チェックを考えていたのですが 大変そうなので、mysqlを導入し、php+mysqlで重複チェックを行なうことにしました。 nameをユニークインデックスにしたところ 同じ名前は登録されなくなったのですが できれば、「その名前は登録済みです!」と表示させたいです。 エラーコードかなにかを使って 判断するのでしょうか? 以上、宜しくお願いいたします。 -----文字数の関係で一部削除しております。----- <?php //DBへ接続開始 $link = mysqli_connect($host, $user, $password, $database); if (!$link) { print("接続できませんでした"); exit(); } /* 文字セットを utf8 に変更します */ mysqli_set_charset($link, "SJIS"); //オートコミットOFF mysqli_autocommit($link, FALSE); // ステートメントの設定 $sql = 'INSERT INTO not_schoolmate (id,name,) VALUES(?,?)'; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param( $stmt,"ss", $id, $name ); // 値設定 if($errflg == 0){ $id = $_POST["id"]; $name = $_POST["name"]; //SQL文を実行する mysqli_stmt_execute($stmt); //コミットする mysqli_commit($link); //ステートメントクローズ mysqli_stmt_close($stmt); ?>

    • ベストアンサー
    • PHP
  • プロシージャで変数をテーブル名として使用したい

    いつもお世話になります。 以下のような感じで変数をテーブル名として参照したいのですが、できますでしょうか。 --ここから create proc proc_test @tbl_name varchar(30) as select count(*) from [dbo].[@tbl_name] --ここまで ver:SQL Server2000 宜しくお願いいたします。

  • SQLServerトリガー(データ追加時)

    Microsoft SQL SERVER 2005でデータ更新/追加時に起動するトリガーを 作成したいのですが記述方法がわかりません。 テーブル:TBL_SHOHIN SHOHIN_NAME NVARCHAR(50) /* 商品名 */ SAKUSEI_DATE datetime /* 作成日付 */ KOSHIN_DATE datetime /* 更新日付 */ このTBL_SHOHINテーブルに追加があった時は、作成日付(SAKUSEI_DATE)にシステム日付をセット このTBL_SHOHINテーブルに更新があった時は、更新日付(KOSHIN_DATE)にシステム日付をセット 更新時は下記の記述でうまくいったのですが、追加時をどう記述すればいいの でしょうか? create TRIGGER trgSHOHIN ON TBL_SHOHIN FOR INSERT, UPDATE AS BEGIN UPDATE TBL_SHOHIN SET KOSHIN_DATE = GETDATE() END RETURN

  • 名前の重複チェック

    簡単ですがデータベースのようなものを作っています。 データ量が大きくなってきたので重複チェックが大変になってきました。 今までは、 if ($in{'name'} eq $name) { $hit++; } if($hit){print "この店舗はすでに登録されています。\n";} と言う風にチェックしていたのですが、これでは完全合致しかヒットしませんよね。 大文字・小文字の差や空白が入ったりするだけでヒットしなくなってしまいます。 これを、例えばgoogleの検索のように「語句の一部が含まれれば」リスト表示し、無ければ登録ページに移動すると言う風にするにはどのようにしたらよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう