我有一张“购车”表,上面有一个“描述”栏。该列是一个字符串,包括名首字母,后跟句号、空格和姓氏。描述列的一个示例是
“j。吹
我正在使用“substring\u index”函数提取列字符串中“.”前面的字母。像这样:
SELECT
Description,
SUBSTRING_INDEX(Description, '.', 1) as TrimInitial,
SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1) as trimmed,
length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length
from car_purchases;
我将此查询称为1。
结果集(结果1)的图片如下
如您所见,问题在于select语句中的“trimmed”列开始计算第二个分隔符“”,而不是右侧的第一个分隔符,并生成结果“by j”,而不仅仅是“j”。此外,length列指示字符串长度是5而不是4所以wtf?
但是当我执行下面的select语句时;
select SUBSTRING_INDEX(
SUBSTRING_INDEX('Car purchased by J. Blow', '.', 1),' ', -1); -- query 2
result='j'作为'result 2'。
从结果1可以看出,“description”列中的字符串与“result 2”中的字符串完全相同(据我所知)。但是在列上执行子字符串索引(而不仅仅是字符串本身)时,结果会忽略第一个分隔符,并从字符串右侧的第二个分隔符中选择一个字符串。
我为此绞尽脑汁,尝试用“by”和“by”作为分隔符,但这两个选项都不能产生一个字符所需的结果。我不想通过使用trim函数来增加查询1的复杂性。我也尝试过结果列“trimmed”的cast函数,但仍然没有成功。我也不想谈这个。
查询1的“length”列中有一个异常,如果我将length函数更改为char\u length函数,如下所示:
select length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length -- result = 5
select char_length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length -- result = 4
有人能解释一下为什么上面的select语句会产生两种不同的结果吗?我想这就是为什么我没有得到我想要的结果的原因。
但要清楚的是,我想要的结果是得到“j”而不是“by j”。
我想我可以试试倒过来,但我不认为这是一个可以接受的妥协。另外,我不熟悉排序规则和字符集原则,只是使用默认值。
为球员们干杯!!!!
1条答案
按热度按时间tzxcd3kk1#
CHAR_LENGTH
返回字符长度,因此包含4个2字节字符的字符串将返回4。LENGTH
但是,返回字节长度,因此包含4个2字节字符的字符串将返回8。你的结果不一致(包括SUBSTRING_INDEX
)说的是by
以及J
实际上不是一个单字节空格(ascii0x20),而是一个看起来像空格的2字节字符。要解决此问题,可以尝试使用空格替换所有unicode字符CONVERT
以及REPLACE
. 在这个例子中,我有一个en-space
字符串中的unicode字符by
以及J
. 这个CONVERT
将其更改为?
,和REPLACE
然后将其转换为空格:输出:
与
CONVERT
以及REPLACE
:输出
对于您的查询,您可以将字符串替换为您的列名,即。
在dbfiddle上演示