0

MySQL select 内で操作される文字列を実行しようとしていますが、UPPER 関数から奇妙な動作が発生しているようです。

単語の最初の文字 (スペースで区切られている) を返して大文字に変換しようとしています。ただし、返された単一の文字で UPPER を使用すると空白になりますが、最初の文字を取得する前に単語全体で UPPER を使用すると、最初の文字が取得されます。

SQL を最小限にまで削ぎ落として、このテスト SQL を思いつきました:-

SELECT 
    'verbatim h', 
    SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1),
    UPPER(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1)),
    SUBSTRING(UPPER(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1)), 1, 1)

これは、文字列 'verbatim h' を取得し、両端でスペースを連結してから、1 番目と 2 番目のスペースの間の文字列を取得します (したがって、verbatimになります)。

最初の列は文字列全体、2 列目は最初の単語の最初の文字、3 列目は最初の単語を大文字に変換した最初の文字、4 列目は大文字に変換した最初の単語の最初の文字です。場合。

列 3 と 4 は同じ値にする必要があると思います (唯一の違いは、最初の文字を取得する前に最初の単語を大文字に変換し、もう一方は最初の文字を取得してから大文字に変換することです)、代わりに 1 つが含まれていますもう一方には空白が含まれていますが、私が期待する文字Vです。

上記を変更して結果の文字の HEX 値を取得すると、空白の文字列は 16 進値 00 の 1 文字列になり、V は 16 進値 56 になります。

助言がありますか?明らかな何かが欠けていますか?

4

1 に答える 1

1

文字列はバイナリ文字列になります。そして、 mysql リファレンス ドキュメントに記載されているように、これらにはLOWERandを使用できませんUPPER

では、どのように解決するのですか?

convert次のように関数を使用します。

SELECT 
    'verbatim h', 
    SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1) AS c1,
    UPPER(CONVERT((SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1)) USING latin1)) AS c1_upper;

ここにsqlfiddleがあります

于 2013-05-03T10:19:55.383 に答える