当我使用mysqldump转储一个带大写字母的表时,它在我的>中以小写形式出现。 dump.sql文件。我在2006年发现了一份报告,差不多4年http://bugs.mysql.com/bug.php?id=19967
solution here建议使linux不敏感。如果可能,我宁愿不要。什么是将win32 db复制到linux的最简单方法?
答案 0 :(得分:6)
根据MySQL手册,您只有少数选项:
在所有系统上使用lower_case_table_names = 1。主要缺点 这是当你使用SHOW时 TABLES或SHOW DATABASES,你没有 看到他们原来的名字 大小写。
在Unix上使用lower_case_table_names = 0,在lower_case_table_names = 2上使用 视窗。这保留了字母 数据库和表名称。该 这样做的缺点是你必须这样做 始终确保您的陈述 请参阅您的数据库和表名称 用正确的字母包装 视窗。如果你转移你的 声明到Unix,其中是lettercase 很重要,如果,它们不起作用 字母不正确。
例外:如果您正在尝试使用InnoDB表 避免这些数据传输问题, 你应该设置lower_case_table_names 在所有平台上强制名称为1 转换为小写。
有关详细信息,请参阅:http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html。
答案 1 :(得分:2)
今天我必须这样做。我已经有小写的Windows数据库,并且需要使用区分大小写的表名导入到linux数据库,所以使用lowecase_table_names选项的游戏不是一个选项:)
看起来'show tables'显示了适当排序的表名,并且转储已使用`字符转义了表名。我已成功使用以下算法导入数据库:
然后我在转储中有小写名称,在mysql数据库中有区分大小写的名称。我用sed&转换了转储。 awk与以下脚本:
#!/bin/bash
MYSQL="mysql -u root -p mydb"
FILE=mydb.sql
TMP1=`mktemp`
TMP2=`mktemp`
cp $FILE $TMP1
for TABLE in `echo "show tables" | $MYSQL`; do
LCTABLE=`echo $TABLE| awk '{print tolower($0)}'`
echo "$LCTABLE --> $TABLE"
cat $TMP1 | sed "s/\`$LCTABLE\`/\`$TABLE\`/" > $TMP2
cp $TMP2 $TMP1
done
cp $TMP1 $FILE.conv
rm $TMP1
rm $TMP2
转储已正确转换。在Linux中导入后,一切正常。