3

SQL ステートメントのすべての値を一重引用符で囲んでも問題ありませんか? 例えば:

これは、books という単純なテーブルです。

id  |  title
1   |  Some book name
2   |  Second book name

次のようなステートメントを記述しても問題ありませんか。

SELECT * FROM books WHERE id = '1'

SQL Server 2008 と MySQL 5 でそのクエリをテストしましたが、うまく機能しますが、ID フィールドは実際には整数であるため、パフォーマンスの問題があるかどうかに興味があります。

2 番目の質問は、次のようなステートメントを記述しても問題ありません。

SELECT * FROM books WHERE id = N'1'

N プレフィックスは SQL サーバーで UTF-8 フィールドに使用されますが、SQL サーバーと MySQL でテストしたところ、どちらも問題なく動作しました。私はそれをテストしていないので、SQLite が N プレフィックスをサポートしているかどうかはわかりません。

私がこれを尋ねている理由は、一般的な SQL データベース (SQL Server、MySQL、SQLite、そしておそらく MS Access) で動作するデータベース クラスを構築しているためです。フィールドのデータ型について。いつでも N'Some value' で値を囲むことができますが、これは正しいのか、パフォーマンスの問題はありますか?

4

4 に答える 4

6

SQL Server では、これを行うときに暗黙的な変換を取得できます。計画に影響を与えなかったり、パフォーマンスに顕著な影響を与えたりしない場合もありますが、影響を与える場合もあります。それらは一般的に悪いと見なされます。AdventureWorks2012 に対する次の 2 つのクエリの計画を調べます。

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = 43659;

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = '43659';

後者にはCONVERT_IMPLICIT(CI シークのツールチップにカーソルを合わせます) が含まれています。

VARCHARまた、 andの切り替えにも細心の注意を払う必要があります。NVARCHAR場合によっては、基になるデータ型やリテラルにNプレフィックスがあるかどうかによって、パフォーマンスが大幅に低下する可能性があります。

簡単に言えば、これをしないでください。さまざまなデータ型を理解して適切に処理できるように、ORM を記述します。

于 2013-03-28T21:52:36.817 に答える
4

SELECT ... WHERE int_type = '123'してもいいです。'123'SQL は一度整数に変換され、それで完了します。

ただし、SELECT ... WHERE char_type = 123SQL はすべてのセルを整数に変換する必要があるため、問題ありません。char_type = '0123' と char_type = '00123' も一致することを確認してください。そのため、より多くの作業を行う必要があります。

キャストの優先順位に関するリソースを指摘してくれた @MartinSmith に感謝します: http://msdn.microsoft.com/en-us/library/ms190309.aspx

于 2013-03-28T21:48:38.230 に答える
2

SQL ServerMySQLはどちらも暗黙的な型変換を実行しますが、それは良い習慣にはなりません。可能な場合は、適切なネイティブ タイプを使用してください。これにより、次の違いを見つけようとするのを避けることができます。

SELECT * FROM books WHERE id = '1'

SELECT * FROM books WHERE id = 'l'

SELECT * FROM books WHERE id = 'O'

SELECT * FROM books WHERE id = '0'

(それぞれ 1、小文字の L、大文字の「o」、ゼロ)

于 2013-03-28T21:52:59.367 に答える
2

これは、引用符で囲まれた数字の文字列から整数への暗黙的な型キャストが深刻なパフォーマンスの問題を引き起こすという MySQL のバグの例です: http://bugs.mysql.com/bug.php?id=43319

数字を引用しないのが最善です。

于 2013-03-28T22:05:43.677 に答える