【问题标题】:Longest 200 byte string - database validation max_length最长 200 字节字符串 - 数据库验证 max_length
【发布时间】:2013-05-16 14:46:48
【问题描述】:

因此,按照规范规定最终用户/应用程序提供的给定变量(200 字节)的字节长度。

使用python字符串,字符串的最大字符长度是多少,满足200字节,因此我可以为我的数据库字段的max_length设置指定?

(同样,我可能在字节-unicode 转换中遗漏了一些东西!)

【问题讨论】:

  • 取决于编码。 UTF-32 始终使用 4 个字节 pr char,UTF-8 对英文文本使用单字节,对于大多数欧洲语言使用两个字节,但对于数学符号,中文/日文/等最多可以使用四个字节。所以,最有可能 200 个字节足以容纳任何 50 个字符长的字符串...除非每个字符编码存在 5 个字节(?):)
  • 很好的解释 :) 你应该考虑把它作为答案 :)

标签: python django string unicode flask


【解决方案1】:

取决于编码。 UTF-32 始终使用 4 个字节 pr char,UTF-8 对英文文本使用单字节,对于大多数欧洲语言使用两个字节,但对于数学符号,中文/日文/等最多可以使用四个字节。所以,很可能 200 个字节足以容纳任何 50 个字符长的字符串......除非每个字符编码存在 5 个字节(?):)

【讨论】:

  • 我将 JOHN 的评论设为社区答案,因此 OP 可以接受。
【解决方案2】:

不确定我是否遗漏了什么,但从 200 个字节中可以得到的最长(unicode)字符串是 200 个字符。

不过,最小长度是另一个问题。

根据编码('UTF-8'、'UTF-16'、'latin-1'、...),每个 unicode 代码点需要 1 到 4 个字节('character',例如?)。因此,虽然长度为 200 的未编码字符串可以编码为 200 个字节:

len(u'a'*200)== 200 == len((u'a'*200).encode('UTF-8'))

你也可以得到更长的字节串:

len(u'a'*200)== 200 < 804 len((u'a'*200).encode('UTF-32'))  # includes a byte-order-mark and 4 bytes per char

因此,根据所使用的编码,作为 unicode 字符串,您的 200 个字节应该至少有 50 个代码点。

因此,如果要将字段长度指定为 unicode 字符串并使用数据库句柄编码,则 200 就足够了,以字节为单位取决于源编码。例如,一个字节串可能是如果在 UTF-8 中解码和重新编码,日语编码会变长。我认为最坏的情况是从 UTF-8 中的 ASCII 字符串(每个字节一个字符)到 UTF-32(每个字符 4 个字节,加上字节顺序标记),导致上述 804 个字节。

【讨论】:

  • 如果数据库使用 Unicode 规范化;它可以改变 Unicode 字符串的长度
猜你喜欢
  • 1970-01-01
  • 2012-06-14
  • 2014-06-03
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2020-12-23
相关资源
最近更新 更多