0

我正在尝试在 MySQL 选择中操作一些字符串,我似乎在 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',在任一端连接空格,然后在第一个和第二个空格之间获取字符串(因此它将得到逐字)。

第一列是完整的字符串,第二列是第一个单词的第一个字母,第三列是转换为大写的第一个字母,第四列是转换为大写的第一个单词的第一个字母案子。

我认为第 3 列和第 4 列应该具有相同的值(唯一的区别是一个在抓取第一个字母之前将第一个单词转换为大写,而另一个抓取第一个字母然后将其转换为大写),但是一个包含字母V如我所料,而另一个包含空白。

如果我修改上面的内容以获取结果字符的 HEX 值,则空白是 1 字符串,十六进制值为 00,而 V 是十六进制值为 56。

有什么建议么?我错过了一些明显的东西吗?

4

1 回答 1

1

该字符串变为二进制字符串。对于这些,您不能使用LOWERand UPPER,如mysql 参考文档中所述

那么如何解决呢?

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 回答