Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在mysql的较大表中将字段类型从varchar更改为char,它将如何影响数据库_Mysql_Sql - Fatal编程技术网

如果我在mysql的较大表中将字段类型从varchar更改为char,它将如何影响数据库

如果我在mysql的较大表中将字段类型从varchar更改为char,它将如何影响数据库,mysql,sql,Mysql,Sql,我已经存在一个数据库,其中主键作为varchar类型存在于一个表中。 我发现这会降低查询性能。现在我想将数据类型从varchar更改为char。我的问题是,如果我更改表,它将如何影响整个数据库请注意,表中现在存储了300多万条记录。 有什么我需要担心的吗。 提前感谢您的帮助和建议 ,这里是重要的 截断。 对于VARCHAR列,无论使用何种SQL模式,超过列长度的尾随空格在插入之前都会被截断,并生成警告 对于CHAR列,不管SQL模式如何,都会以静默方式执行从插入值中截断多余尾随空格的操作

我已经存在一个数据库,其中主键作为varchar类型存在于一个表中。 我发现这会降低查询性能。现在我想将数据类型从varchar更改为char。我的问题是,如果我更改表,它将如何影响整个数据库请注意,表中现在存储了300多万条记录。

有什么我需要担心的吗。 提前感谢您的帮助和建议

,这里是重要的

  • 截断。
    • 对于VARCHAR列,无论使用何种SQL模式,超过列长度的尾随空格在插入之前都会被截断,并生成警告
    • 对于CHAR列,不管SQL模式如何,都会以静默方式执行从插入值中截断多余尾随空格的操作
  • 填充物。
    • 存储CHAR值时,会使用空格右键填充到指定的长度。检索字符值时,将删除尾随空格
    • VARCHAR值在存储时不进行填充。根据标准SQL,在存储和检索值时保留尾随空格
我严重怀疑从VARCHAR切换到CHAR是否会对查询性能产生任何影响,并且可能会占用更多空间。我也怀疑主键是字符串会影响性能。更有可能的情况是缺少索引或编写得不好的查询。请查收

通常,主键不是自动递增的整数类型(INT或BIGINT)是不好的表设计。作为字符串的主键意味着字符串具有重要意义,您将试图更改它。更改主键会导致各种问题

相反,在表中添加一个整型主键字段,并使用该字段

ALTER TABLE whatever
    DROP PRIMARY KEY,
    ADD COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

确保更改引用此表的所有表以使用新键。

对于您的应用程序来说,
char
varchar
更好吗?主键的数据格式是什么?请注意,通常在任何DBMS中更改键列的类型都需要重新创建表,这是一项非常昂贵的操作,尽管重新创建表所需的时间取决于每行的大小和表上存在的索引。“我发现这会降低查询性能。”---您是如何发现的?char将比varchar占用更多的空间,但如果它是一个键,则不会对查询产生任何速度差异。主键搜索无论类型如何都会很快,尽管int可能比任何字符串类型都快。我们使用了主键的id生成公式。对于每个id,我们从子字符串中检索最大值,并用1递增。然后插入记录。我希望如果我使用char-type,那么这个操作的性能会有一点提高,还可以选择joinquery。我走对了吗?