mysql索引可以是这字符串吗_MySQL索引长字符串(MySQL index for long strings)

MySQL索引长字符串(MySQL index for long strings)

我有MySQL InnoDb表,我想要存储很长(限制为20k符号)的字符串。 有什么办法可以为这个字段创建索引吗?

I have MySQL InnoDb table where I want to store long (limit is 20k symbols) strings. Is there any way to create index for this field?

原文:https://stackoverflow.com/questions/6486724

更新时间:2019-11-13 00:55

最满意答案

您需要限制索引的长度,否则您可能会收到错误1071 (“指定密钥太长”)。 CREATE INDEX上的MySQL手册条目描述了这一点:

可以创建仅使用列值的开头部分的索引,使用col_name(length)语法指定索引前缀长度:

可以为CHAR,VARCHAR,BINARY和VARBINARY列指定前缀。

BLOB和TEXT列也可以编入索引,但必须给出前缀长度。

对于非二进制字符串类型,前缀长度以字符给出,二进制字符串类型以字节给出。 也就是说,索引条目由CHAR,VARCHAR和TEXT列的每个列值的第一个长度字符以及BINARY,VARBINARY和BLOB列的每个列值的第一个长度字节组成。

它还增加了这一点:

前缀支持和前缀长度(如果支持)取决于存储引擎。 例如,对于MyISAM表,前缀可以长达1000个字节,对于InnoDB表,前缀可以长达767个字节。

You will need to limit the length of the index, otherwise you are likely to get error 1071 ("Specified key was too long"). The MySQL manual entry on CREATE INDEX describes this:

Indexes can be created that use only the leading part of column values, using col_name(length) syntax to specify an index prefix length:

Prefixes can be specified for CHAR, VARCHAR, BINARY, and VARBINARY columns.

BLOB and TEXT columns also can be indexed, but a prefix length must be given.

Prefix lengths are given in characters for nonbinary string types and in bytes for binary string types. That is, index entries consist of the first length characters of each column value for CHAR, VARCHAR, and TEXT columns, and the first length bytes of each column value for BINARY, VARBINARY, and BLOB columns.

It also adds this:

Prefix support and lengths of prefixes (where supported) are storage engine dependent. For example, a prefix can be up to 1000 bytes long for MyISAM tables, and 767 bytes for InnoDB tables.

2011-06-26

相关问答

这样的事情可能有用: $sql = "SELECT * FROM offers WHERE type='$type' and country LIKE '%$membercountry%' LIMIT $start, $limit";

Something like this may work out: $sql = "SELECT * FROM offers WHERE type='$type' and country LIKE '%$membercountry%' LIMIT $start,

...

您需要限制索引的长度,否则您可能会收到错误1071 (“指定密钥太长”)。 CREATE INDEX上的MySQL手册条目描述了这一点: 可以创建仅使用列值的开头部分的索引,使用col_name(length)语法指定索引前缀长度: 可以为CHAR,VARCHAR,BINARY和VARBINARY列指定前缀。 BLOB和TEXT列也可以编入索引,但必须给出前缀长度。 对于非二进制字符串类型,前缀长度以字符给出,二进制字符串类型以字节给出。 也就是说,索引条目由CHAR,VARCHAR和TEXT列的

...

我认为你需要一个额外的大括号。 这对我有用: text1 = r"${}_{{t}} = {:.{p}f} \pm {:.{p}f} {c}$".format(xn, ccl[0], ect[0], c=cod, p=prec)

text2 = r"${}_{{t}} = {:.{p}f} \pm {:.{p}f} {c}$".format(yn, ccl[1], ect[1], c=cod, p=prec2)

添加双花括号意味着它们按字面意思处理,而不是作为python格式语法的一部分 I t

...

轨道有一个方法word_wrap其使用简单的正则表达式: str = 'Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi

...

问题解决了。 他们关键的问题是pattern_capture过滤器。 Problem solved. They key for this problem is the pattern_capture filter.

您可以在mysql控制台中运行SHOW PROCESSLIST \G来查看其状态。 几个小时前我遇到了类似的问题,但我的桌子要小得多。 这里列出了你肯定需要的线程状态 。 经过一个小时的等待后,我意识到ALTER TABLE CREATE INDEX处于Locked状态,我需要重新启动mysqld并再次运行该语句。 那个时候我在15分钟内制作了索引。 顺便说一下,我建议从mysql控制台运行索引创建,GUI工具可能会为进程添加一些香料。 You may run SHOW PROCESSLIST \

...

我没有试图理解你的整个程序,但是你得到不同哈希的字符串确实是不同的:其中一个在最后保留了新行字符,可能来自fgets 。 ASCII中换行符的numerc值为10,因此: hash("foo") == 905;

hash("foo\n") == (33 * hash("foo") + '\n') % 1024

== (33 * 905 + 10) % 1024

== 179

解决方案是从fgets删除字符串中的尾随空格或使用更好的标记,这将

...

显然,如果数据类型是ntext或类似的,CHARINDEX()只搜索字符的前8K。 见Ben Nadel的调查 。 一旦我将一个强制转换为nvarchar(max) ,它就会重新开始工作。 这是我用过的: SELECT CHARINDEX('keyword', CAST(Table.Field as NVARCHAR(MAX))) FROM Table

Apparently CHARINDEX() only searches the first 8K of chars if the dataty

...

你所看到的是源回来,ES将始终完全按照你发送的方式存储源,因此,它将完全返回你发送给他的内容。 但是,您可以确保image_features.height和image_features.width已经处理得很长并且索引为这样,因为您的映射将这些字段声明为long 。 如果您希望源返回数值,则需要使用数值发送源(请参阅下文),ES不会转换源值,这意味着您需要修改进行索引的客户端进程。 image_features: {

width: 400,

height: 400,

...

从文档来看,这似乎是不可能的。 你可以稍微解决它,像这样: my.value.param = ${my.value.param1} ${my.value.param2}

my.value.param1="Very very very"

my.value.param2="very long line"

但当然,这非常难看。 我不认为有意在配置中存储长字符串。 From the documentation it appears to not be possible in that way. You

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值