3

クエリで大文字と小文字を区別することはできますか?

私は次のように聞こえます:

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY rand()"

g_glyph = r の場合、結果は R または r になる可能性があり、それは私が期待するものではありません。大文字と小文字を区別するリターンを探しています。

私は自分の問題をグーグルで検索し、この解決策を見つけました:

/*Case-sensitive sort in descending order.
In this query, ProductName is sorted in 
case-sensitive descending order.
*/
SELECT ProductID, ProductName, UnitsInStock
FROM products
ORDER BY BINARY ProductName DESC;

しかし、次の行はまったく機能しません。

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY BINARY rand()"

なにか提案を?

ご助力ありがとうございます。

4

2 に答える 2

5

文字の順序と同等性は、照合によって定義されます。ほとんどの場合、大文字と小文字を区別しない照合が使用されます。

特定のデータに対して厳密で大文字と小文字を区別する比較を使用する必要がある場合は、BINARY演算子:を使用します。

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0

だからあなたの場合:

SELECT g_path FROM glyphs WHERE BINARY g_glyph = :g_glyph ORDER BY rand()
于 2012-04-15T08:42:39.420 に答える
2

これは、文字列検索での大文字と小文字の区別のマニュアル ページで説明されています。

大文字と小文字を区別する照合またはバイナリ照合を指定する必要があります。

デフォルトの文字セットと照合順序は latin1 と latin1_swedish_ci であるため、非バイナリ文字列の比較ではデフォルトで大文字と小文字が区別されません。これは、col_name LIKE 'a%' で検索すると、A または a で始まるすべての列値が取得されることを意味します。この検索で​​大文字と小文字を区別するには、オペランドの 1 つに大文字と小文字を区別する照合またはバイナリ照合があることを確認してください。たとえば、どちらも latin1 文字セットを持つ列と文字列を比較する場合、COLLATE 演算子を使用して、いずれかのオペランドに latin1_general_cs または latin1_bin 照合順序を持たせることができます。

col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin

列を常に大文字と小文字を区別して処理する場合は、大文字と小文字を区別する照合順序またはバイナリ照合順序で列を宣言します。セクション13.1.14「CREATE TABLE 構文」を参照してください。

照合名の_csは「大文字と小文字を区別する」を表します。

于 2012-04-15T08:28:16.717 に答える