【发布时间】:2019-01-02 05:10:36
【问题描述】:
你好聪明的男人和女人,
如何选择字符串的前 x 个字节?
用例:我正在优化产品描述文本以上传到亚马逊,亚马逊按 utf8 中的字节(不是我之前所说的 latin1)来衡量字段长度,而不是按字符。另一方面,MySQL 似乎是基于字符的操作。 (例如,函数 left() 是基于字符的,而不是基于字节的)。差异(使用英语、法语、西班牙语和德语)大约为 10%,但差异可能很大。
关于#bytes http://wiki.devliegendebrigade.nl/Format_inventarisbestanden_(Amazon)#Veldlengte):
OK, char_length: 248, byte length latin1: 248, byte length utf8: 248
OK, char_length: 249, byte length latin1: 249, byte length utf8: 249
OK, char_length: 249, byte length latin1: 249, byte length utf8: 249
OK, char_length: 249, byte length latin1: 249, byte length utf8: 249
Not OK, char_length: 250, byte length latin1: 250, byte length utf8: 250
Not OK, char_length: 249, byte length latin1: 249, byte length utf8: 252
Not OK, char_length: 248, byte length latin1: 248, byte length utf8: 252
Not OK, char_length: 249, byte length latin1: 249, byte length utf8: 252
Not OK, char_length: 249, byte length latin1: 249, byte length utf8: 257
插图:
set @tekst="Jantje zag € pruimen hangen";
select
char_length(@tekst), # 27 characters
length(@tekst); # 29 bytes
select left(@tekst, 15) # Result: "Jantje zag € pr"
# Ideally, I'm looking for something like this:
select left_bytes_utf8(@tekst, 15) # Result: "Jantje zag € "
一种方法可能是通过迭代调用自身的存储过程,但我怀疑周围有更有效的解决方案。
已经谢谢你了,杰伦
P.s.:编辑了问题:将 2x“latin1”更改为“utf8”。这实际上有点令人困惑:上传应该是 Latin1,但字段大小是使用 utf8 以字节为单位衡量的
P.p.s:更新:这些上传适用于英语、法语、西班牙语和德语的亚马逊网站。字符不会比“ø”(直径)、“€”、“è”、“é”、“ü”和“ö”更具异国情调。全部在 Latin1 编码中,但在 utf8 中是多字节的。
【问题讨论】:
-
为什么不自己在相关列上使用 latin1 编码 (docs)?那么你也将是基于字节的。
-
left() 或 substring() 之类的函数仍然是基于字符的,并且问题仍然存在 - 或者我不明白你的意思
-
哦等等,你想要 15 个字节的 UTF-8?你的亚马逊故事让我失望:P
-
哪种字符编码并不重要。随便选一个
-
嗯,latin1 的 15 个字节与 latin1 的 15 个字符完全一样
标签: mysql stored-procedures character-encoding string-length iso-8859-1