我有一个带有名为PremiseID的主键的数据库表。
它的MySQL列定义是CHAR(10)。
进入该列的数据始终为10位数字,即9位数后跟空格,如“113091000”或9位数后跟字母,如“113091000A”。
我尝试将其中一个值写入测试MySQL数据库表t1中的表中。它有三列
mainid integer
parentid integer
premiseid char(10)
如果我插入一个具有以下值的行:1,1,'113091000 '
并尝试读回行,则'113991000'值被截断,因此它显示为'113091000';就是空间被删除了。如果我插入一个像'113091000A'这样的数字,则保留该值。
如何让CHAR(10)字段保留空格字符?
我有一个解决这个问题的程序化方法。它将取len('113091000'),实现它的九个字符,然后实现9的长度,推断该数字有一个空格后缀。
答案 0 :(得分:3)
CHAR
列的长度固定为您在创建表时声明的长度。长度可以是0到255之间的任何值。当存储CHAR
值时,它们将使用指定长度的空格右边填充。检索CHAR
值时,将删除尾随空格。
所以没有办法绕过它。如果你使用的是MySQL 5.0.3或更高版本,那么使用VARCHAR
可能是最好的方法(开销只有1个额外的字节):
VARCHAR
值在存储时不会填充。尾随空格的处理取决于版本。从MySQL 5.0.3开始,在存储和检索值时,将保留尾随空格,符合标准SQL。在MySQL 5.0.3之前,当将值存储到VARCHAR
列时,会从值中删除尾随空格;这意味着检索到的值中也没有空格。
如果你正在使用MySQL< 5.0.3,那么我认为你只需要检查返回的长度,或者使用空格以外的字符。
最便携的解决方案可能只是使用CHAR
并检查返回的长度。
答案 1 :(得分:2)
问:如何让CHAR(10)字段保留空格字符?
实际上,该空间被保留并存储。它是删除空间的值的检索。 (删除返回值上的尾随空格是一个记录在案的“特征”。)
一个选项(作为解决方法)是修改SQL查询以将尾随空格附加到返回值,例如
SELECT RPAD(premiseid,10,' ') AS premiseid FROM t1
这将使用长度为10个字符的字符串返回您的值,如果值小于10个字符,则用空格填充,如果长度超过,则将其截断为10个字符。
答案 2 :(得分:1)
标准CHAR(10)
列将始终具有尾随空格,以将字符串填充为所需的10个字符长度。因此,任何故意尾随的空格都将被混合在一起,并且通常会被数据库适配器剥离。
如果可能,请转换为VARCHAR(10)
列,如果要保留尾随空格。您可以使用ALTER TABLE
语句执行此操作。
答案 3 :(得分:1)
虽然戈登的回答可能仍然是正确的,但是在后来的版本中提到了一个解决方案 在您的代码中运行 SET sql_mode ='PAD_CHAR_TO_FULL_LENGTH';
使用此会话设置,您将在CHAR(10)的全长上检索完美列,而在预先没有输入尾随空格时,VARCHAR不会。如果您不需要空格,则可以始终使用rtrim()。