diff --git a/web2py/gluon/dal.py b/web2py/gluon/dal.py
index f26d6c6..57fc6e9 100644
--- a/web2py/gluon/dal.py
+++ b/web2py/gluon/dal.py
@@ -616,7 +616,7 @@ class BaseAdapter(ConnectionPool):
                                 constraint_name=constraint_name,
                                 table_name=tablename,
                                 field_name=field.name,
-                                foreign_key='%s (%s)'%(rtablename, rfieldname),
+                                foreign_key='%s (`%s`)'%(rtablename, rfieldname),
                                 on_delete_action=field.ondelete)
                 else:
                     # make a guess here for circular references
@@ -625,7 +625,7 @@ class BaseAdapter(ConnectionPool):
                         % dict(table_name=tablename,
                                field_name=field.name,
                                constraint_name=constraint_name,
-                               foreign_key=referenced + ('(%s)' % id_fieldname),
+                               foreign_key='`' + referenced + '`' + (' (`%s`)' % id_fieldname),
                                on_delete_action=field.ondelete)
             elif field.type.startswith('list:reference'):
                 ftype = self.types[field.type[:14]]
@@ -661,13 +661,13 @@ class BaseAdapter(ConnectionPool):
                 not_null = self.NOT_NULL(field.default, field.type)
                 ftype = ftype.replace('NOT NULL', not_null)
             sql_fields_aux[field.name] = dict(sql=ftype)
-            fields.append('%s %s' % (field.name, ftype))
+            fields.append('`%s` %s' % (field.name, ftype))
         other = ';'
 
         # backend-specific extensions to fields
         if self.dbengine == 'mysql':
             if not hasattr(table, "_primarykey"):
-                fields.append('PRIMARY KEY(%s)' % table._id.name)
+                fields.append('PRIMARY KEY(`%s`)' % table._id.name)
             other = ' ENGINE=InnoDB CHARACTER SET utf8;'
 
         fields = ',\n    '.join(fields)
@@ -914,7 +914,7 @@ class BaseAdapter(ConnectionPool):
             logfile.write('success!\n')
 
     def _insert(self, table, fields):
-        keys = ','.join(f.name for f,v in fields)
+        keys = ','.join('`' + f.name + '`' for f,v in fields)
         values = ','.join(self.expand(v,f.type) for f,v in fields)
         return 'INSERT INTO %s(%s) VALUES (%s);' % (table, keys, values)
 
@@ -1812,7 +1812,7 @@ class MySQLAdapter(BaseAdapter):
         'time': 'TIME',
         'datetime': 'DATETIME',
         'id': 'INT AUTO_INCREMENT NOT NULL',
-        'reference': 'INT, INDEX %(field_name)s__idx (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s',
+        'reference': 'INT, INDEX %(field_name)s__idx (`%(field_name)s`), FOREIGN KEY (`%(field_name)s`) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s',
         'list:integer': 'LONGTEXT',
         'list:string': 'LONGTEXT',
         'list:reference': 'LONGTEXT',
@@ -7455,9 +7455,9 @@ class Field(Expression):
 
     def __str__(self):
         try:
-            return '%s.%s' % (self.tablename, self.name)
+            return '`%s`.`%s`' % (self.tablename, self.name)
         except:
-            return '<no table>.%s' % self.name
+            return '<no table>.`%s`' % self.name
 
 
 def raw(s): return Expression(None,s)
