none
SQL Sever 200 での照合順序について(初心者です) RRS feed

  • 質問

  • OS:Windows 2003 R2 SP2 
    ウェブサーバー:IIS 6.0   
    SQL:SQL Server 2000 Standard Edition(英語版) MSSQL SP4  
    データベースの文字コードはMSSQL:Latin1 
    データベースの照合順序は COLLATE SQL_Latin1_General_CP1_CI_AS

    初めまして上記の設定内容でレンタルサーバーを使用しています。
    日本語の全角カナが入力されているnvarcharaの項目でorder by をしたのですが50音順に並んでくれません。
    試しに半角カナを入力したvarchara の項目でもorder by してみたのですがこれもだめでした。
    50音順に並ばせるにはどうしたらいいのでしょうか?

    2009年12月1日 1:44

すべての返信

  • 照合順序の設定が違います。日本語なら

    Japanese_(CI | CS)_(AI | AS)[(_KS | _WS | _KS_WS)]

    になるかと思います。

    以下のサイトが参考になると思います。

    SQLServer の collation (照合順序)の設定
    [SQL Server] : 照合順序 について~

    2009年12月1日 4:04
  • こんにちは、
    設定された照合順序以外でソートしたいというのであれば、

    SELECT *
      FROM [テーブル名]
     ORDER BY [カラム名]
    COLLATE Japanese_CI_AS

    といった形で可能かと思います。
    注意として、この場合、ORDER BY句には数値型や日付型等のカラムは指定出来なかったと思います。

    ついでに、レスポンスも保証出来ないです。
    2009年12月1日 4:19
  • 回答ありがとうございます。

    テーブルを作成するときに COLLATE Japanese_CI_AS を指定してやってみましたが
    ウエブ上でテーブルの内容を表示すると文字化けしていまいした。


    2009年12月1日 5:28
  • こんにちは、
    設定された照合順序以外でソートしたいというのであれば、

    SELECT *
      FROM [テーブル名]
     ORDER BY [カラム名]
    COLLATE Japanese_CI_AS

    といった形で可能かと思います。
    注意として、この場合、ORDER BY句には数値型や日付型等のカラムは指定出来なかったと思います。

    ついでに、レスポンスも保証出来ないです。
    回答ありがとうございます。
    select句にCOLLATE Japanese_CI_ASを追加してみましたが50音順に並びませんでした。

    もうひとつお願いですが、実際にorder byをしたい項目は日本語項目(nvarchara)と整数値(int)の2つ何ですが回答お願いします。
    2009年12月1日 5:33
  • > ウエブ上でテーブルの内容を表示すると文字化けしていまいした。

    すみません、外してしまいました。<(_ _;)>

    その後色々調べてみますと、照合順序の設定って考えてた以上にややこしいですね。(-ω-;
    私は引っ込みますので、識者のレスポンスに期待したいと思います。
    2009年12月1日 6:37
  • 50音順に並ばないとの事ですが、具体的に頂けますか?

    ちなみに日本語項目と整数値というのであれば、

    SELECT *
      FROM [テーブル名]
     ORDER BY [日本語項目] COLLATE Japanese_CI_AS
         , [整数値]

    で良いはずです。
    ※ついでですけど、 nvarchara ではなくて nvarchar です。
    2009年12月1日 10:52
  • 50音順に並ばないとの事ですが、具体的に頂けますか?

    ちなみに日本語項目と整数値というのであれば、

    SELECT *
      FROM [テーブル名]
     ORDER BY [日本語項目] COLLATE Japanese_CI_AS
         , [整数値]

    で良いはずです。
    ※ついでですけど、 nvarchara ではなくて nvarchar です。

    CREATE TABLE [test].[A] (
    [SEQ] [int] IDENTITY (1, 1) NOT NULL ,
    [a1] [nvarchar] (400) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    CONSTRAINT [PK_A] PRIMARY KEY  CLUSTERED 
    (
    [SEQ]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO

    $sql = "select top 10 a1 , SEQ  from A order by a1 COLLATE Japanese_CI_AS  ,SEQ";
    mssql_query($pSql, $link);

    結果
    a1    SEQ
    ----- ------
     た      4
     ち      5
     ち      6
     ま      8
     や      9
     ら    10
     あ      1
     い      2
     な      7
     か      3

    具体的にというとこんな感じなんですが,やっぱりだめでした。
    どこがおかしいのか全く検討がつきません。
    回答どうぞよろしくお願いします。


    2009年12月2日 0:16
  • 試してみたら正常に並び替えられてしまいました。
    SQLServer 2005 日本語 ですけれど。

    Management studio からクエリを実行しました。
    CREATE TABLE [dbo].[A] (
     [SEQ] [int] IDENTITY (1, 1) NOT NULL ,
     [a1] [nvarchar] (400) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
     CONSTRAINT [PK_A] PRIMARY KEY  CLUSTERED
     (
     [SEQ]
     )  ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    delete from [A]
    insert [A] values ('か')
    insert [A] values ('き')
    insert [A] values ('く')
    insert [A] values ('け')
    insert [A] values ('こ')
    insert [A] values ('あ')
    insert [A] values ('い')
    insert [A] values ('う')
    insert [A] values ('え')
    insert [A] values ('お')

    select * from [A]
    select top 10 a1 , SEQ  from A order by a1 COLLATE Japanese_CI_AS  ,SEQ;

    2009年12月2日 0:48
  • 試してみたら正常に並び替えられてしまいました。
    SQLServer 2005 日本語 ですけれど。

    Management studio からクエリを実行しました。
    CREATE TABLE [dbo].[A] (
     [SEQ] [int] IDENTITY (1, 1) NOT NULL ,
     [a1] [nvarchar] (400) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
     CONSTRAINT [PK_A] PRIMARY KEY  CLUSTERED
     (
     [SEQ]
     )  ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    delete from [A]
    insert [A] values ('か')
    insert [A] values ('き')
    insert [A] values ('く')
    insert [A] values ('け')
    insert [A] values ('こ')
    insert [A] values ('あ')
    insert [A] values ('い')
    insert [A] values ('う')
    insert [A] values ('え')
    insert [A] values ('お')

    select * from [A]
    select top 10 a1 , SEQ  from A order by a1 COLLATE Japanese_CI_AS  ,SEQ;


    SQL Sever 2000 の英語版なんですが?
    2009年12月2日 1:14
  • > SQL Sever 2000 の英語版なんですが?
    はい。別の環境とはいえ再現すればいろいろ試してみることも可能かと思いましたが
    再現しませんでした。
    再現させようと、照合順序 SQL_Latin1_General_CP1_CI_AS のデータベースでも試しましたが
    そちらでも再現しませんでした。
    (その場合、insert 文は insert [A] values (N'か') のように N付き文字列にしました。)

    # コピー&ペーストで実行できるスクリプトがあったほうが回答が集まりやすいと貼り付けました。

    あと気になるのは、サーバーOS、クライアント の言語と
    SQLServer 2005 へのバージョンアップは可能かどうかです。

    追記: 訂正しました。 "OS、MSSQL の言語" →"サーバーOS、クライアント の言語"
    • 編集済み anningo 2009年12月2日 1:52 追記
    2009年12月2日 1:41
  • > SQL Sever 2000 の英語版なんですが?
    はい。別の環境とはいえ再現すればいろいろ試してみることも可能かと思いましたが
    再現しませんでした。
    再現させようと、照合順序 SQL_Latin1_General_CP1_CI_AS のデータベースでも試しましたが
    そちらでも再現しませんでした。
    (その場合、insert 文は insert [A] values (N'か') のように N付き文字列にしました。)

    # コピー&ペーストで実行できるスクリプトがあったほうが回答が集まりやすいと貼り付けました。

    あと気になるのは、OS、MSSQL の言語と
    SQLServer 2005 へのバージョンアップは可能かどうかです。

    残念ながらレンタルサーバーを使用しているので、バージョンアップというのは無理だと思います。
    現在の設定のままでどうにかならないでしょうか?
    よろしくお願いします。
    2009年12月2日 1:54
  • 設定で変える方法がわからなので、わたしなら(条件にもよりますが)代替案で逃げます。
    有識者の回答を待ちたいと思います。
    2009年12月2日 2:08
  • 設定で変える方法がわからなので、わたしなら(条件にもよりますが)代替案で逃げます。
    有識者の回答を待ちたいと思います。
    > OS:Windows 2003 R2 SP2 
    > ウェブサーバー:IIS 6.0   

    で、ASP.NET & ADO.NET を使っているなら、プログラム側で並べ替えるという回避策も考えられます。
    2009年12月2日 8:22
  • 設定で変える方法がわからなので、わたしなら(条件にもよりますが)代替案で逃げます。
    有識者の回答を待ちたいと思います。
    > OS:Windows 2003 R2 SP2 
    > ウェブサーバー:IIS 6.0   

    で、ASP.NET & ADO.NET を使っているなら、プログラム側で並べ替えるという回避策も考えられます。

    こちらの開発環境はPHP,JAVASCRIPT,MS SQL 2000です。
    ASP.NETやADO.NETは使ったことが無いので、できれば今の開発環境の中で解決策を見いだせないかと思っています。
    よろしく願いします。

    2009年12月2日 13:33
  • > こちらの開発環境はPHP,JAVASCRIPT,MS SQL 2000です。

    PHP ・Java Script は門外漢なのでよく判らないのですが、JavaScript なら色々面白そうなライブラリがあるようです。

    ソートが可能なテーブル実装ライブラリ色々

    ここの GridView3  なんかは特に面白そうです。ただし実際の使い方までは判りません。


    > できれば今の開発環境の中で解決策を見いだせないかと思っています。

    なかなか他の方の意見も出てこないようです。
    制約の多い環境では、自ずと出来ることも対応も限られてしまいます。
    私もこれ以上のアドバイスは出来そうもありませんが、将来的にはサーバーの見直しということも考慮に入れた方がいいような気がします。
    2009年12月2日 16:25