2009-04-23 15 views
4

トルコ語の照合順序に設定されているMSSQLデータベースに問題があります。トルコ語の私の問題のために、彼らの中に「私」を含んでいる私たちの質問のどれも正しく働いていません。たとえば、「Unit」という列の「UnitID」という表がある場合、「id」の小文字の「i」が定義された大文字と異なるため、クエリ「select unitid from unit」は機能しなくなりました私は "UnitID"で。エラーメッセージには、「無効な列名 'unitid'」が表示されます。トルコ語のSQL照合に関する問題(トルコ語 "I")

トルコ語では、文字iと文字Iが異なる文字として認識されるため、これが発生していることはわかっています。しかし、私はこの問題をどのように修正するかについては不明です。 DB内のすべての1900 SPを通過し、 "i"のケーシングを修正するオプションはありません。

トルコ語の代わりに使用できる他の照合の提案もありますが、文字セットはサポートされています。

+0

"turkish i problem"についてのページへのリンクを投稿できますか? – Tomalak

+1

@Tomalak、このページを見て:http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

+0

私はそのページを知っています。しかし、あなたが正しいことをしているかどうかはわかりません。 "トルコテスト"はデータの解析についてですが、SQLクエリテキストにトルコ語のiを使用するような問題の説明があります。これは決して行うべきではありません。 – Tomalak

答えて

4

最高の解決策は、実際にすべてのSQLとコードをリファクタリングすることでした。

select unitid from dbo.unit 

に変更されるだろう:私は一貫して、正しいケースなどを使用するすべてのストアドprocsの、関数、ビュー、テーブル名を修正するためにリファクタリングアプリを書いた最後の数日間で

select UnitId from dbo.Unit 

アプリはまた、コードを通過し、ストアドプロシージャとそのパラメータの任意の発生を置き換え、DBに定義されている場合に一致するようにそれらを修正します。アプリケーション内のすべてのデータセットは不変のロケールに設定されています(FXCopがすべてのデータテーブルを指し示しているため..)。これにより、コード内で大文字と小文字を区別する必要がなくなります。

誰かがこのアプリケーションをご希望ですか、またはプロセスに関するアドバイスを希望される場合は、dotnetvixen @ gmail.comまでご連絡ください。

+0

...あなたのフィールドは "UnitID"(大文字の "D")です – nickgrim

0

おそらく私はこの問題を理解していないかもしれませんが、データベースは大文字と小文字を区別し、クエリがそうでないため、これはおそらくありませんか?たとえば、Sybaseの上で私は、次の操作を行うことができます

私のデータベースが大文字と小文字を区別しないことを私に伝えます
USE master 
GO 
EXEC sp_server_info 16 
GO 

attribute_id attribute_name  attribute_value 
      16 IDENTIFIER_CASE MIXED 
+0

コメントありがとうございます。私はそれを大文字と小文字を区別しないように設定しましたが、トルコ語では悲しいことですが、私は実際には異なる文字としてみなされています。ありがとうございます – Madeleine

0

あなたはあなたがしてみてください使用している照合順序を変更することができる場合を不変のロケール。しかし、お客様の名前や住所などの他の事柄に影響を与えないようにしてください。顧客が大文字と小文字を区別しないで自分の名前を検索することに慣れている場合、ıと同等のことがやめられたり、iとİが等価でなくなると、嫌なことはありません。

0

データベースの照合順序をデフォルトに変更することができます:これにより、すべてのテキスト列がトルコ文字列になりますか?

クエリは機能しますが、データは正しく動作します。理論的には...

は、varchar型の列を持つ一時テーブルとテーブル変数を持ついくつかの落とし穴があります:あなたは私はあなたがすべて保存さを通過する必要はありません実現これら

+0

残念ながら、すべてのvarcharカラムはdatabase_defaultに設定されていますので、照合が通常のlatinオプションに変更された場合、varcharカラムはlatinを使用します。 スクリプトを実行して、すべてのvarcharカラムで照合順序をturkishに設定し、db照合順序をlatinに設定し、何が起こるかを見てみましょう!非常に一般的ではありませんが、理想的には、DBが大文字と小文字を区別しない照合で動作するようにしてください。 応答のためにありがとう – Madeleine

+0

DB照合(ALTER DATABASE)を変更すると、すべてのテキスト列がそのまま残るはずです。それはシステムテーブルにのみ影響し、デフォルトの – gbn

+0

が試してみて、そのトリックはしています。すべての列照合をトルコ語に更新するためのスクリプトを実行し、DB照合を通常のラテン照合に設定すると、動作するように見えます。このソリューションは非常に保守的ではないので、私の答えで見ることができるようにコードをリファクタリングしました。しかし、間違いなく短期間で動作します。ありがとう – Madeleine

0

にCOLLATE句を追加する必要があります問題を解決するための手順を示していますが、問題を解決するためにリファクタリングツールを使用することもできます。私はSQL Refactorを見てみましょう。私はそれを使用しませんでしたが、有望に見えます。

+0

これは最善の提案のようです。元のポスターは、1900個のストアドプロシージャを修正することは選択肢ではないが、1900個のストアドプロシージャを壊しておくことは良い選択ではないという。 –

0

私はトルコ語のサポートで非常に多くのシステムを開発しましたが、これはあなたが言ったようによく知られている問題です。

データベース設定をUTF-8に変更することをお勧めします。それだけです。それはすべての問題を解決するはずです。

(ı-I、i-İ)で大文字と小文字の区別をサポートしたい場合は、SQL Serverでのサポートに問題が生じる可能性があります。入り口全体がWebからのものであれば、それもUTF-8であることを確認してください。

Web UTF-8入力とSQL Serverの設定をUTF-8にしておくと、すべてがスムーズに進むはずです。

0

機械の地域設定を英語(米国)に変更すると、その日が完全に保存されます。

関連する問題