各位聪明的男士女士们,大家好:
如何选择字符串的前 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。