可能重复:
MySQL表中varchar长度的重要性
使用VARCHAR时(假设这是短字符串的正确数据类型)大小是否重要?如果我将它设置为20个字符,是否会占用更少的空间或快于255个字符?
我有一张桌子:
Account_Code | Desc
503100 | account xxx
503103 | account xxx
503104 | account xxx
503102A | account xxx
503110B | account xxx
Run Code Online (Sandbox Code Playgroud)
哪里Account_Code是varchar.
当我在下面创建查询时:
Select
cast(account_code as numeric(20,0)) as account_code,
descr
from account
where isnumeric(account_code) = 1
Run Code Online (Sandbox Code Playgroud)
它通过返回account_code列中具有有效数值的所有记录运行良好.
但是当我尝试添加另一个select时,嵌套到先前的sql:
select account_code,descr
from
(
Select cast(account_code as numeric(20, 0)) as account_code,descr
from account
where isnumeric(account_code) = 1
) a
WHERE account_code between 503100 and 503105
Run Code Online (Sandbox Code Playgroud)
查询将返回错误
将数据类型varchar转换为数字时出错.
那里发生了什么?
如果account_code有效,我已经转换为数字,但似乎查询仍在尝试处理无效的记录.
我需要BETWEEN …
请考虑下表:
create table mixedvalues (value varchar(50));
insert into mixedvalues values
('100'),
('ABC100'),
('200'),
('ABC200'),
('300'),
('ABC300'),
('400'),
('ABC400'),
('500'),
('ABC500');
Run Code Online (Sandbox Code Playgroud)
我怎么能写一个SELECT语句将只返回数字样值
100
200
300
400
500
Run Code Online (Sandbox Code Playgroud)
在关于TDWTF的一个稍微激烈的讨论中,出现了一个关于DB中varchar列大小的问题.
例如,取一个包含人名(仅名称,无姓)的字段.很容易看出它不会很长.大多数人的名字少于10个字符,少数是20以上的人.如果你要制作你的专栏,比如varchar(50),它肯定会拿到你遇到的所有名字.
但是对于大多数DBMS而言,无论是制作varchar(50)还是varchar(255),它的大小或速度都没有区别.
那么为什么人们试图让他们的列尽可能小?我知道在某些情况下你可能确实想要限制字符串的长度,但大多数情况并非如此.如果有一个名字极长的人的罕见情况,那么更大的利润只会是有益的.
对于MSSQL: http://msdn.microsoft.com/en-us/library/ms176089.aspx
存储大小是输入的实际数据长度+ 2个字节.
对于MySQL: http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
如果列值需要0 - 255个字节,则为L + 1个字节;如果值可能需要超过255个字节,则为L + 2个字节
我找不到Oracle的文档,而且我没有使用过其他DBMS.但我没有理由相信它有任何不同.
我需要MySQL在整数字段中存储数字并保持前导零.我不能使用zerofill选项,因为我的当前字段是Bigint(16),并且数字可以在前导零的数量上变化.IE:0001- 0005,然后可能需要存储008-010.我并不关心数字的唯一性(这些数字不被用作ID或任何东西),但我仍然需要将它们优选地存储为INTS.
使用CHAR/VARCHAR然后在PHP中将值类型转换为整数的问题意味着通过查询对结果进行排序会导致字母数字排序,IE:SORT BY数字ASC会产生
001
002
003
1
100
101
102
2
Run Code Online (Sandbox Code Playgroud)
显然不是按数字顺序,而是按字母数字顺序,这是不需要的.
希望有一些聪明的解决方法:)
我在SQL Server数据库中有一个列(代表一封电子邮件)varchar(50)作为数据类型,我想使其唯一(不允许相同的两个电子邮件地址).我找不到在SQL Server Management Studio中使这个列唯一的方法.
怎么做?
我可以使用以下代码进行微小的查询:
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT * FROM myTable'
Exec @sql
Run Code Online (Sandbox Code Playgroud)
上面的方法对于维护大量代码非常有用,特别是当我们需要进行一次更改并将它们反映到任何地方时.
我的问题是我想要提供给@sql变量的查询(它只有一个查询)使用超过25个表连接,其中一些在临时表变量上,包含复杂的操作,因此长度超过8000个字符.
我希望使用TEXT数据类型来存储此查询,但MSDN显示一条警告消息,Microsoft正计划从其下一版本中删除Text,NText和Image数据类型.我希望我的代码也能在未来运行.
我想将这个查询存储在一个单独的文件中,但由于它使用表变量和其他特定于过程的参数的连接,我怀疑这是否可行.
请告诉我一个将大型查询存储到变量中并在过程中多次执行的方法.
我正在尝试尽我所能地优化我的PostgreSQL 8.3数据库表,我不确定是否需要使用varchar_pattern_ops某些列,我正在执行LIKE一个字符串的前N个字符.根据此文档,xxx_pattern_ops只有在"...服务器不使用标准'C'语言环境时"才需要使用.
有人可以解释这意味着什么吗?如何查看我的数据库使用的语言环境?
前一段时间我问了一个关于SQL Server中层次结构/版本号排序的问题.( 如何使用SQL Server查询对"版本号"列进行排序).
提交的答案中包含了与TSQL编码挑战相关的链接.
在SQL2000解决方案中,作者演示了两个变体,一个使用并返回varchar,另一个使用varbinary.作者解释说他没有解释为什么这样做.
那么,我的问题是,方法上的差异有哪些主要差异/优势(如果有的话)?即为什么使用varbinary而不是varchar?
我省略了发布代码,因为它在上面的文章中总结得最为优雅.
假设我有这个枚举:
public enum TestEnum { EXAMPLE, FURTHER_EXAMPLE, LAST_EXAMPLE }
Run Code Online (Sandbox Code Playgroud)
使用此映射.hbm:
<property name="testEnum" column="TEST_COLUMN">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">p.a.c.k.TestEnum</param>
</type>
</property>
Run Code Online (Sandbox Code Playgroud)
枚举被发送到数据库0,1,2.我想的值,以代替存储为EXAMPLE,FURTHER_EXAMPLE或LAST_EXAMPLE在varchar列.
如何将枚举映射到varchar列?