From fd12989ef8eab0fc9816decb8bcabccd1d213ee8 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 18 Jul 2007 09:49:48 +0200 Subject: auf 1.10.1 aktualisiert --- RELEASE-NOTES | 24 ++ config/index.php | 90 +++---- includes/ChangesList.php | 21 +- includes/DatabasePostgres.php | 102 ++++++-- includes/DefaultSettings.php | 2 +- includes/Image.php | 10 +- includes/SearchPostgres.php | 9 +- install-utils.inc | 18 +- maintenance/archives/patch-ar_deleted.sql | 2 +- maintenance/archives/patch-ar_len.sql | 2 +- maintenance/archives/patch-archive-rev_id.sql | 2 +- maintenance/archives/patch-archive-text_id.sql | 2 +- maintenance/archives/patch-bot.sql | 2 +- maintenance/archives/patch-cache.sql | 4 +- maintenance/archives/patch-categorylinks.sql | 10 +- maintenance/archives/patch-email-notification.sql | 2 +- maintenance/archives/patch-fa_deleted.sql | 2 +- maintenance/archives/patch-filearchive.sql | 20 +- maintenance/archives/patch-img_media_type.sql | 2 +- maintenance/archives/patch-img_width.sql | 12 +- maintenance/archives/patch-interwiki-trans.sql | 2 +- maintenance/archives/patch-interwiki.sql | 4 +- maintenance/archives/patch-ipb_anon_only.sql | 10 +- maintenance/archives/patch-ipb_expiry.sql | 2 +- maintenance/archives/patch-ipb_range_start.sql | 4 +- maintenance/archives/patch-ipblocks.sql | 4 +- maintenance/archives/patch-job.sql | 4 +- maintenance/archives/patch-langlinks.sql | 4 +- maintenance/archives/patch-linktables.sql | 8 +- maintenance/archives/patch-log_deleted.sql | 2 +- maintenance/archives/patch-logging.sql | 6 +- maintenance/archives/patch-math.sql | 6 +- maintenance/archives/patch-objectcache.sql | 2 +- maintenance/archives/patch-page_len.sql | 2 +- maintenance/archives/patch-page_restrictions.sql | 14 +- maintenance/archives/patch-pagelinks.sql | 2 +- maintenance/archives/patch-querycache.sql | 6 +- maintenance/archives/patch-querycacheinfo.sql | 4 +- maintenance/archives/patch-querycachetwo.sql | 8 +- maintenance/archives/patch-rc_deleted.sql | 8 +- maintenance/archives/patch-rc_id.sql | 2 +- maintenance/archives/patch-rc_ip.sql | 2 +- maintenance/archives/patch-rc_len.sql | 2 +- maintenance/archives/patch-rc_type.sql | 4 +- maintenance/archives/patch-redirect.sql | 2 +- maintenance/archives/patch-rename-group.sql | 10 - .../patch-rename-user_groups-and_rights.sql | 6 +- maintenance/archives/patch-restructure.sql | 26 +- maintenance/archives/patch-rev_deleted.sql | 2 +- maintenance/archives/patch-rev_len.sql | 2 +- maintenance/archives/patch-rev_parent_id.sql | 2 +- maintenance/archives/patch-rev_text_id.sql | 2 +- maintenance/archives/patch-searchindex.sql | 2 +- maintenance/archives/patch-ss_images.sql | 2 +- maintenance/archives/patch-ss_total_articles.sql | 6 +- maintenance/archives/patch-templatelinks.sql | 2 +- maintenance/archives/patch-trackbacks.sql | 2 +- maintenance/archives/patch-transcache.sql | 2 +- maintenance/archives/patch-user_email_token.sql | 6 +- maintenance/archives/patch-user_groups.sql | 4 +- maintenance/archives/patch-user_newpass_time.sql | 2 +- maintenance/archives/patch-user_registration.sql | 2 +- maintenance/archives/patch-user_rights.sql | 2 +- maintenance/archives/patch-user_token.sql | 2 +- .../archives/patch-userlevels-defaultgroups.sql | 30 --- maintenance/archives/patch-userlevels-rights.sql | 5 - maintenance/archives/patch-userlevels.sql | 20 +- maintenance/archives/patch-usernewtalk.sql | 6 +- maintenance/archives/patch-usernewtalk2.sql | 6 - maintenance/archives/patch-watchlist-null.sql | 2 +- maintenance/archives/patch-watchlist.sql | 6 +- maintenance/tables.sql | 276 ++++++++++----------- maintenance/updaters.inc | 38 ++- 73 files changed, 500 insertions(+), 425 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 95172e56..a2bc56c5 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -3,6 +3,30 @@ Security reminder: MediaWiki does not require PHP's register_globals setting since version 1.2.0. If you have it on, turn it *off* if you can. +== MediaWiki 1.10.1 == + +July 13, 2007 + +This is a bugfix update to the Spring 2007 quarterly release snapshot. +A number of fixes to improve compatibility with PostgreSQL, some versions +of MySQL, and some PHP configurations are included. + +Changes since 1.10.0: + +* (bug 9417) Uploading new versions of images when using Postgres no longer + throws warnings. +* (bug 9908) Using tsearch2 with Postgres 8.1 no longer gives an error. +* (bug 9973) Changed size was shown in advanced recentchanges collapsible items + with $wgRCShowChangedSized = false. +* Fixed installation on MyISAM or old InnoDB with charset=utf8, was giving + overlong key errors. +* Fixed zero-padding issues with MySQL 5 binary schema +* (bug 9820) session.save_path check no longer halts installation, but + warns of possible bad values +* (bug 9978) Fixed session.save_path validation when using extended + configuration format, e.g. "5;/tmp" + + == MediaWiki 1.10.0 == May 9, 2007 diff --git a/config/index.php b/config/index.php index d036e8c8..e719e47e 100644 --- a/config/index.php +++ b/config/index.php @@ -395,7 +395,8 @@ if( !function_exists( 'session_name' ) ) # session.save_path doesn't *have* to be set, but if it is, and it's # not valid/writable/etc. then it can cause problems -$sessionSavePath = ini_get( 'session.save_path' ); +$sessionSavePath = mw_get_session_save_path(); +$ssp = htmlspecialchars( $sessionSavePath ); # Warn the user if it's not set, but let them proceed if( !$sessionSavePath ) { print "
  • Warning: A value for session.save_path @@ -404,14 +405,12 @@ if( !$sessionSavePath ) { for the user your web server is running under.
  • "; } elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) { # All good? Let the user know - print "
  • Session save path appears to be valid.
  • "; + print "
  • Session save path ({$ssp}) appears to be valid.
  • "; } else { - # Something not right? Halt the installation so the user can fix it up - dieout( "Your session save path appears to be invalid or is not writable. - PHP needs to be able to save data to this location in order for correct - session operation. Please check that session.save_path in - PHP.ini points to a valid path, and is read/write/execute for - the user your web server is running under." ); + # Something not right? Warn the user, but let them proceed + print "
  • Warning: Your session.save_path value ({$ssp}) + appears to be invalid or is not writable. PHP needs to be able to save data to + this location for correct session operation.
  • "; } # Check for PCRE support @@ -839,45 +838,48 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) { if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) { print "
  • There are already MediaWiki tables in this database. Checking if updates are needed...
  • \n"; - # Determine existing default character set - if ( $wgDatabase->tableExists( "revision" ) ) { - $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' ); - $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" ); - $row = $wgDatabase->fetchObject( $res ); - if ( !$row ) { - echo "
  • SHOW TABLE STATUS query failed!
  • \n"; - $existingSchema = false; - } elseif ( preg_match( '/^latin1/', $row->Collation ) ) { - $existingSchema = 'mysql4'; - } elseif ( preg_match( '/^utf8/', $row->Collation ) ) { - $existingSchema = 'mysql5'; - } elseif ( preg_match( '/^binary/', $row->Collation ) ) { - $existingSchema = 'mysql5-binary'; - } else { - $existingSchema = false; - echo "
  • Warning: Unrecognised existing collation
  • \n"; - } - if ( $existingSchema && $existingSchema != $conf->DBschema ) { - print "
  • Warning: you requested the {$conf->DBschema} schema, " . - "but the existing database has the $existingSchema schema. This upgrade script ". - "can't convert it, so it will remain $existingSchema.
  • \n"; - $conf->setSchema( $existingSchema ); + if ( $conf->DBtype == 'mysql') { + + # Determine existing default character set + if ( $wgDatabase->tableExists( "revision" ) ) { + $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' ); + $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" ); + $row = $wgDatabase->fetchObject( $res ); + if ( !$row ) { + echo "
  • SHOW TABLE STATUS query failed!
  • \n"; + $existingSchema = false; + } elseif ( preg_match( '/^latin1/', $row->Collation ) ) { + $existingSchema = 'mysql4'; + } elseif ( preg_match( '/^utf8/', $row->Collation ) ) { + $existingSchema = 'mysql5'; + } elseif ( preg_match( '/^binary/', $row->Collation ) ) { + $existingSchema = 'mysql5-binary'; + } else { + $existingSchema = false; + echo "
  • Warning: Unrecognised existing collation
  • \n"; + } + if ( $existingSchema && $existingSchema != $conf->DBschema ) { + print "
  • Warning: you requested the {$conf->DBschema} schema, " . + "but the existing database has the $existingSchema schema. This upgrade script ". + "can't convert it, so it will remain $existingSchema.
  • \n"; + $conf->setSchema( $existingSchema ); + } } - } - # Create user if required (todo: other databases) - if ( $conf->Root && $conf->DBtype == 'mysql') { - $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 ); - if ( $conn->isOpen() ) { - print "
  • DB user account ok
  • \n"; - $conn->close(); - } else { - print "
  • Granting user permissions..."; - if( $mysqlOldClient && $mysqlNewAuth ) { - print " If the next step fails, see http://dev.mysql.com/doc/mysql/en/old-client.html for help."; + # Create user if required + if ( $conf->Root ) { + $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 ); + if ( $conn->isOpen() ) { + print "
  • DB user account ok
  • \n"; + $conn->close(); + } else { + print "
  • Granting user permissions..."; + if( $mysqlOldClient && $mysqlNewAuth ) { + print " If the next step fails, see http://dev.mysql.com/doc/mysql/en/old-client.html for help."; + } + print "
  • \n"; + dbsource( "../maintenance/users.sql", $wgDatabase ); } - print "\n"; - dbsource( "../maintenance/users.sql", $wgDatabase ); } } print "
    \n";
    diff --git a/includes/ChangesList.php b/includes/ChangesList.php
    index bc141579..751e1226 100644
    --- a/includes/ChangesList.php
    +++ b/includes/ChangesList.php
    @@ -497,18 +497,19 @@ class EnhancedChangesList extends ChangesList {
     
     			$r .= ') . . ';
     
    -			# Character difference
    -			$chardiff = $rcObj->getCharacterDifference( $block[ count( $block ) - 1 ]->mAttribs['rc_old_len'],
    -					$block[0]->mAttribs['rc_new_len'] );
    -			if( $chardiff == '' ) {
    -				$r .= ' (';
    -			} else {
    -				$r .= ' ' . $chardiff. ' . . (';
    -			}
    -			
    +			if( $wgRCShowChangedSize ) {
    +				# Character difference
    +				$chardiff = $rcObj->getCharacterDifference( $block[ count( $block ) - 1 ]->mAttribs['rc_old_len'],
    +						$block[0]->mAttribs['rc_new_len'] );
    +				if( $chardiff == '' ) {
    +					$r .= ' (';
    +				} else {
    +					$r .= ' ' . $chardiff. ' . . ';
    +				}
    +			}	
     
     			# History
    -			$r .= $this->skin->makeKnownLinkObj( $block[0]->getTitle(),
    +			$r .= '(' . $this->skin->makeKnownLinkObj( $block[0]->getTitle(),
     				$this->message['history'], $curIdEq.'&action=history' );
     			$r .= ')';
     		}
    diff --git a/includes/DatabasePostgres.php b/includes/DatabasePostgres.php
    index 7158e2d1..07b3339d 100644
    --- a/includes/DatabasePostgres.php
    +++ b/includes/DatabasePostgres.php
    @@ -378,7 +378,10 @@ class DatabasePostgres extends Database {
     					"WHERE relname = 'pg_pltemplate' AND nspname='pg_catalog'";
     				$rows = $this->numRows($this->doQuery($SQL));
     				if ($rows >= 1) {
    +					$olde = error_reporting(0);
    +					error_reporting($olde - E_WARNING);
     					$result = $this->doQuery("CREATE LANGUAGE plpgsql");
    +					error_reporting($olde);
     					if (!$result) {
     						print "FAILED. You need to install the language plpgsql in the database $wgDBname";
     						dieout("");
    @@ -512,7 +515,7 @@ class DatabasePostgres extends Database {
     
     		# TODO:
     		# hashar : not sure if the following test really trigger if the object
    -		#          fetching failled.
    +		#          fetching failed.
     		if( pg_last_error($this->mConn) ) {
     			throw new DBUnexpectedError($this,  'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
     		}
    @@ -558,6 +561,9 @@ class DatabasePostgres extends Database {
     	}
     
     	function affectedRows() {
    +		if( !isset( $this->mLastResult ) )
    +			return 0;
    +
     		return pg_affected_rows( $this->mLastResult );
     	}
     
    @@ -619,33 +625,83 @@ class DatabasePostgres extends Database {
     
     	}
     
    -	function insert( $table, $a, $fname = 'Database::insert', $options = array() ) {
    -		# Postgres doesn't support options
    -		# We have a go at faking one of them
    -		# TODO: DELAYED, LOW_PRIORITY
    +	/**
    +	 * INSERT wrapper, inserts an array into a table
    +	 *
    +	 * $args may be a single associative array, or an array of these with numeric keys, 
    +	 * for multi-row insert (Postgres version 8.2 and above only).
    +	 *
    +	 * @param array $table   String: Name of the table to insert to.
    +	 * @param array $args    Array: Items to insert into the table.
    +	 * @param array $fname   String: Name of the function, for profiling
    +	 * @param mixed $options String or Array. Valid options: IGNORE
    +	 *
    +	 * @return bool Success of insert operation. IGNORE always returns true.
    +	 */
    +	function insert( $table, $args, $fname = 'DatabasePostgres::insert', $options = array() ) {
    +		global $wgDBversion;
     
    -		if ( !is_array($options))
    -			$options = array($options);
    +		$table = $this->tableName( $table );
    +		if (! isset( $wgDBversion ) ) {
    +			$this->getServerVersion();
    +			$wgDBversion = $this->numeric_version;
    +		}
     
    -		if ( in_array( 'IGNORE', $options ) )
    -			$oldIgnore = $this->ignoreErrors( true );
    +		if ( !is_array( $options ) )
    +			$options = array( $options );
     
    -		# IGNORE is performed using single-row inserts, ignoring errors in each
    -		# FIXME: need some way to distiguish between key collision and other types of error
    -		$oldIgnore = $this->ignoreErrors( true );
    -		if ( !is_array( reset( $a ) ) ) {
    -			$a = array( $a );
    +		if ( isset( $args[0] ) && is_array( $args[0] ) ) {
    +			$multi = true;
    +			$keys = array_keys( $args[0] );
     		}
    -		foreach ( $a as $row ) {
    -			parent::insert( $table, $row, $fname, array() );
    +		else {
    +			$multi = false;
    +			$keys = array_keys( $args );
     		}
    -		$this->ignoreErrors( $oldIgnore );
    -		$retVal = true;
     
    -		if ( in_array( 'IGNORE', $options ) )
    -			$this->ignoreErrors( $oldIgnore );
    +		$ignore = in_array( 'IGNORE', $options ) ? 1 : 0;
    +		if ( $ignore )
    +			$olde = error_reporting( 0 );
    +
    +		$sql = "INSERT INTO $table (" . implode( ',', $keys ) . ') VALUES ';
    +
    +		if ( $multi ) {
    +			if ( $wgDBversion >= 8.1 ) {
    +				$first = true;
    +				foreach ( $args as $row ) {
    +					if ( $first ) {
    +						$first = false;
    +					} else {
    +						$sql .= ',';
    +					}
    +					$sql .= '(' . $this->makeList( $row ) . ')';
    +				}
    +				$res = (bool)$this->query( $sql, $fname, $ignore );
    +			}
    +			else {
    +				$res = true;
    +				$origsql = $sql;
    +				foreach ( $args as $row ) {
    +					$tempsql = $origsql;
    +					$tempsql .= '(' . $this->makeList( $row ) . ')';
    +					$tempres = (bool)$this->query( $tempsql, $fname, $ignore );
    +					if (! $tempres)
    +						$res = false;
    +				}
    +			}
    +		}
    +		else {
    +			$sql .= '(' . $this->makeList( $args ) . ')';
    +			$res = (bool)$this->query( $sql, $fname, $ignore );
    +		}
    +
    +		if ( $ignore ) {
    +			$olde = error_reporting( $olde );
    +			return true;
    +		}
    +
    +		return $res;
     
    -		return $retVal;
     	}
     
     	function tableName( $name ) {
    @@ -989,9 +1045,9 @@ END;
     			$this->doQuery("DROP TABLE $wgDBmwschema.$ctest");
     		}
     		$SQL = "CREATE TABLE $wgDBmwschema.$ctest(a int)";
    -		error_reporting( 0 );
    +		$olde = error_reporting( 0 );
     		$res = $this->doQuery($SQL);
    -		error_reporting( E_ALL );
    +		error_reporting( $olde );
     		if (!$res) {
     			print "FAILED. Make sure that the user \"$wgDBuser\" can write to the schema \"$wgDBmwschema\"\n";
     			dieout("");
    diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
    index 169d67c9..d9bd3760 100644
    --- a/includes/DefaultSettings.php
    +++ b/includes/DefaultSettings.php
    @@ -31,7 +31,7 @@ require_once( 'includes/SiteConfiguration.php' );
     $wgConf = new SiteConfiguration;
     
     /** MediaWiki version number */
    -$wgVersion			= '1.10.0';
    +$wgVersion			= '1.10.1';
     
     /** Name of the site. It must be changed in LocalSettings.php */
     $wgSitename         = 'MediaWiki';
    diff --git a/includes/Image.php b/includes/Image.php
    index 09c2286e..e085936c 100644
    --- a/includes/Image.php
    +++ b/includes/Image.php
    @@ -929,17 +929,19 @@ class Image
     			$thumbPath = wfImageThumbDir( $this->name, $this->fromSharedDirectory ) .  "/$thumbName";
     			$thumbUrl = $this->thumbUrlFromName( $thumbName );
     
    -			$this->migrateThumbFile( $thumbName );
     
    -			if ( file_exists( $thumbPath ) ) {
    +			if ( !$wgGenerateThumbnailOnParse && !($flags & self::RENDER_NOW ) ) {
     				$thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
     				break;
     			}
    -
    -			if ( !$wgGenerateThumbnailOnParse && !($flags & self::RENDER_NOW ) ) {
    +			
    +			wfDebug( "Doing stat for $thumbPath\n" );
    +			$this->migrateThumbFile( $thumbName );
    +			if ( file_exists( $thumbPath ) ) {
     				$thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
     				break;
     			}
    +
     			$thumb = $handler->doTransform( $this, $thumbPath, $thumbUrl, $params );
     
     			// Ignore errors if requested
    diff --git a/includes/SearchPostgres.php b/includes/SearchPostgres.php
    index 3a624ced..7c3580e7 100644
    --- a/includes/SearchPostgres.php
    +++ b/includes/SearchPostgres.php
    @@ -115,6 +115,12 @@ class SearchPostgres extends SearchEngine {
     	 * @private
     	 */
     	function searchQuery( $term, $fulltext, $colname ) {
    +		global $wgDBversion;
    +
    +		if ( !isset( $wgDBversion ) ) {
    +			$this->db->getServerVersion();
    +			$wgDBversion = $this->db->numeric_version;
    +		}
     
     		$searchstring = $this->parseQuery( $term );
     
    @@ -140,8 +146,9 @@ class SearchPostgres extends SearchEngine {
     				}
     			}
     
    +			$rankscore = $wgDBversion > 8.2 ? 5 : 1;
     			$query = "SELECT page_id, page_namespace, page_title, ".
    -			"rank($fulltext, to_tsquery('default',$searchstring),5) AS score ".
    +			"rank($fulltext, to_tsquery('default',$searchstring), $rankscore) AS score ".
     			"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
     			"AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery('default',$searchstring)";
     		}
    diff --git a/install-utils.inc b/install-utils.inc
    index 4e1aad27..24480f91 100644
    --- a/install-utils.inc
    +++ b/install-utils.inc
    @@ -106,4 +106,20 @@ function dbsource( $fname, $db = false ) {
     		exit(1);
     	}
     }
    -?>
    +
    +/**
    + * Get the value of session.save_path
    + *
    + * Per http://uk.php.net/manual/en/ref.session.php#ini.session.save-path,
    + * this might have some additional preceding parts which need to be
    + * ditched
    + *
    + * @return string
    + */
    +function mw_get_session_save_path() {
    +	$path = ini_get( 'session.save_path' );
    +	$path = substr( $path, strrpos( $path, ';' ) );
    +	return $path;
    +}
    +
    +?>
    \ No newline at end of file
    diff --git a/maintenance/archives/patch-ar_deleted.sql b/maintenance/archives/patch-ar_deleted.sql
    index b1d37a5c..2e5edc44 100644
    --- a/maintenance/archives/patch-ar_deleted.sql
    +++ b/maintenance/archives/patch-ar_deleted.sql
    @@ -1,3 +1,3 @@
     -- Adding ar_deleted field for revisiondelete
     ALTER TABLE /*$wgDBprefix*/archive
    -  ADD ar_deleted tinyint(1) unsigned NOT NULL default '0';
    +  ADD ar_deleted tinyint unsigned NOT NULL default '0';
    diff --git a/maintenance/archives/patch-ar_len.sql b/maintenance/archives/patch-ar_len.sql
    index 69e634b0..1710e099 100644
    --- a/maintenance/archives/patch-ar_len.sql
    +++ b/maintenance/archives/patch-ar_len.sql
    @@ -1,3 +1,3 @@
     ALTER TABLE /*$wgDBprefix*/archive
    -  ADD ar_len INT(8) UNSIGNED;
    +  ADD ar_len INT UNSIGNED;
     
    diff --git a/maintenance/archives/patch-archive-rev_id.sql b/maintenance/archives/patch-archive-rev_id.sql
    index 375001b8..b9d789ee 100644
    --- a/maintenance/archives/patch-archive-rev_id.sql
    +++ b/maintenance/archives/patch-archive-rev_id.sql
    @@ -3,4 +3,4 @@
     
     ALTER TABLE /*$wgDBprefix*/archive
       ADD
    -    ar_rev_id int(8) unsigned;
    +    ar_rev_id int unsigned;
    diff --git a/maintenance/archives/patch-archive-text_id.sql b/maintenance/archives/patch-archive-text_id.sql
    index f59715ff..8557f2ad 100644
    --- a/maintenance/archives/patch-archive-text_id.sql
    +++ b/maintenance/archives/patch-archive-text_id.sql
    @@ -11,4 +11,4 @@
     
     ALTER TABLE /*$wgDBprefix*/archive
       ADD
    -    ar_text_id int(8) unsigned;
    +    ar_text_id int unsigned;
    diff --git a/maintenance/archives/patch-bot.sql b/maintenance/archives/patch-bot.sql
    index ce61884c..7625889c 100644
    --- a/maintenance/archives/patch-bot.sql
    +++ b/maintenance/archives/patch-bot.sql
    @@ -7,5 +7,5 @@
     -- column also added to buildTables.inc
     
     ALTER TABLE /*$wgDBprefix*/recentchanges
    -  ADD COLUMN rc_bot tinyint(3) unsigned NOT NULL default '0'
    +  ADD COLUMN rc_bot tinyint unsigned NOT NULL default '0'
       AFTER rc_minor;
    diff --git a/maintenance/archives/patch-cache.sql b/maintenance/archives/patch-cache.sql
    index 5651c3ce..0545da8b 100644
    --- a/maintenance/archives/patch-cache.sql
    +++ b/maintenance/archives/patch-cache.sql
    @@ -15,7 +15,7 @@
     -- cur_touched is later, the page must be regenerated.
     
     ALTER TABLE /*$wgDBprefix*/cur
    -  ADD COLUMN cur_touched char(14) binary NOT NULL default '';
    +  ADD COLUMN cur_touched binary(14) NOT NULL default '';
     
     -- Existing pages should be initialized to the current
     -- time so they don't needlessly rerender until they are
    @@ -36,6 +36,6 @@ UPDATE /*$wgDBprefix*/cur
     -- sent again.
     
     ALTER TABLE /*$wgDBprefix*/user
    -  ADD COLUMN user_touched char(14) binary NOT NULL default '';
    +  ADD COLUMN user_touched binary(14) NOT NULL default '';
     UPDATE /*$wgDBprefix*/user
       SET user_touched=NOW()+0;
    diff --git a/maintenance/archives/patch-categorylinks.sql b/maintenance/archives/patch-categorylinks.sql
    index c5eb396e..02168d7f 100644
    --- a/maintenance/archives/patch-categorylinks.sql
    +++ b/maintenance/archives/patch-categorylinks.sql
    @@ -5,7 +5,7 @@
     --
     CREATE TABLE /*$wgDBprefix*/categorylinks (
       -- Key to page_id of the page defined as a category member.
    -  cl_from int(8) unsigned NOT NULL default '0',
    +  cl_from int unsigned NOT NULL default '0',
       
       -- Name of the category.
       -- This is also the page_title of the category's description page;
    @@ -17,11 +17,9 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
       -- isn't always ideal, but collations seem to be an exciting
       -- and dangerous new world in MySQL...
       --
    -  -- For MySQL 4.1+ with charset set to utf8, the sort key *index*
    -  -- needs cut to be smaller than 1024 bytes (at 3 bytes per char).
    -  -- To sort properly on the shorter key, this field needs to be
    -  -- the same shortness.
    -  cl_sortkey varchar(86) binary NOT NULL default '',
    +  -- Truncate so that the cl_sortkey key fits in 1000 bytes 
    +  -- (MyISAM 5 with server_character_set=utf8)
    +  cl_sortkey varchar(70) binary NOT NULL default '',
       
       -- This isn't really used at present. Provided for an optional
       -- sorting method by approximate addition time.
    diff --git a/maintenance/archives/patch-email-notification.sql b/maintenance/archives/patch-email-notification.sql
    index f9bc0440..337e1ac2 100644
    --- a/maintenance/archives/patch-email-notification.sql
    +++ b/maintenance/archives/patch-email-notification.sql
    @@ -8,4 +8,4 @@
     -- ("notification flags") at once by clicking the new button on his/her watchlist page.
     -- T. Gries/M. Arndt  11.09.2004 - December 2004
     
    -ALTER TABLE /*$wgDBprefix*/watchlist ADD (wl_notificationtimestamp varchar(14) binary);
    +ALTER TABLE /*$wgDBprefix*/watchlist ADD (wl_notificationtimestamp varbinary(14));
    diff --git a/maintenance/archives/patch-fa_deleted.sql b/maintenance/archives/patch-fa_deleted.sql
    index 78163149..3483f8cf 100644
    --- a/maintenance/archives/patch-fa_deleted.sql
    +++ b/maintenance/archives/patch-fa_deleted.sql
    @@ -1,3 +1,3 @@
     -- Adding fa_deleted field for additional content suppression
     ALTER TABLE /*$wgDBprefix*/filearchive 
    -  ADD fa_deleted tinyint(1) unsigned NOT NULL default '0';
    +  ADD fa_deleted tinyint unsigned NOT NULL default '0';
    diff --git a/maintenance/archives/patch-filearchive.sql b/maintenance/archives/patch-filearchive.sql
    index 71f8a5eb..587a2ab4 100644
    --- a/maintenance/archives/patch-filearchive.sql
    +++ b/maintenance/archives/patch-filearchive.sql
    @@ -14,33 +14,33 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
       -- Which storage bin (directory tree or object store) the file data
       -- is stored in. Should be 'deleted' for files that have been deleted;
       -- any other bin is not yet in use.
    -  fa_storage_group varchar(16),
    +  fa_storage_group varbinary(16),
       
       -- SHA-1 of the file contents plus extension, used as a key for storage.
       -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
       --
       -- If NULL, the file was missing at deletion time or has been purged
       -- from the archival storage.
    -  fa_storage_key varchar(64) binary default '',
    +  fa_storage_key varbinary(64) default '',
       
       -- Deletion information, if this file is deleted.
       fa_deleted_user int,
    -  fa_deleted_timestamp char(14) binary default '',
    +  fa_deleted_timestamp binary(14) default '',
       fa_deleted_reason text,
       
       -- Duped fields from image
    -  fa_size int(8) unsigned default '0',
    -  fa_width int(5)  default '0',
    -  fa_height int(5)  default '0',
    +  fa_size int unsigned default '0',
    +  fa_width int  default '0',
    +  fa_height int  default '0',
       fa_metadata mediumblob,
    -  fa_bits int(3)  default '0',
    +  fa_bits int  default '0',
       fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
       fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
    -  fa_minor_mime varchar(32) default "unknown",
    +  fa_minor_mime varbinary(32) default "unknown",
       fa_description tinyblob,
    -  fa_user int(5) unsigned default '0',
    +  fa_user int unsigned default '0',
       fa_user_text varchar(255) binary default '',
    -  fa_timestamp char(14) binary default '',
    +  fa_timestamp binary(14) default '',
       
       PRIMARY KEY (fa_id),
       INDEX (fa_name, fa_timestamp),             -- pick out by image name
    diff --git a/maintenance/archives/patch-img_media_type.sql b/maintenance/archives/patch-img_media_type.sql
    index 2356fc63..857eb98e 100644
    --- a/maintenance/archives/patch-img_media_type.sql
    +++ b/maintenance/archives/patch-img_media_type.sql
    @@ -13,5 +13,5 @@ ALTER TABLE /*$wgDBprefix*/image ADD (
       -- the minor parts are not required to adher to any standard
       -- but should be consistent throughout the database
       -- see http://www.iana.org/assignments/media-types/
    -  img_minor_mime varchar(32) NOT NULL default "unknown"
    +  img_minor_mime varbinary(32) NOT NULL default "unknown"
     );
    diff --git a/maintenance/archives/patch-img_width.sql b/maintenance/archives/patch-img_width.sql
    index c99bd46d..06889ea6 100644
    --- a/maintenance/archives/patch-img_width.sql
    +++ b/maintenance/archives/patch-img_width.sql
    @@ -4,15 +4,15 @@
     -- column is no longer used and has therefore be removed from this patch
     
     ALTER TABLE /*$wgDBprefix*/image ADD (
    -  img_width int(5) NOT NULL default 0,
    -  img_height int(5) NOT NULL default 0,
    -  img_bits int(5) NOT NULL default 0
    +  img_width int NOT NULL default 0,
    +  img_height int NOT NULL default 0,
    +  img_bits int NOT NULL default 0
     );
     
     ALTER TABLE /*$wgDBprefix*/oldimage ADD (
    -  oi_width int(5) NOT NULL default 0,
    -  oi_height int(5) NOT NULL default 0,
    -  oi_bits int(3) NOT NULL default 0
    +  oi_width int NOT NULL default 0,
    +  oi_height int NOT NULL default 0,
    +  oi_bits int NOT NULL default 0
     );
     
     
    diff --git a/maintenance/archives/patch-interwiki-trans.sql b/maintenance/archives/patch-interwiki-trans.sql
    index 2384a66a..5cc4d0b5 100644
    --- a/maintenance/archives/patch-interwiki-trans.sql
    +++ b/maintenance/archives/patch-interwiki-trans.sql
    @@ -1,2 +1,2 @@
     ALTER TABLE /*$wgDBprefix*/interwiki
    -	ADD COLUMN iw_trans TINYINT(1) NOT NULL DEFAULT 0;
    +	ADD COLUMN iw_trans TINYINT NOT NULL DEFAULT 0;
    diff --git a/maintenance/archives/patch-interwiki.sql b/maintenance/archives/patch-interwiki.sql
    index 3efdac8b..321765b9 100644
    --- a/maintenance/archives/patch-interwiki.sql
    +++ b/maintenance/archives/patch-interwiki.sql
    @@ -4,12 +4,12 @@
     
     CREATE TABLE /*$wgDBprefix*/interwiki (
       -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
    -  iw_prefix char(32) NOT NULL,
    +  iw_prefix varchar(32) NOT NULL,
       
       -- The URL of the wiki, with "$1" as a placeholder for an article name.
       -- Any spaces in the name will be transformed to underscores before
       -- insertion.
    -  iw_url char(127) NOT NULL,
    +  iw_url blob NOT NULL,
       
       -- A boolean value indicating whether the wiki is in this project
       -- (used, for example, to detect redirect loops)
    diff --git a/maintenance/archives/patch-ipb_anon_only.sql b/maintenance/archives/patch-ipb_anon_only.sql
    index d46c04e8..fcd257c7 100644
    --- a/maintenance/archives/patch-ipb_anon_only.sql
    +++ b/maintenance/archives/patch-ipb_anon_only.sql
    @@ -10,16 +10,16 @@
     DROP TABLE IF EXISTS /*$wgDBprefix*/ipblocks_newunique;
     
     CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
    -  ipb_id int(8) NOT NULL auto_increment,
    +  ipb_id int NOT NULL auto_increment,
       ipb_address tinyblob NOT NULL,
    -  ipb_user int(8) unsigned NOT NULL default '0',
    -  ipb_by int(8) unsigned NOT NULL default '0',
    +  ipb_user int unsigned NOT NULL default '0',
    +  ipb_by int unsigned NOT NULL default '0',
       ipb_reason tinyblob NOT NULL,
    -  ipb_timestamp char(14) binary NOT NULL default '',
    +  ipb_timestamp binary(14) NOT NULL default '',
       ipb_auto bool NOT NULL default 0,
       ipb_anon_only bool NOT NULL default 0,
       ipb_create_account bool NOT NULL default 1,
    -  ipb_expiry char(14) binary NOT NULL default '',
    +  ipb_expiry varbinary(14) NOT NULL default '',
       ipb_range_start tinyblob NOT NULL,
       ipb_range_end tinyblob NOT NULL,
       
    diff --git a/maintenance/archives/patch-ipb_expiry.sql b/maintenance/archives/patch-ipb_expiry.sql
    index 0f106d70..f3b6a82b 100644
    --- a/maintenance/archives/patch-ipb_expiry.sql
    +++ b/maintenance/archives/patch-ipb_expiry.sql
    @@ -1,6 +1,6 @@
     -- Adds the ipb_expiry field to ipblocks
     
    -ALTER TABLE /*$wgDBprefix*/ipblocks ADD ipb_expiry char(14) binary NOT NULL default '';
    +ALTER TABLE /*$wgDBprefix*/ipblocks ADD ipb_expiry varbinary(14) NOT NULL default '';
     
     -- All IP blocks have one day expiry
     UPDATE /*$wgDBprefix*/ipblocks SET ipb_expiry = date_format(date_add(ipb_timestamp,INTERVAL 1 DAY),"%Y%m%d%H%i%s") WHERE ipb_user = 0;
    diff --git a/maintenance/archives/patch-ipb_range_start.sql b/maintenance/archives/patch-ipb_range_start.sql
    index c31e2d9c..64a906d4 100644
    --- a/maintenance/archives/patch-ipb_range_start.sql
    +++ b/maintenance/archives/patch-ipb_range_start.sql
    @@ -1,7 +1,7 @@
     -- Add the range handling fields
     ALTER TABLE /*$wgDBprefix*/ipblocks 
    -  ADD ipb_range_start varchar(32) NOT NULL default '',
    -  ADD ipb_range_end varchar(32) NOT NULL default '',
    +  ADD ipb_range_start tinyblob NOT NULL default '',
    +  ADD ipb_range_end tinyblob NOT NULL default '',
       ADD INDEX ipb_range (ipb_range_start(8), ipb_range_end(8));
     
     
    diff --git a/maintenance/archives/patch-ipblocks.sql b/maintenance/archives/patch-ipblocks.sql
    index 8e47798b..634fa78c 100644
    --- a/maintenance/archives/patch-ipblocks.sql
    +++ b/maintenance/archives/patch-ipblocks.sql
    @@ -1,6 +1,6 @@
     -- For auto-expiring blocks --
     
     ALTER TABLE /*$wgDBprefix*/ipblocks
    -	ADD ipb_auto tinyint(1) NOT NULL default '0',
    -	ADD ipb_id int(8) NOT NULL auto_increment,
    +	ADD ipb_auto tinyint NOT NULL default '0',
    +	ADD ipb_id int NOT NULL auto_increment,
     	ADD PRIMARY KEY (ipb_id);
    diff --git a/maintenance/archives/patch-job.sql b/maintenance/archives/patch-job.sql
    index d931124d..a1f9094f 100644
    --- a/maintenance/archives/patch-job.sql
    +++ b/maintenance/archives/patch-job.sql
    @@ -1,10 +1,10 @@
     
     -- Jobs performed by parallel apache threads or a command-line daemon
     CREATE TABLE /*$wgDBprefix*/job (
    -  job_id int(9) unsigned NOT NULL auto_increment,
    +  job_id int unsigned NOT NULL auto_increment,
       
       -- Command name, currently only refreshLinks is defined
    -  job_cmd varchar(255) NOT NULL default '',
    +  job_cmd varbinary(60) NOT NULL default '',
     
       -- Namespace and title to act on
       -- Should be 0 and '' if the command does not operate on a title
    diff --git a/maintenance/archives/patch-langlinks.sql b/maintenance/archives/patch-langlinks.sql
    index 33eb419d..ffff07c0 100644
    --- a/maintenance/archives/patch-langlinks.sql
    +++ b/maintenance/archives/patch-langlinks.sql
    @@ -1,9 +1,9 @@
     CREATE TABLE /*$wgDBprefix*/langlinks (
       -- page_id of the referring page
    -  ll_from int(8) unsigned NOT NULL default '0',
    +  ll_from int unsigned NOT NULL default '0',
       
       -- Language code of the target
    -  ll_lang varchar(10) binary NOT NULL default '',
    +  ll_lang varbinary(20) NOT NULL default '',
     
       -- Title of the target, including namespace
       ll_title varchar(255) binary NOT NULL default '',
    diff --git a/maintenance/archives/patch-linktables.sql b/maintenance/archives/patch-linktables.sql
    index 8c521ad9..ae9768a8 100644
    --- a/maintenance/archives/patch-linktables.sql
    +++ b/maintenance/archives/patch-linktables.sql
    @@ -5,13 +5,13 @@
     DROP TABLE IF EXISTS /*$wgDBprefix*/links;
     CREATE TABLE /*$wgDBprefix*/links (
       -- Key to the page_id of the page containing the link.
    -  l_from int(8) unsigned NOT NULL default '0',
    +  l_from int unsigned NOT NULL default '0',
       
       -- Key to the page_id of the link target.
       -- An unfortunate consequence of this is that rename
       -- operations require changing the links entries for
       -- all links to the moved page.
    -  l_to int(8) unsigned NOT NULL default '0',
    +  l_to int unsigned NOT NULL default '0',
       
       UNIQUE KEY l_from(l_from,l_to),
       KEY (l_to)
    @@ -26,7 +26,7 @@ CREATE TABLE /*$wgDBprefix*/links (
     DROP TABLE IF EXISTS /*$wgDBprefix*/brokenlinks;
     CREATE TABLE /*$wgDBprefix*/brokenlinks (
       -- Key to the page_id of the page containing the link.
    -  bl_from int(8) unsigned NOT NULL default '0',
    +  bl_from int unsigned NOT NULL default '0',
       
       -- Text of the target page title ("namesapce:title").
       -- Unfortunately this doesn't split the namespace index
    @@ -45,7 +45,7 @@ CREATE TABLE /*$wgDBprefix*/brokenlinks (
     DROP TABLE IF EXISTS /*$wgDBprefix*/imagelinks;
     CREATE TABLE /*$wgDBprefix*/imagelinks (
       -- Key to page_id of the page containing the image / media link.
    -  il_from int(8) unsigned NOT NULL default '0',
    +  il_from int unsigned NOT NULL default '0',
       
       -- Filename of target image.
       -- This is also the page_title of the file's description page;
    diff --git a/maintenance/archives/patch-log_deleted.sql b/maintenance/archives/patch-log_deleted.sql
    index 6c777134..0fce0f51 100644
    --- a/maintenance/archives/patch-log_deleted.sql
    +++ b/maintenance/archives/patch-log_deleted.sql
    @@ -1,3 +1,3 @@
     -- Adding ar_deleted field for revisiondelete
     ALTER TABLE /*$wgDBprefix*/logging
    -  ADD log_deleted tinyint(1) unsigned NOT NULL default '0';
    \ No newline at end of file
    +  ADD log_deleted tinyint unsigned NOT NULL default '0';
    diff --git a/maintenance/archives/patch-logging.sql b/maintenance/archives/patch-logging.sql
    index 96847526..b5cfdf72 100644
    --- a/maintenance/archives/patch-logging.sql
    +++ b/maintenance/archives/patch-logging.sql
    @@ -5,11 +5,11 @@ CREATE TABLE /*$wgDBprefix*/logging (
       -- Symbolic keys for the general log type and the action type
       -- within the log. The output format will be controlled by the
       -- action field, but only the type controls categorization.
    -  log_type char(10) NOT NULL default '',
    -  log_action char(10) NOT NULL default '',
    +  log_type varbinary(10) NOT NULL default '',
    +  log_action varbinary(10) NOT NULL default '',
       
       -- Timestamp. Duh.
    -  log_timestamp char(14) NOT NULL default '19700101000000',
    +  log_timestamp binary(14) NOT NULL default '19700101000000',
       
       -- The user who performed this action; key to user_id
       log_user int unsigned NOT NULL default 0,
    diff --git a/maintenance/archives/patch-math.sql b/maintenance/archives/patch-math.sql
    index d217ecea..1d4b90e1 100644
    --- a/maintenance/archives/patch-math.sql
    +++ b/maintenance/archives/patch-math.sql
    @@ -8,14 +8,14 @@
     DROP TABLE IF EXISTS /*$wgDBprefix*/math;
     CREATE TABLE /*$wgDBprefix*/math (
       -- Binary MD5 hash of the latex fragment, used as an identifier key.
    -  math_inputhash varchar(16) NOT NULL,
    +  math_inputhash varbinary(16) NOT NULL,
       
       -- Not sure what this is, exactly...
    -  math_outputhash varchar(16) NOT NULL,
    +  math_outputhash varbinary(16) NOT NULL,
       
       -- texvc reports how well it thinks the HTML conversion worked;
       -- if it's a low level the PNG rendering may be preferred.
    -  math_html_conservativeness tinyint(1) NOT NULL,
    +  math_html_conservativeness tinyint NOT NULL,
       
       -- HTML output from texvc, if any
       math_html text,
    diff --git a/maintenance/archives/patch-objectcache.sql b/maintenance/archives/patch-objectcache.sql
    index a439dd03..223a11c9 100644
    --- a/maintenance/archives/patch-objectcache.sql
    +++ b/maintenance/archives/patch-objectcache.sql
    @@ -1,6 +1,6 @@
     -- For a few generic cache operations if not using Memcached
     CREATE TABLE /*$wgDBprefix*/objectcache (
    -  keyname char(255) binary not null default '',
    +  keyname varbinary(255) binary not null default '',
       value mediumblob,
       exptime datetime,
       unique key (keyname),
    diff --git a/maintenance/archives/patch-page_len.sql b/maintenance/archives/patch-page_len.sql
    index c32dc8d4..7d01d90a 100644
    --- a/maintenance/archives/patch-page_len.sql
    +++ b/maintenance/archives/patch-page_len.sql
    @@ -6,7 +6,7 @@
     -- Added 2005-03-12
     
     ALTER TABLE /*$wgDBprefix*/page
    -  ADD page_len int(8) unsigned NOT NULL,
    +  ADD page_len int unsigned NOT NULL,
       ADD INDEX (page_len);
     
     -- Not accurate if upgrading from intermediate
    diff --git a/maintenance/archives/patch-page_restrictions.sql b/maintenance/archives/patch-page_restrictions.sql
    index c0eafab9..c18a054e 100644
    --- a/maintenance/archives/patch-page_restrictions.sql
    +++ b/maintenance/archives/patch-page_restrictions.sql
    @@ -1,17 +1,17 @@
     --- Used for storing page restrictions (i.e. protection levels)
     CREATE TABLE /*$wgDBprefix*/page_restrictions (
     	-- Page to apply restrictions to (Foreign Key to page).
    -	pr_page int(8) NOT NULL,
    +	pr_page int NOT NULL,
     	-- The protection type (edit, move, etc)
    -	pr_type varchar(255) NOT NULL,
    +	pr_type varbinary(60) NOT NULL,
     	-- The protection level (Sysop, autoconfirmed, etc)
    -	pr_level varchar(255) NOT NULL,
    +	pr_level varbinary(60) NOT NULL,
     	-- Whether or not to cascade the protection down to pages transcluded.
    -	pr_cascade tinyint(4) NOT NULL,
    +	pr_cascade tinyint NOT NULL,
     	-- Field for future support of per-user restriction.
    -	pr_user int(8) NULL,
    +	pr_user int NULL,
     	-- Field for time-limited protection.
    -	pr_expiry char(14) binary NULL,
    +	pr_expiry varbinary(14) NULL,
     
     	PRIMARY KEY pr_pagetype (pr_page,pr_type),
     
    @@ -19,4 +19,4 @@ CREATE TABLE /*$wgDBprefix*/page_restrictions (
     	KEY pr_typelevel (pr_type,pr_level),
     	KEY pr_level (pr_level),
     	KEY pr_cascade (pr_cascade)
    -) /*$wgDBTableOptions*/;
    \ No newline at end of file
    +) /*$wgDBTableOptions*/;
    diff --git a/maintenance/archives/patch-pagelinks.sql b/maintenance/archives/patch-pagelinks.sql
    index 91e279da..118592fb 100644
    --- a/maintenance/archives/patch-pagelinks.sql
    +++ b/maintenance/archives/patch-pagelinks.sql
    @@ -18,7 +18,7 @@
     --
     CREATE TABLE /*$wgDBprefix*/pagelinks (
       -- Key to the page_id of the page containing the link.
    -  pl_from int(8) unsigned NOT NULL default '0',
    +  pl_from int unsigned NOT NULL default '0',
       
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    diff --git a/maintenance/archives/patch-querycache.sql b/maintenance/archives/patch-querycache.sql
    index d0a592ac..e6da79cc 100644
    --- a/maintenance/archives/patch-querycache.sql
    +++ b/maintenance/archives/patch-querycache.sql
    @@ -2,14 +2,14 @@
     
     CREATE TABLE /*$wgDBprefix*/querycache (
       -- A key name, generally the base name of of the special page.
    -  qc_type char(32) NOT NULL,
    +  qc_type varbinary(32) NOT NULL,
       
       -- Some sort of stored value. Sizes, counts...
    -  qc_value int(5) unsigned NOT NULL default '0',
    +  qc_value int unsigned NOT NULL default '0',
       
       -- Target namespace+title
       qc_namespace int NOT NULL default '0',
    -  qc_title char(255) binary NOT NULL default '',
    +  qc_title varchar(255) binary NOT NULL default '',
       
       KEY (qc_type,qc_value)
     
    diff --git a/maintenance/archives/patch-querycacheinfo.sql b/maintenance/archives/patch-querycacheinfo.sql
    index d90189e2..7ad2bca6 100644
    --- a/maintenance/archives/patch-querycacheinfo.sql
    +++ b/maintenance/archives/patch-querycacheinfo.sql
    @@ -2,10 +2,10 @@ CREATE TABLE /*$wgDBprefix*/querycache_info (
     
     	-- Special page name
     	-- Corresponds to a qc_type value
    -	qci_type varchar(32) NOT NULL default '',
    +	qci_type varbinary(32) NOT NULL default '',
     
     	-- Timestamp of last update
    -	qci_timestamp char(14) NOT NULL default '19700101000000',
    +	qci_timestamp binary(14) NOT NULL default '19700101000000',
     
     	UNIQUE KEY ( qci_type )
     
    diff --git a/maintenance/archives/patch-querycachetwo.sql b/maintenance/archives/patch-querycachetwo.sql
    index 4f7a60ac..01623bc7 100644
    --- a/maintenance/archives/patch-querycachetwo.sql
    +++ b/maintenance/archives/patch-querycachetwo.sql
    @@ -2,18 +2,18 @@
     
     CREATE TABLE /*$wgDBprefix*/querycachetwo (
       -- A key name, generally the base name of of the special page.
    -  qcc_type char(32) NOT NULL,
    +  qcc_type varbinary(32) NOT NULL,
       
       -- Some sort of stored value. Sizes, counts...
    -  qcc_value int(5) unsigned NOT NULL default '0',
    +  qcc_value int unsigned NOT NULL default '0',
       
       -- Target namespace+title
       qcc_namespace int NOT NULL default '0',
    -  qcc_title char(255) binary NOT NULL default '',
    +  qcc_title varchar(255) binary NOT NULL default '',
       
       -- Target namespace+title2
       qcc_namespacetwo int NOT NULL default '0',
    -  qcc_titletwo char(255) binary NOT NULL default '',
    +  qcc_titletwo varchar(255) binary NOT NULL default '',
     
       KEY qcc_type (qcc_type,qcc_value),
       KEY qcc_title (qcc_type,qcc_namespace,qcc_title),
    diff --git a/maintenance/archives/patch-rc_deleted.sql b/maintenance/archives/patch-rc_deleted.sql
    index a2bdca9b..cc668433 100644
    --- a/maintenance/archives/patch-rc_deleted.sql
    +++ b/maintenance/archives/patch-rc_deleted.sql
    @@ -1,8 +1,8 @@
     -- Adding rc_deleted field for revisiondelete
     -- Add rc_logid to match log_id
     ALTER TABLE /*$wgDBprefix*/recentchanges 
    -  ADD rc_deleted tinyint(1) unsigned NOT NULL default '0',
    -  ADD rc_logid int(10) unsigned NOT NULL default '0',
    -  ADD rc_log_type varchar(255) binary NULL default NULL,
    -  ADD rc_log_action varchar(255) binary NULL default NULL,
    +  ADD rc_deleted tinyint unsigned NOT NULL default '0',
    +  ADD rc_logid int unsigned NOT NULL default '0',
    +  ADD rc_log_type varbinary(255) NULL default NULL,
    +  ADD rc_log_action varbinary(255) NULL default NULL,
       ADD rc_params blob NOT NULL default '';
    diff --git a/maintenance/archives/patch-rc_id.sql b/maintenance/archives/patch-rc_id.sql
    index 6dd9ef4a..3b023753 100644
    --- a/maintenance/archives/patch-rc_id.sql
    +++ b/maintenance/archives/patch-rc_id.sql
    @@ -1,7 +1,7 @@
     -- Primary key in recentchanges
     
     ALTER TABLE /*$wgDBprefix*/recentchanges 
    -  ADD rc_id int(8) NOT NULL auto_increment,
    +  ADD rc_id int NOT NULL auto_increment,
       ADD PRIMARY KEY rc_id (rc_id);
     
     
    diff --git a/maintenance/archives/patch-rc_ip.sql b/maintenance/archives/patch-rc_ip.sql
    index a68a22cb..6b0b0534 100644
    --- a/maintenance/archives/patch-rc_ip.sql
    +++ b/maintenance/archives/patch-rc_ip.sql
    @@ -1,7 +1,7 @@
     -- Adding the rc_ip field for logging of IP addresses in recentchanges
     
     ALTER TABLE /*$wgDBprefix*/recentchanges 
    -  ADD rc_ip char(15) NOT NULL default '',
    +  ADD rc_ip varbinary(40) NOT NULL default '',
       ADD INDEX rc_ip (rc_ip);
     
     
    diff --git a/maintenance/archives/patch-rc_len.sql b/maintenance/archives/patch-rc_len.sql
    index 920f755b..6c781a00 100644
    --- a/maintenance/archives/patch-rc_len.sql
    +++ b/maintenance/archives/patch-rc_len.sql
    @@ -5,5 +5,5 @@
     --
     
     ALTER TABLE /*$wgDBprefix*/recentchanges
    -	ADD COLUMN rc_old_len int(10), ADD COLUMN rc_new_len int(10);
    +	ADD COLUMN rc_old_len int, ADD COLUMN rc_new_len int;
     
    diff --git a/maintenance/archives/patch-rc_type.sql b/maintenance/archives/patch-rc_type.sql
    index 1097771b..f1fb18e5 100644
    --- a/maintenance/archives/patch-rc_type.sql
    +++ b/maintenance/archives/patch-rc_type.sql
    @@ -1,8 +1,8 @@
     -- recentchanges improvements --
     
     ALTER TABLE /*$wgDBprefix*/recentchanges
    -  ADD rc_type tinyint(3) unsigned NOT NULL default '0',
    -  ADD rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
    +  ADD rc_type tinyint unsigned NOT NULL default '0',
    +  ADD rc_moved_to_ns tinyint unsigned NOT NULL default '0',
       ADD rc_moved_to_title varchar(255) binary NOT NULL default '';
     
     UPDATE /*$wgDBprefix*/recentchanges SET rc_type=1 WHERE rc_new;
    diff --git a/maintenance/archives/patch-redirect.sql b/maintenance/archives/patch-redirect.sql
    index 455a674f..5d7218bc 100644
    --- a/maintenance/archives/patch-redirect.sql
    +++ b/maintenance/archives/patch-redirect.sql
    @@ -4,7 +4,7 @@
     -- 
     CREATE TABLE /*$wgDBprefix*/redirect (
       -- Key to the page_id of the redirect page
    -  rd_from int(8) unsigned NOT NULL default '0',
    +  rd_from int unsigned NOT NULL default '0',
     
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    diff --git a/maintenance/archives/patch-rename-group.sql b/maintenance/archives/patch-rename-group.sql
    index 026b60bd..e69de29b 100644
    --- a/maintenance/archives/patch-rename-group.sql
    +++ b/maintenance/archives/patch-rename-group.sql
    @@ -1,10 +0,0 @@
    --- Rename groups table to groups, which is not a keyword
    --- It was called group in a few alpha versions
    -
    -RENAME TABLE /*$wgDBprefix*/`group` TO /*$wgDBprefix*/groups;
    -ALTER TABLE /*$wgDBprefix*/groups 
    -	CHANGE group_id gr_id int(5) unsigned NOT NULL auto_increment,
    -	CHANGE group_name gr_name varchar(50) NOT NULL default '',
    -	CHANGE group_description gr_description varchar(255) NOT NULL default '',
    -	CHANGE group_rights gr_rights tinyblob;
    -
    diff --git a/maintenance/archives/patch-rename-user_groups-and_rights.sql b/maintenance/archives/patch-rename-user_groups-and_rights.sql
    index 650f2604..978b31f7 100644
    --- a/maintenance/archives/patch-rename-user_groups-and_rights.sql
    +++ b/maintenance/archives/patch-rename-user_groups-and_rights.sql
    @@ -1,9 +1,9 @@
     
     ALTER TABLE /*$wgDBprefix*/user_groups
    -	CHANGE user_id ug_user INT(5) UNSIGNED NOT NULL DEFAULT '0',
    -	CHANGE group_id ug_group INT(5) UNSIGNED NOT NULL DEFAULT '0';
    +	CHANGE user_id ug_user INT UNSIGNED NOT NULL DEFAULT '0',
    +	CHANGE group_id ug_group INT UNSIGNED NOT NULL DEFAULT '0';
     
     ALTER TABLE /*$wgDBprefix*/user_rights
    -	CHANGE user_id ur_user INT(5) UNSIGNED NOT NULL,
    +	CHANGE user_id ur_user INT UNSIGNED NOT NULL,
     	CHANGE user_rights ur_rights TINYBLOB NOT NULL;
     
    diff --git a/maintenance/archives/patch-restructure.sql b/maintenance/archives/patch-restructure.sql
    index acf306c2..7b638483 100644
    --- a/maintenance/archives/patch-restructure.sql
    +++ b/maintenance/archives/patch-restructure.sql
    @@ -10,17 +10,17 @@
     -- discarded when done.
     
     CREATE TABLE /*$wgDBprefix*/page (
    -  page_id int(8) unsigned NOT NULL auto_increment,
    +  page_id int unsigned NOT NULL auto_increment,
       page_namespace tinyint NOT NULL,
       page_title varchar(255) binary NOT NULL,
       page_restrictions tinyblob NOT NULL,
    -  page_counter bigint(20) unsigned NOT NULL default '0',
    -  page_is_redirect tinyint(1) unsigned NOT NULL default '0',
    -  page_is_new tinyint(1) unsigned NOT NULL default '0',
    +  page_counter bigint unsigned NOT NULL default '0',
    +  page_is_redirect tinyint unsigned NOT NULL default '0',
    +  page_is_new tinyint unsigned NOT NULL default '0',
       page_random real unsigned NOT NULL,
    -  page_touched char(14) binary NOT NULL default '',
    -  page_latest int(8) unsigned NOT NULL,
    -  page_len int(8) unsigned NOT NULL,
    +  page_touched binary(14) NOT NULL default '',
    +  page_latest int unsigned NOT NULL,
    +  page_len int unsigned NOT NULL,
     
       PRIMARY KEY page_id (page_id),
       UNIQUE INDEX name_title (page_namespace,page_title),
    @@ -29,14 +29,14 @@ CREATE TABLE /*$wgDBprefix*/page (
     );
     
     CREATE TABLE /*$wgDBprefix*/revision (
    -  rev_id int(8) unsigned NOT NULL auto_increment,
    -  rev_page int(8) unsigned NOT NULL,
    +  rev_id int unsigned NOT NULL auto_increment,
    +  rev_page int unsigned NOT NULL,
       rev_comment tinyblob NOT NULL,
    -  rev_user int(5) unsigned NOT NULL default '0',
    +  rev_user int unsigned NOT NULL default '0',
       rev_user_text varchar(255) binary NOT NULL default '',
    -  rev_timestamp char(14) binary NOT NULL default '',
    -  rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
    -  rev_deleted tinyint(1) unsigned NOT NULL default '0',
    +  rev_timestamp binary(14) NOT NULL default '',
    +  rev_minor_edit tinyint unsigned NOT NULL default '0',
    +  rev_deleted tinyint unsigned NOT NULL default '0',
     
       
       PRIMARY KEY rev_page_id (rev_page, rev_id),
    diff --git a/maintenance/archives/patch-rev_deleted.sql b/maintenance/archives/patch-rev_deleted.sql
    index 3af0c1d7..ba47f789 100644
    --- a/maintenance/archives/patch-rev_deleted.sql
    +++ b/maintenance/archives/patch-rev_deleted.sql
    @@ -8,4 +8,4 @@
     --
     
     ALTER TABLE /*$wgDBprefix*/revision
    -  ADD rev_deleted tinyint(1) unsigned NOT NULL default '0';
    +  ADD rev_deleted tinyint unsigned NOT NULL default '0';
    diff --git a/maintenance/archives/patch-rev_len.sql b/maintenance/archives/patch-rev_len.sql
    index b861a2bc..ccdae8b8 100644
    --- a/maintenance/archives/patch-rev_len.sql
    +++ b/maintenance/archives/patch-rev_len.sql
    @@ -1,3 +1,3 @@
     ALTER TABLE /*$wgDBprefix*/revision
    -  ADD rev_len INT(8) UNSIGNED;
    +  ADD rev_len INT UNSIGNED;
     
    diff --git a/maintenance/archives/patch-rev_parent_id.sql b/maintenance/archives/patch-rev_parent_id.sql
    index 971122bb..4baf7927 100644
    --- a/maintenance/archives/patch-rev_parent_id.sql
    +++ b/maintenance/archives/patch-rev_parent_id.sql
    @@ -6,4 +6,4 @@
     --
     
     ALTER TABLE /*$wgDBprefix*/revision
    -  ADD rev_parent_id int(8) unsigned default NULL;
    +  ADD rev_parent_id int unsigned default NULL;
    diff --git a/maintenance/archives/patch-rev_text_id.sql b/maintenance/archives/patch-rev_text_id.sql
    index 44ef438c..3dd9127d 100644
    --- a/maintenance/archives/patch-rev_text_id.sql
    +++ b/maintenance/archives/patch-rev_text_id.sql
    @@ -11,7 +11,7 @@
     --
     
     ALTER TABLE /*$wgDBprefix*/revision
    -  ADD rev_text_id int(8) unsigned NOT NULL;
    +  ADD rev_text_id int unsigned NOT NULL;
     
     UPDATE /*$wgDBprefix*/revision
       SET rev_text_id=rev_id;
    diff --git a/maintenance/archives/patch-searchindex.sql b/maintenance/archives/patch-searchindex.sql
    index 2b9b6702..452c4548 100644
    --- a/maintenance/archives/patch-searchindex.sql
    +++ b/maintenance/archives/patch-searchindex.sql
    @@ -9,7 +9,7 @@
     DROP TABLE IF EXISTS /*$wgDBprefix*/searchindex;
     CREATE TABLE /*$wgDBprefix*/searchindex (
       -- Key to page_id
    -  si_page int(8) unsigned NOT NULL,
    +  si_page int unsigned NOT NULL,
       
       -- Munged version of title
       si_title varchar(255) NOT NULL default '',
    diff --git a/maintenance/archives/patch-ss_images.sql b/maintenance/archives/patch-ss_images.sql
    index e1950eb6..80f1295f 100644
    --- a/maintenance/archives/patch-ss_images.sql
    +++ b/maintenance/archives/patch-ss_images.sql
    @@ -1,5 +1,5 @@
     -- More statistics, for version 1.6
     
    -ALTER TABLE /*$wgDBprefix*/site_stats ADD ss_images int(10) default '0';
    +ALTER TABLE /*$wgDBprefix*/site_stats ADD ss_images int default '0';
     SELECT @images := COUNT(*) FROM /*$wgDBprefix*/image;
     UPDATE /*$wgDBprefix*/site_stats SET ss_images=@images;
    diff --git a/maintenance/archives/patch-ss_total_articles.sql b/maintenance/archives/patch-ss_total_articles.sql
    index b4a48cf7..ce804ce5 100644
    --- a/maintenance/archives/patch-ss_total_articles.sql
    +++ b/maintenance/archives/patch-ss_total_articles.sql
    @@ -1,6 +1,6 @@
     -- Faster statistics, as of 1.4.3
     
     ALTER TABLE /*$wgDBprefix*/site_stats
    -  ADD ss_total_pages bigint(20) default -1,
    -  ADD ss_users bigint(20) default -1,
    -  ADD ss_admins int(10) default -1;
    +  ADD ss_total_pages bigint default -1,
    +  ADD ss_users bigint default -1,
    +  ADD ss_admins int default -1;
    diff --git a/maintenance/archives/patch-templatelinks.sql b/maintenance/archives/patch-templatelinks.sql
    index 31318ba7..a545b34e 100644
    --- a/maintenance/archives/patch-templatelinks.sql
    +++ b/maintenance/archives/patch-templatelinks.sql
    @@ -3,7 +3,7 @@
     --
     CREATE TABLE /*$wgDBprefix*/templatelinks (
       -- Key to the page_id of the page containing the link.
    -  tl_from int(8) unsigned NOT NULL default '0',
    +  tl_from int unsigned NOT NULL default '0',
       
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    diff --git a/maintenance/archives/patch-trackbacks.sql b/maintenance/archives/patch-trackbacks.sql
    index 4193d058..e3a47aae 100644
    --- a/maintenance/archives/patch-trackbacks.sql
    +++ b/maintenance/archives/patch-trackbacks.sql
    @@ -2,7 +2,7 @@ CREATE TABLE /*$wgDBprefix*/trackbacks (
     	tb_id		INTEGER AUTO_INCREMENT PRIMARY KEY,
     	tb_page		INTEGER REFERENCES page(page_id) ON DELETE CASCADE,
     	tb_title	VARCHAR(255) NOT NULL,
    -	tb_url		VARCHAR(255) NOT NULL,
    +	tb_url		BLOB NOT NULL,
     	tb_ex		TEXT,
     	tb_name		VARCHAR(255),
     
    diff --git a/maintenance/archives/patch-transcache.sql b/maintenance/archives/patch-transcache.sql
    index 0d2204e4..d0731697 100644
    --- a/maintenance/archives/patch-transcache.sql
    +++ b/maintenance/archives/patch-transcache.sql
    @@ -1,5 +1,5 @@
     CREATE TABLE /*$wgDBprefix*/transcache (
    -	tc_url		VARCHAR(255) NOT NULL,
    +	tc_url		varbinary(255) NOT NULL,
     	tc_contents	TEXT,
     	tc_time		INT NOT NULL,
     	UNIQUE INDEX tc_url_idx(tc_url)
    diff --git a/maintenance/archives/patch-user_email_token.sql b/maintenance/archives/patch-user_email_token.sql
    index d4d633b7..f8e66ca4 100644
    --- a/maintenance/archives/patch-user_email_token.sql
    +++ b/maintenance/archives/patch-user_email_token.sql
    @@ -6,7 +6,7 @@
     --
     
     ALTER TABLE /*$wgDBprefix*/user
    -  ADD COLUMN user_email_authenticated CHAR(14) BINARY,
    -  ADD COLUMN user_email_token CHAR(32) BINARY,
    -  ADD COLUMN user_email_token_expires CHAR(14) BINARY,
    +  ADD COLUMN user_email_authenticated binary(14),
    +  ADD COLUMN user_email_token binary(32),
    +  ADD COLUMN user_email_token_expires binary(14),
       ADD INDEX (user_email_token);
    diff --git a/maintenance/archives/patch-user_groups.sql b/maintenance/archives/patch-user_groups.sql
    index 20e00520..c3740332 100644
    --- a/maintenance/archives/patch-user_groups.sql
    +++ b/maintenance/archives/patch-user_groups.sql
    @@ -8,7 +8,7 @@
     --
     CREATE TABLE /*$wgDBprefix*/user_groups (
       -- Key to user_id
    -  ug_user int(5) unsigned NOT NULL default '0',
    +  ug_user int unsigned NOT NULL default '0',
       
       -- Group names are short symbolic string keys.
       -- The set of group names is open-ended, though in practice
    @@ -18,7 +18,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
       -- with particular permissions. A user will have the combined
       -- permissions of any group they're explicitly in, plus
       -- the implicit '*' and 'user' groups.
    -  ug_group char(16) NOT NULL default '',
    +  ug_group varbinary(16) NOT NULL default '',
       
       PRIMARY KEY (ug_user,ug_group),
       KEY (ug_group)
    diff --git a/maintenance/archives/patch-user_newpass_time.sql b/maintenance/archives/patch-user_newpass_time.sql
    index 47b332ba..c323f238 100644
    --- a/maintenance/archives/patch-user_newpass_time.sql
    +++ b/maintenance/archives/patch-user_newpass_time.sql
    @@ -1,4 +1,4 @@
     -- Timestamp of the last time when a new password was
     -- sent, for throttling purposes
    -ALTER TABLE /*$wgDBprefix*/user ADD user_newpass_time char(14) binary;
    +ALTER TABLE /*$wgDBprefix*/user ADD user_newpass_time binary(14);
     
    diff --git a/maintenance/archives/patch-user_registration.sql b/maintenance/archives/patch-user_registration.sql
    index 65fd99df..906a6954 100644
    --- a/maintenance/archives/patch-user_registration.sql
    +++ b/maintenance/archives/patch-user_registration.sql
    @@ -6,4 +6,4 @@
     ALTER TABLE /*$wgDBprefix*/user
       -- Timestamp of account registration.
       -- Accounts predating this schema addition may contain NULL.
    -  ADD user_registration CHAR(14) BINARY;
    +  ADD user_registration binary(14);
    diff --git a/maintenance/archives/patch-user_rights.sql b/maintenance/archives/patch-user_rights.sql
    index 4c6846e0..9866654c 100644
    --- a/maintenance/archives/patch-user_rights.sql
    +++ b/maintenance/archives/patch-user_rights.sql
    @@ -7,7 +7,7 @@
     
     CREATE TABLE /*$wgDBprefix*/user_rights (
       -- Key to user_id
    -  ur_user int(5) unsigned NOT NULL,
    +  ur_user int unsigned NOT NULL,
       
       -- Comma-separated list of permission keys
       ur_rights tinyblob NOT NULL,
    diff --git a/maintenance/archives/patch-user_token.sql b/maintenance/archives/patch-user_token.sql
    index 797dc98f..a3eb0bfd 100644
    --- a/maintenance/archives/patch-user_token.sql
    +++ b/maintenance/archives/patch-user_token.sql
    @@ -1,7 +1,7 @@
     -- user_token patch
     -- 2004-09-23
     
    -ALTER TABLE /*$wgDBprefix*/user ADD user_token char(32) binary NOT NULL default '';
    +ALTER TABLE /*$wgDBprefix*/user ADD user_token  binary(32) NOT NULL default '';
     
     UPDATE /*$wgDBprefix*/user SET user_token = concat(
     	substring(rand(),3,4),
    diff --git a/maintenance/archives/patch-userlevels-defaultgroups.sql b/maintenance/archives/patch-userlevels-defaultgroups.sql
    index 065653da..e69de29b 100644
    --- a/maintenance/archives/patch-userlevels-defaultgroups.sql
    +++ b/maintenance/archives/patch-userlevels-defaultgroups.sql
    @@ -1,30 +0,0 @@
    ---
    --- Provide default groups
    --- Should probably be inserted when someone create a new database
    ---
    -
    -INSERT INTO /*$wgDBprefix*/groups (gr_id,gr_name,gr_description,gr_rights)
    -	VALUES (
    -		1,':group-anon-name',':group-anon-desc',
    -		'read,edit,createaccount'
    -	);
    -INSERT INTO /*$wgDBprefix*/groups (gr_id,gr_name,gr_description,gr_rights)
    -	VALUES (
    -		2,':group-loggedin-name',':group-loggedin-desc',
    -		'read,edit,move,upload,validate,createaccount'
    -	);
    -INSERT INTO /*$wgDBprefix*/groups (gr_id,gr_name,gr_description,gr_rights)
    -	VALUES (
    -		3,':group-admin-name',':group-admin-desc',
    -		'read,edit,move,upload,validate,createaccount,delete,undelete,protect,block,upload,asksql,rollback,patrol,editinterface,import'
    -	);
    -INSERT INTO /*$wgDBprefix*/groups (gr_id,gr_name,gr_description,gr_rights)
    -	VALUES (
    -		4,':group-bureaucrat-name',':group-bureaucrat-desc',
    -		'read,edit,move,upload,validate,createaccount,delete,undelete,protect,block,upload,asksql,rollback,patrol,editinterface,import,makesysop'
    -	);
    -INSERT INTO /*$wgDBprefix*/groups (gr_id,gr_name,gr_description,gr_rights)
    -	VALUES (
    -		5,':group-steward-name',':group-steward-desc',
    -		'read,edit,move,upload,validate,createaccount,delete,undelete,protect,block,upload,asksql,rollback,patrol,editinterface,import,makesysop,userrights,grouprights,siteadmin'
    -	);
    diff --git a/maintenance/archives/patch-userlevels-rights.sql b/maintenance/archives/patch-userlevels-rights.sql
    index 7f1cabfc..e69de29b 100644
    --- a/maintenance/archives/patch-userlevels-rights.sql
    +++ b/maintenance/archives/patch-userlevels-rights.sql
    @@ -1,5 +0,0 @@
    --- Oct. 24 2004
    --- Adds the gr_rights field missing from early dev work
    -
    --- Hold group name and description
    -ALTER TABLE /*$wgDBprefix*/groups ADD gr_rights tinyblob;
    diff --git a/maintenance/archives/patch-userlevels.sql b/maintenance/archives/patch-userlevels.sql
    index 17ff3c5d..399d6cb2 100644
    --- a/maintenance/archives/patch-userlevels.sql
    +++ b/maintenance/archives/patch-userlevels.sql
    @@ -1,22 +1,8 @@
    --- Oct. 1st 2004 - Ashar Voultoiz
    --- Implement the new sitelevels
    ---
    --- This is under development to provide a showcase in HEAD :o)
    -
    --- Hold group name and description
    -CREATE TABLE /*$wgDBprefix*/groups (
    -  gr_id int(5) unsigned NOT NULL auto_increment,
    -  gr_name varchar(50) NOT NULL default '',
    -  gr_description varchar(255) NOT NULL default '',
    -  gr_rights tinyblob,
    -  PRIMARY KEY  (gr_id)
    -
    -) /*$wgDBTableOptions*/;
     
     -- Relation table between user and groups
     CREATE TABLE /*$wgDBprefix*/user_groups (
    -	ug_user int(5) unsigned NOT NULL default '0',
    -	ug_group int(5) unsigned NOT NULL default '0',
    +	ug_user int unsigned NOT NULL default '0',
    +	ug_group varbinary(16) NOT NULL default '0',
     	PRIMARY KEY  (ug_user,ug_group)
    -
    +  KEY (ug_group)
     ) /*$wgDBTableOptions*/;
    diff --git a/maintenance/archives/patch-usernewtalk.sql b/maintenance/archives/patch-usernewtalk.sql
    index fb8c8655..34fae946 100644
    --- a/maintenance/archives/patch-usernewtalk.sql
    +++ b/maintenance/archives/patch-usernewtalk.sql
    @@ -5,11 +5,11 @@
     --- required and therefore dropped.
     
     CREATE TABLE /*$wgDBprefix*/user_newtalk (
    -  user_id int(5) NOT NULL default '0',
    -  user_ip varchar(40) NOT NULL default '',
    +  user_id int NOT NULL default '0',
    +  user_ip varbinary(40) NOT NULL default '',
       KEY user_id (user_id),
       KEY user_ip (user_ip)
    -) TYPE=MyISAM;
    +) /*$wgDBTableOptions*/;
     
     INSERT INTO
       /*$wgDBprefix*/user_newtalk (user_id, user_ip)
    diff --git a/maintenance/archives/patch-usernewtalk2.sql b/maintenance/archives/patch-usernewtalk2.sql
    index 477109b7..e69de29b 100644
    --- a/maintenance/archives/patch-usernewtalk2.sql
    +++ b/maintenance/archives/patch-usernewtalk2.sql
    @@ -1,6 +0,0 @@
    -CREATE TABLE /*$wgDBprefix*/user_newtalk (
    - user_id int(5) NOT NULL default '0',
    - user_ip varchar(40) NOT NULL default '',
    - INDEX user_id (user_id),
    - INDEX user_ip (user_ip)
    -);
    diff --git a/maintenance/archives/patch-watchlist-null.sql b/maintenance/archives/patch-watchlist-null.sql
    index 37ffc163..d4869a02 100644
    --- a/maintenance/archives/patch-watchlist-null.sql
    +++ b/maintenance/archives/patch-watchlist-null.sql
    @@ -2,7 +2,7 @@
     -- 2005-08-17
     
     ALTER TABLE /*$wgDBprefix*/watchlist
    -  CHANGE wl_notificationtimestamp wl_notificationtimestamp varchar(14) binary;
    +  CHANGE wl_notificationtimestamp wl_notificationtimestamp varbinary(14);
     
     UPDATE /*$wgDBprefix*/watchlist
       SET wl_notificationtimestamp=NULL
    diff --git a/maintenance/archives/patch-watchlist.sql b/maintenance/archives/patch-watchlist.sql
    index adee010b..83826b72 100644
    --- a/maintenance/archives/patch-watchlist.sql
    +++ b/maintenance/archives/patch-watchlist.sql
    @@ -10,11 +10,11 @@
     
     DROP TABLE IF EXISTS watchlist2;
     CREATE TABLE watchlist2 (
    -  wl_user int(5) unsigned NOT NULL,
    -  wl_namespace tinyint(2) unsigned NOT NULL default '0',
    +  wl_user int unsigned NOT NULL,
    +  wl_namespace int unsigned NOT NULL default '0',
       wl_title varchar(255) binary NOT NULL default '',
       UNIQUE KEY (wl_user, wl_namespace, wl_title)
    -) TYPE=MyISAM PACK_KEYS=1;
    +) /*$wgDBTableOptions*/;
     
     INSERT INTO watchlist2 (wl_user,wl_namespace,wl_title)
       SELECT DISTINCT wl_user,(cur_namespace | 1) - 1,cur_title
    diff --git a/maintenance/tables.sql b/maintenance/tables.sql
    index 5d8b5481..f7217692 100644
    --- a/maintenance/tables.sql
    +++ b/maintenance/tables.sql
    @@ -15,7 +15,7 @@
     --
     --
     -- The MySQL table backend for MediaWiki currently uses
    --- 14-character CHAR or VARCHAR fields to store timestamps.
    +-- 14-character BINARY or VARBINARY fields to store timestamps.
     -- The format is YYYYMMDDHHMMSS, which is derived from the
     -- text format of MySQL's TIMESTAMP fields.
     --
    @@ -49,7 +49,7 @@
     -- tables.
     --
     CREATE TABLE /*$wgDBprefix*/user (
    -  user_id int(5) unsigned NOT NULL auto_increment,
    +  user_id int unsigned NOT NULL auto_increment,
       
       -- Usernames must be unique, must not be in the form of
       -- an IP address. _Shouldn't_ allow slashes or case
    @@ -76,7 +76,7 @@ CREATE TABLE /*$wgDBprefix*/user (
       
       -- Timestamp of the last time when a new password was
       -- sent, for throttling purposes
    -  user_newpass_time char(14) binary,
    +  user_newpass_time binary(14),
     
       -- Note: email should be restricted, not public info.
       -- Same with passwords.
    @@ -90,29 +90,29 @@ CREATE TABLE /*$wgDBprefix*/user (
       -- logs in, logs out, changes preferences, or performs
       -- some other action requiring HTML cache invalidation
       -- to ensure that the UI is updated.
    -  user_touched char(14) binary NOT NULL default '',
    +  user_touched binary(14) NOT NULL default '',
       
       -- A pseudorandomly generated value that is stored in
       -- a cookie when the "remember password" feature is
       -- used (previously, a hash of the password was used, but
       -- this was vulnerable to cookie-stealing attacks)
    -  user_token char(32) binary NOT NULL default '',
    +  user_token binary(32) NOT NULL default '',
       
       -- Initially NULL; when a user's e-mail address has been
       -- validated by returning with a mailed token, this is
       -- set to the current timestamp.
    -  user_email_authenticated char(14) binary,
    +  user_email_authenticated binary(14),
       
       -- Randomly generated token created when the e-mail address
       -- is set and a confirmation test mail sent.
    -  user_email_token char(32) binary,
    +  user_email_token binary(32),
       
       -- Expiration date for the user_email_token
    -  user_email_token_expires char(14) binary,
    +  user_email_token_expires binary(14),
       
       -- Timestamp of account registration.
       -- Accounts predating this schema addition may contain NULL.
    -  user_registration char(14) binary,
    +  user_registration binary(14),
       
       -- Count of edits and edit-like actions.
       --
    @@ -142,7 +142,7 @@ CREATE TABLE /*$wgDBprefix*/user (
     --
     CREATE TABLE /*$wgDBprefix*/user_groups (
       -- Key to user_id
    -  ug_user int(5) unsigned NOT NULL default '0',
    +  ug_user int unsigned NOT NULL default '0',
       
       -- Group names are short symbolic string keys.
       -- The set of group names is open-ended, though in practice
    @@ -152,7 +152,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
       -- with particular permissions. A user will have the combined
       -- permissions of any group they're explicitly in, plus
       -- the implicit '*' and 'user' groups.
    -  ug_group char(16) NOT NULL default '',
    +  ug_group varbinary(16) NOT NULL default '',
       
       PRIMARY KEY (ug_user,ug_group),
       KEY (ug_group)
    @@ -162,10 +162,10 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
     -- of the "you have new messages" box
     CREATE TABLE /*$wgDBprefix*/user_newtalk (
       -- Key to user.user_id
    -  user_id int(5) NOT NULL default '0',
    +  user_id int NOT NULL default '0',
       -- If the user is an anonymous user their IP address is stored here
       -- since the user_id of 0 is ambiguous
    -  user_ip varchar(40) NOT NULL default '',
    +  user_ip varbinary(40) NOT NULL default '',
       INDEX user_id (user_id),
       INDEX user_ip (user_ip)
     
    @@ -179,7 +179,7 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
     CREATE TABLE /*$wgDBprefix*/page (
       -- Unique identifier number. The page_id will be preserved across
       -- edits and rename operations, but not deletions and recreations.
    -  page_id int(8) unsigned NOT NULL auto_increment,
    +  page_id int unsigned NOT NULL auto_increment,
       
       -- A page name is broken into a namespace and a title.
       -- The namespace keys are UI-language-independent constants,
    @@ -195,14 +195,14 @@ CREATE TABLE /*$wgDBprefix*/page (
       page_restrictions tinyblob NOT NULL,
       
       -- Number of times this page has been viewed.
    -  page_counter bigint(20) unsigned NOT NULL default '0',
    +  page_counter bigint unsigned NOT NULL default '0',
       
       -- 1 indicates the article is a redirect.
    -  page_is_redirect tinyint(1) unsigned NOT NULL default '0',
    +  page_is_redirect tinyint unsigned NOT NULL default '0',
       
       -- 1 indicates this is a new entry, with only one edit.
       -- Not all pages with one edit are new pages.
    -  page_is_new tinyint(1) unsigned NOT NULL default '0',
    +  page_is_new tinyint unsigned NOT NULL default '0',
       
       -- Random value between 0 and 1, used for Special:Randompage
       page_random real unsigned NOT NULL,
    @@ -212,15 +212,15 @@ CREATE TABLE /*$wgDBprefix*/page (
       -- Aside from editing this includes permission changes,
       -- creation or deletion of linked pages, and alteration
       -- of contained templates.
    -  page_touched char(14) binary NOT NULL default '',
    +  page_touched binary(14) NOT NULL default '',
     
       -- Handy key to revision.rev_id of the current revision.
       -- This may be 0 during page creation, but that shouldn't
       -- happen outside of a transaction... hopefully.
    -  page_latest int(8) unsigned NOT NULL,
    +  page_latest int unsigned NOT NULL,
       
       -- Uncompressed length in bytes of the page's current source text.
    -  page_len int(8) unsigned NOT NULL,
    +  page_len int unsigned NOT NULL,
     
       PRIMARY KEY page_id (page_id),
       UNIQUE INDEX name_title (page_namespace,page_title),
    @@ -237,16 +237,16 @@ CREATE TABLE /*$wgDBprefix*/page (
     -- to the text storage backend.
     --
     CREATE TABLE /*$wgDBprefix*/revision (
    -  rev_id int(8) unsigned NOT NULL auto_increment,
    +  rev_id int unsigned NOT NULL auto_increment,
       
       -- Key to page_id. This should _never_ be invalid.
    -  rev_page int(8) unsigned NOT NULL,
    +  rev_page int unsigned NOT NULL,
       
       -- Key to text.old_id, where the actual bulk text is stored.
       -- It's possible for multiple revisions to use the same text,
       -- for instance revisions where only metadata is altered
       -- or a rollback to a previous version.
    -  rev_text_id int(8) unsigned NOT NULL,
    +  rev_text_id int unsigned NOT NULL,
       
       -- Text comment summarizing the change.
       -- This text is shown in the history and other changes lists,
    @@ -255,27 +255,27 @@ CREATE TABLE /*$wgDBprefix*/revision (
       
       -- Key to user.user_id of the user who made this edit.
       -- Stores 0 for anonymous edits and for some mass imports.
    -  rev_user int(5) unsigned NOT NULL default '0',
    +  rev_user int unsigned NOT NULL default '0',
       
       -- Text username or IP address of the editor.
       rev_user_text varchar(255) binary NOT NULL default '',
       
       -- Timestamp
    -  rev_timestamp char(14) binary NOT NULL default '',
    +  rev_timestamp binary(14) NOT NULL default '',
       
       -- Records whether the user marked the 'minor edit' checkbox.
       -- Many automated edits are marked as minor.
    -  rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
    +  rev_minor_edit tinyint unsigned NOT NULL default '0',
       
       -- Not yet used; reserved for future changes to the deletion system.
    -  rev_deleted tinyint(1) unsigned NOT NULL default '0',
    +  rev_deleted tinyint unsigned NOT NULL default '0',
       
       -- Length of this revision in bytes
    -  rev_len int(8) unsigned,
    +  rev_len int unsigned,
     
       -- Key to revision.rev_id
       -- This field is used to add support for a tree structure (The Adjacency List Model)
    -  rev_parent_id int(8) unsigned default NULL,
    +  rev_parent_id int unsigned default NULL,
     
       PRIMARY KEY rev_page_id (rev_page, rev_id),
       UNIQUE INDEX rev_id (rev_id),
    @@ -301,7 +301,7 @@ CREATE TABLE /*$wgDBprefix*/text (
       -- refer to this number anymore, but to rev_id.
       --
       -- revision.rev_text_id is a key to this column
    -  old_id int(8) unsigned NOT NULL auto_increment,
    +  old_id int unsigned NOT NULL auto_increment,
       
       -- Depending on the contents of the old_flags field, the text
       -- may be convenient plain text, or it may be funkily encoded.
    @@ -343,10 +343,10 @@ CREATE TABLE /*$wgDBprefix*/archive (
       
       -- Basic revision stuff...
       ar_comment tinyblob NOT NULL,
    -  ar_user int(5) unsigned NOT NULL default '0',
    +  ar_user int unsigned NOT NULL default '0',
       ar_user_text varchar(255) binary NOT NULL,
    -  ar_timestamp char(14) binary NOT NULL default '',
    -  ar_minor_edit tinyint(1) NOT NULL default '0',
    +  ar_timestamp binary(14) NOT NULL default '',
    +  ar_minor_edit tinyint NOT NULL default '0',
       
       -- See ar_text note.
       ar_flags tinyblob NOT NULL,
    @@ -358,7 +358,7 @@ CREATE TABLE /*$wgDBprefix*/archive (
       -- 
       -- Old entries from 1.4 will be NULL here, and a new rev_id will
       -- be created on undeletion for those revisions.
    -  ar_rev_id int(8) unsigned,
    +  ar_rev_id int unsigned,
       
       -- For newly deleted revisions, this is the text.old_id key to the
       -- actual stored text. To avoid breaking the block-compression scheme
    @@ -369,13 +369,13 @@ CREATE TABLE /*$wgDBprefix*/archive (
       -- Old entries deleted under 1.2-1.4 will have NULL here, and their
       -- ar_text and ar_flags fields will be used to create a new text
       -- row upon undeletion.
    -  ar_text_id int(8) unsigned,
    +  ar_text_id int unsigned,
     
       -- rev_deleted for archives
    -  ar_deleted tinyint(1) unsigned NOT NULL default '0',
    +  ar_deleted tinyint unsigned NOT NULL default '0',
     
       -- Length of this revision in bytes
    -  ar_len int(8) unsigned,
    +  ar_len int unsigned,
       
       KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
     
    @@ -387,7 +387,7 @@ CREATE TABLE /*$wgDBprefix*/archive (
     --
     CREATE TABLE /*$wgDBprefix*/pagelinks (
       -- Key to the page_id of the page containing the link.
    -  pl_from int(8) unsigned NOT NULL default '0',
    +  pl_from int unsigned NOT NULL default '0',
       
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    @@ -407,7 +407,7 @@ CREATE TABLE /*$wgDBprefix*/pagelinks (
     --
     CREATE TABLE /*$wgDBprefix*/templatelinks (
       -- Key to the page_id of the page containing the link.
    -  tl_from int(8) unsigned NOT NULL default '0',
    +  tl_from int unsigned NOT NULL default '0',
       
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    @@ -428,7 +428,7 @@ CREATE TABLE /*$wgDBprefix*/templatelinks (
     --
     CREATE TABLE /*$wgDBprefix*/imagelinks (
       -- Key to page_id of the page containing the image / media link.
    -  il_from int(8) unsigned NOT NULL default '0',
    +  il_from int unsigned NOT NULL default '0',
       
       -- Filename of target image.
       -- This is also the page_title of the file's description page;
    @@ -447,7 +447,7 @@ CREATE TABLE /*$wgDBprefix*/imagelinks (
     --
     CREATE TABLE /*$wgDBprefix*/categorylinks (
       -- Key to page_id of the page defined as a category member.
    -  cl_from int(8) unsigned NOT NULL default '0',
    +  cl_from int unsigned NOT NULL default '0',
       
       -- Name of the category.
       -- This is also the page_title of the category's description page;
    @@ -460,11 +460,9 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
       -- and dangerous new world in MySQL... The sortkey is updated
       -- if no override exists and cl_from is renamed.
       --
    -  -- For MySQL 4.1+ with charset set to utf8, the sort key *index*
    -  -- needs cut to be smaller than 1024 bytes (at 3 bytes per char).
    -  -- To sort properly on the shorter key, this field needs to be
    -  -- the same shortness.
    -  cl_sortkey varchar(86) binary NOT NULL default '',
    +  -- Truncate so that the cl_sortkey key fits in 1000 bytes 
    +  -- (MyISAM 5 with server_character_set=utf8)
    +  cl_sortkey varchar(70) binary NOT NULL default '',
       
       -- This isn't really used at present. Provided for an optional
       -- sorting method by approximate addition time.
    @@ -485,7 +483,7 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
     --
     CREATE TABLE /*$wgDBprefix*/externallinks (
       -- page_id of the referring page
    -  el_from int(8) unsigned NOT NULL default '0',
    +  el_from int unsigned NOT NULL default '0',
     
       -- The URL
       el_to blob NOT NULL,
    @@ -513,10 +511,10 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
     --
     CREATE TABLE /*$wgDBprefix*/langlinks (
       -- page_id of the referring page
    -  ll_from int(8) unsigned NOT NULL default '0',
    +  ll_from int unsigned NOT NULL default '0',
       
       -- Language code of the target
    -  ll_lang varchar(10) binary NOT NULL default '',
    +  ll_lang varbinary(20) NOT NULL default '',
     
       -- Title of the target, including namespace
       ll_title varchar(255) binary NOT NULL default '',
    @@ -531,32 +529,32 @@ CREATE TABLE /*$wgDBprefix*/langlinks (
     --
     CREATE TABLE /*$wgDBprefix*/site_stats (
       -- The single row should contain 1 here.
    -  ss_row_id int(8) unsigned NOT NULL,
    +  ss_row_id int unsigned NOT NULL,
       
       -- Total number of page views, if hit counters are enabled.
    -  ss_total_views bigint(20) unsigned default '0',
    +  ss_total_views bigint unsigned default '0',
       
       -- Total number of edits performed.
    -  ss_total_edits bigint(20) unsigned default '0',
    +  ss_total_edits bigint unsigned default '0',
       
       -- An approximate count of pages matching the following criteria:
       -- * in namespace 0
       -- * not a redirect
       -- * contains the text '[['
       -- See Article::isCountable() in includes/Article.php
    -  ss_good_articles bigint(20) unsigned default '0',
    +  ss_good_articles bigint unsigned default '0',
       
       -- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
    -  ss_total_pages bigint(20) default '-1',
    +  ss_total_pages bigint default '-1',
     
       -- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
    -  ss_users bigint(20) default '-1',
    +  ss_users bigint default '-1',
     
       -- Deprecated, no longer updated as of 1.5
    -  ss_admins int(10) default '-1',
    +  ss_admins int default '-1',
     
       -- Number of images, equivalent to SELECT COUNT(*) FROM image
    -  ss_images int(10) default '0',
    +  ss_images int default '0',
     
       UNIQUE KEY ss_row_id (ss_row_id)
     
    @@ -580,23 +578,23 @@ CREATE TABLE /*$wgDBprefix*/hitcounter (
     --
     CREATE TABLE /*$wgDBprefix*/ipblocks (
       -- Primary key, introduced for privacy.
    -  ipb_id int(8) NOT NULL auto_increment,
    +  ipb_id int NOT NULL auto_increment,
       
       -- Blocked IP address in dotted-quad form or user name.
       ipb_address tinyblob NOT NULL,
       
       -- Blocked user ID or 0 for IP blocks.
    -  ipb_user int(8) unsigned NOT NULL default '0',
    +  ipb_user int unsigned NOT NULL default '0',
       
       -- User ID who made the block.
    -  ipb_by int(8) unsigned NOT NULL default '0',
    +  ipb_by int unsigned NOT NULL default '0',
       
       -- Text comment made by blocker.
       ipb_reason tinyblob NOT NULL,
       
       -- Creation (or refresh) date in standard YMDHMS form.
       -- IP blocks expire automatically.
    -  ipb_timestamp char(14) binary NOT NULL default '',
    +  ipb_timestamp binary(14) NOT NULL default '',
       
       -- Indicates that the IP address was banned because a banned
       -- user accessed a page through it. If this is 1, ipb_address
    @@ -613,7 +611,8 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
       ipb_enable_autoblock bool NOT NULL default '1',
       
       -- Time at which the block will expire.
    -  ipb_expiry char(14) binary NOT NULL default '',
    +  -- May be "infinity"
    +  ipb_expiry varbinary(14) NOT NULL default '',
       
       -- Start and end of an address range, in hexadecimal
       -- Size chosen to allow IPv6
    @@ -647,17 +646,17 @@ CREATE TABLE /*$wgDBprefix*/image (
       img_name varchar(255) binary NOT NULL default '',
       
       -- File size in bytes.
    -  img_size int(8) unsigned NOT NULL default '0',
    +  img_size int unsigned NOT NULL default '0',
       
       -- For images, size in pixels.
    -  img_width int(5) NOT NULL default '0',
    -  img_height int(5) NOT NULL default '0',
    +  img_width int NOT NULL default '0',
    +  img_height int NOT NULL default '0',
       
       -- Extracted EXIF metadata stored as a serialized PHP array.
       img_metadata mediumblob NOT NULL,
       
       -- For images, bits per pixel if known.
    -  img_bits int(3) NOT NULL default '0',
    +  img_bits int NOT NULL default '0',
       
       -- Media type as defined by the MEDIATYPE_xxx constants
       img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
    @@ -670,18 +669,18 @@ CREATE TABLE /*$wgDBprefix*/image (
       -- the minor parts are not required to adher to any standard
       -- but should be consistent throughout the database
       -- see http://www.iana.org/assignments/media-types/
    -  img_minor_mime varchar(32) NOT NULL default "unknown",
    +  img_minor_mime varbinary(32) NOT NULL default "unknown",
       
       -- Description field as entered by the uploader.
       -- This is displayed in image upload history and logs.
       img_description tinyblob NOT NULL,
       
       -- user_id and user_name of uploader.
    -  img_user int(5) unsigned NOT NULL default '0',
    +  img_user int unsigned NOT NULL default '0',
       img_user_text varchar(255) binary NOT NULL,
       
       -- Time of the upload.
    -  img_timestamp char(14) binary NOT NULL default '',
    +  img_timestamp varbinary(14) NOT NULL default '',
       
       PRIMARY KEY img_name (img_name),
       
    @@ -707,14 +706,14 @@ CREATE TABLE /*$wgDBprefix*/oldimage (
       oi_archive_name varchar(255) binary NOT NULL default '',
       
       -- Other fields as in image...
    -  oi_size int(8) unsigned NOT NULL default 0,
    -  oi_width int(5) NOT NULL default 0,
    -  oi_height int(5) NOT NULL default 0,
    -  oi_bits int(3) NOT NULL default 0,
    +  oi_size int unsigned NOT NULL default 0,
    +  oi_width int NOT NULL default 0,
    +  oi_height int NOT NULL default 0,
    +  oi_bits int NOT NULL default 0,
       oi_description tinyblob NOT NULL,
    -  oi_user int(5) unsigned NOT NULL default '0',
    +  oi_user int unsigned NOT NULL default '0',
       oi_user_text varchar(255) binary NOT NULL,
    -  oi_timestamp char(14) binary NOT NULL default '',
    +  oi_timestamp binary(14) NOT NULL default '',
     
       INDEX oi_name (oi_name(10))
     
    @@ -736,36 +735,36 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
       -- Which storage bin (directory tree or object store) the file data
       -- is stored in. Should be 'deleted' for files that have been deleted;
       -- any other bin is not yet in use.
    -  fa_storage_group varchar(16),
    +  fa_storage_group varbinary(16),
       
       -- SHA-1 of the file contents plus extension, used as a key for storage.
       -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
       --
       -- If NULL, the file was missing at deletion time or has been purged
       -- from the archival storage.
    -  fa_storage_key varchar(64) binary default '',
    +  fa_storage_key varbinary(64) default '',
       
       -- Deletion information, if this file is deleted.
       fa_deleted_user int,
    -  fa_deleted_timestamp char(14) binary default '',
    +  fa_deleted_timestamp binary(14) default '',
       fa_deleted_reason text,
       
       -- Duped fields from image
    -  fa_size int(8) unsigned default '0',
    -  fa_width int(5) default '0',
    -  fa_height int(5) default '0',
    +  fa_size int unsigned default '0',
    +  fa_width int default '0',
    +  fa_height int default '0',
       fa_metadata mediumblob,
    -  fa_bits int(3) default '0',
    +  fa_bits int default '0',
       fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
       fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
    -  fa_minor_mime varchar(32) default "unknown",
    +  fa_minor_mime varbinary(32) default "unknown",
       fa_description tinyblob,
    -  fa_user int(5) unsigned default '0',
    +  fa_user int unsigned default '0',
       fa_user_text varchar(255) binary,
    -  fa_timestamp char(14) binary default '',
    +  fa_timestamp binary(14) default '',
     
       -- Visibility of deleted revisions, bitfield
    -  fa_deleted tinyint(1) unsigned NOT NULL default '0',
    +  fa_deleted tinyint unsigned NOT NULL default '0',
       
       PRIMARY KEY (fa_id),
       INDEX (fa_name, fa_timestamp),             -- pick out by image name
    @@ -781,12 +780,12 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
     -- the last few days, see Article::editUpdates()
     --
     CREATE TABLE /*$wgDBprefix*/recentchanges (
    -  rc_id int(8) NOT NULL auto_increment,
    -  rc_timestamp varchar(14) binary NOT NULL default '',
    -  rc_cur_time varchar(14) binary NOT NULL default '',
    +  rc_id int NOT NULL auto_increment,
    +  rc_timestamp varbinary(14) NOT NULL default '',
    +  rc_cur_time varbinary(14) NOT NULL default '',
       
       -- As in revision
    -  rc_user int(10) unsigned NOT NULL default '0',
    +  rc_user int unsigned NOT NULL default '0',
       rc_user_text varchar(255) binary NOT NULL,
       
       -- When pages are renamed, their RC entries do _not_ change.
    @@ -795,55 +794,55 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
       
       -- as in revision...
       rc_comment varchar(255) binary NOT NULL default '',
    -  rc_minor tinyint(3) unsigned NOT NULL default '0',
    +  rc_minor tinyint unsigned NOT NULL default '0',
       
       -- Edits by user accounts with the 'bot' rights key are
       -- marked with a 1 here, and will be hidden from the
       -- default view.
    -  rc_bot tinyint(3) unsigned NOT NULL default '0',
    +  rc_bot tinyint unsigned NOT NULL default '0',
       
    -  rc_new tinyint(3) unsigned NOT NULL default '0',
    +  rc_new tinyint unsigned NOT NULL default '0',
       
       -- Key to page_id (was cur_id prior to 1.5).
       -- This will keep links working after moves while
       -- retaining the at-the-time name in the changes list.
    -  rc_cur_id int(10) unsigned NOT NULL default '0',
    +  rc_cur_id int unsigned NOT NULL default '0',
       
       -- rev_id of the given revision
    -  rc_this_oldid int(10) unsigned NOT NULL default '0',
    +  rc_this_oldid int unsigned NOT NULL default '0',
       
       -- rev_id of the prior revision, for generating diff links.
    -  rc_last_oldid int(10) unsigned NOT NULL default '0',
    +  rc_last_oldid int unsigned NOT NULL default '0',
       
       -- These may no longer be used, with the new move log.
    -  rc_type tinyint(3) unsigned NOT NULL default '0',
    -  rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
    +  rc_type tinyint unsigned NOT NULL default '0',
    +  rc_moved_to_ns tinyint unsigned NOT NULL default '0',
       rc_moved_to_title varchar(255) binary NOT NULL default '',
       
       -- If the Recent Changes Patrol option is enabled,
       -- users may mark edits as having been reviewed to
       -- remove a warning flag on the RC list.
       -- A value of 1 indicates the page has been reviewed.
    -  rc_patrolled tinyint(3) unsigned NOT NULL default '0',
    +  rc_patrolled tinyint unsigned NOT NULL default '0',
       
       -- Recorded IP address the edit was made from, if the
       -- $wgPutIPinRC option is enabled.
    -  rc_ip char(15) NOT NULL default '',
    +  rc_ip varbinary(40) NOT NULL default '',
       
       -- Text length in characters before
       -- and after the edit
    -  rc_old_len int(10),
    -  rc_new_len int(10),
    +  rc_old_len int,
    +  rc_new_len int,
     
       -- Visibility of deleted revisions, bitfield
    -  rc_deleted tinyint(1) unsigned NOT NULL default '0',
    +  rc_deleted tinyint unsigned NOT NULL default '0',
     
       -- Value corresonding to log_id, specific log entries
    -  rc_logid int(10) unsigned NOT NULL default '0',
    +  rc_logid int unsigned NOT NULL default '0',
       -- Store log type info here, or null
    -  rc_log_type varchar(255) binary NULL default NULL,
    +  rc_log_type varbinary(255) NULL default NULL,
       -- Store log action or null
    -  rc_log_action varchar(255) binary NULL default NULL,
    +  rc_log_action varbinary(255) NULL default NULL,
       -- Log params
       rc_params blob NOT NULL default '',
       
    @@ -860,7 +859,7 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
     
     CREATE TABLE /*$wgDBprefix*/watchlist (
       -- Key to user.user_id
    -  wl_user int(5) unsigned NOT NULL,
    +  wl_user int unsigned NOT NULL,
       
       -- Key to page_namespace/page_title
       -- Note that users may watch pages which do not exist yet,
    @@ -870,7 +869,7 @@ CREATE TABLE /*$wgDBprefix*/watchlist (
       
       -- Timestamp when user was last sent a notification e-mail;
       -- cleared when the user visits the page.
    -  wl_notificationtimestamp varchar(14) binary,
    +  wl_notificationtimestamp varbinary(14),
       
       UNIQUE KEY (wl_user, wl_namespace, wl_title),
       KEY namespace_title (wl_namespace, wl_title)
    @@ -884,14 +883,14 @@ CREATE TABLE /*$wgDBprefix*/watchlist (
     --
     CREATE TABLE /*$wgDBprefix*/math (
       -- Binary MD5 hash of the latex fragment, used as an identifier key.
    -  math_inputhash varchar(16) NOT NULL,
    +  math_inputhash varbinary(16) NOT NULL,
       
       -- Not sure what this is, exactly...
    -  math_outputhash varchar(16) NOT NULL,
    +  math_outputhash varbinary(16) NOT NULL,
       
       -- texvc reports how well it thinks the HTML conversion worked;
       -- if it's a low level the PNG rendering may be preferred.
    -  math_html_conservativeness tinyint(1) NOT NULL,
    +  math_html_conservativeness tinyint NOT NULL,
       
       -- HTML output from texvc, if any
       math_html text,
    @@ -913,7 +912,7 @@ CREATE TABLE /*$wgDBprefix*/math (
     --
     CREATE TABLE /*$wgDBprefix*/searchindex (
       -- Key to page_id
    -  si_page int(8) unsigned NOT NULL,
    +  si_page int unsigned NOT NULL,
       
       -- Munged version of title
       si_title varchar(255) NOT NULL default '',
    @@ -932,19 +931,19 @@ CREATE TABLE /*$wgDBprefix*/searchindex (
     --
     CREATE TABLE /*$wgDBprefix*/interwiki (
       -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
    -  iw_prefix char(32) NOT NULL,
    +  iw_prefix varchar(32) NOT NULL,
       
       -- The URL of the wiki, with "$1" as a placeholder for an article name.
       -- Any spaces in the name will be transformed to underscores before
       -- insertion.
    -  iw_url char(127) NOT NULL,
    +  iw_url blob NOT NULL,
       
       -- A boolean value indicating whether the wiki is in this project
       -- (used, for example, to detect redirect loops)
       iw_local bool NOT NULL,
       
       -- Boolean value indicating whether interwiki transclusions are allowed.
    -  iw_trans tinyint(1) NOT NULL default 0,
    +  iw_trans tinyint NOT NULL default 0,
       
       UNIQUE KEY iw_prefix (iw_prefix)
     
    @@ -955,10 +954,10 @@ CREATE TABLE /*$wgDBprefix*/interwiki (
     --
     CREATE TABLE /*$wgDBprefix*/querycache (
       -- A key name, generally the base name of of the special page.
    -  qc_type char(32) NOT NULL,
    +  qc_type varbinary(32) NOT NULL,
       
       -- Some sort of stored value. Sizes, counts...
    -  qc_value int(5) unsigned NOT NULL default '0',
    +  qc_value int unsigned NOT NULL default '0',
       
       -- Target namespace+title
       qc_namespace int NOT NULL default '0',
    @@ -972,7 +971,7 @@ CREATE TABLE /*$wgDBprefix*/querycache (
     -- For a few generic cache operations if not using Memcached
     --
     CREATE TABLE /*$wgDBprefix*/objectcache (
    -  keyname char(255) binary NOT NULL default '',
    +  keyname varbinary(255) NOT NULL default '',
       value mediumblob,
       exptime datetime,
       UNIQUE KEY (keyname),
    @@ -984,7 +983,7 @@ CREATE TABLE /*$wgDBprefix*/objectcache (
     -- Cache of interwiki transclusion
     --
     CREATE TABLE /*$wgDBprefix*/transcache (
    -  tc_url varchar(255) NOT NULL,
    +  tc_url varbinary(255) NOT NULL,
       tc_contents text,
       tc_time int NOT NULL,
       UNIQUE INDEX tc_url_idx (tc_url)
    @@ -994,11 +993,11 @@ CREATE TABLE /*$wgDBprefix*/logging (
       -- Symbolic keys for the general log type and the action type
       -- within the log. The output format will be controlled by the
       -- action field, but only the type controls categorization.
    -  log_type char(10) NOT NULL default '',
    -  log_action char(10) NOT NULL default '',
    +  log_type varbinary(10) NOT NULL default '',
    +  log_action varbinary(10) NOT NULL default '',
       
       -- Timestamp. Duh.
    -  log_timestamp char(14) NOT NULL default '19700101000000',
    +  log_timestamp binary(14) NOT NULL default '19700101000000',
       
       -- The user who performed this action; key to user_id
       log_user int unsigned NOT NULL default 0,
    @@ -1018,7 +1017,7 @@ CREATE TABLE /*$wgDBprefix*/logging (
       log_id int unsigned NOT NULL auto_increment,
     
       -- rev_deleted for logs
    -  log_deleted tinyint(1) unsigned NOT NULL default '0',
    +  log_deleted tinyint unsigned NOT NULL default '0',
     
       PRIMARY KEY log_id (log_id),
       KEY type_time (log_type, log_timestamp),
    @@ -1032,7 +1031,7 @@ CREATE TABLE /*$wgDBprefix*/trackbacks (
       tb_id int auto_increment,
       tb_page int REFERENCES page(page_id) ON DELETE CASCADE,
       tb_title varchar(255) NOT NULL,
    -  tb_url varchar(255) NOT NULL,
    +  tb_url blob NOT NULL,
       tb_ex text,
       tb_name varchar(255),
     
    @@ -1043,10 +1042,11 @@ CREATE TABLE /*$wgDBprefix*/trackbacks (
     
     -- Jobs performed by parallel apache threads or a command-line daemon
     CREATE TABLE /*$wgDBprefix*/job (
    -  job_id int(9) unsigned NOT NULL auto_increment,
    +  job_id int unsigned NOT NULL auto_increment,
       
    -  -- Command name, currently only refreshLinks is defined
    -  job_cmd varchar(255) NOT NULL default '',
    +  -- Command name
    +  -- Limited to 60 to prevent key length overflow
    +  job_cmd varbinary(60) NOT NULL default '',
     
       -- Namespace and title to act on
       -- Should be 0 and '' if the command does not operate on a title
    @@ -1067,10 +1067,10 @@ CREATE TABLE /*$wgDBprefix*/querycache_info (
     
       -- Special page name
       -- Corresponds to a qc_type value
    -  qci_type varchar(32) NOT NULL default '',
    +  qci_type varbinary(32) NOT NULL default '',
     
       -- Timestamp of last update
    -  qci_timestamp char(14) NOT NULL default '19700101000000',
    +  qci_timestamp binary(14) NOT NULL default '19700101000000',
     
       UNIQUE KEY ( qci_type )
     
    @@ -1079,7 +1079,7 @@ CREATE TABLE /*$wgDBprefix*/querycache_info (
     -- For each redirect, this table contains exactly one row defining its target
     CREATE TABLE /*$wgDBprefix*/redirect (
       -- Key to the page_id of the redirect page
    -  rd_from int(8) unsigned NOT NULL default '0',
    +  rd_from int unsigned NOT NULL default '0',
     
       -- Key to page_namespace/page_title of the target page.
       -- The target page may or may not exist, and due to renames
    @@ -1095,10 +1095,10 @@ CREATE TABLE /*$wgDBprefix*/redirect (
     -- Used for caching expensive grouped queries that need two links (for example double-redirects)
     CREATE TABLE /*$wgDBprefix*/querycachetwo (
       -- A key name, generally the base name of of the special page.
    -  qcc_type char(32) NOT NULL,
    +  qcc_type varbinary(32) NOT NULL,
       
       -- Some sort of stored value. Sizes, counts...
    -  qcc_value int(5) unsigned NOT NULL default '0',
    +  qcc_value int unsigned NOT NULL default '0',
       
       -- Target namespace+title
       qcc_namespace int NOT NULL default '0',
    @@ -1117,17 +1117,17 @@ CREATE TABLE /*$wgDBprefix*/querycachetwo (
     --- Used for storing page restrictions (i.e. protection levels)
     CREATE TABLE /*$wgDBprefix*/page_restrictions (
       -- Page to apply restrictions to (Foreign Key to page).
    -  pr_page int(8) NOT NULL,
    +  pr_page int NOT NULL,
       -- The protection type (edit, move, etc)
    -  pr_type varchar(255) NOT NULL,
    +  pr_type varbinary(60) NOT NULL,
       -- The protection level (Sysop, autoconfirmed, etc)
    -  pr_level varchar(255) NOT NULL,
    +  pr_level varbinary(60) NOT NULL,
       -- Whether or not to cascade the protection down to pages transcluded.
    -  pr_cascade tinyint(4) NOT NULL,
    +  pr_cascade tinyint NOT NULL,
       -- Field for future support of per-user restriction.
    -  pr_user int(8) NULL,
    +  pr_user int NULL,
       -- Field for time-limited protection.
    -  pr_expiry char(14) binary NULL,
    +  pr_expiry varbinary(14) NULL,
       -- Field for an ID for this restrictions row (sort-key for Special:ProtectedPages)
       pr_id int unsigned NOT NULL auto_increment,
     
    diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc
    index b3fb16f4..023a6b4b 100644
    --- a/maintenance/updaters.inc
    +++ b/maintenance/updaters.inc
    @@ -1159,7 +1159,7 @@ END;
     }
     
     function do_postgres_updates() {
    -	global $wgDatabase, $wgVersion, $wgDBmwschema, $wgShowExceptionDetails;
    +	global $wgDatabase, $wgVersion, $wgDBmwschema, $wgDBts2schema, $wgShowExceptionDetails, $wgDBuser;
     
     	$wgShowExceptionDetails = 1;
     
    @@ -1167,6 +1167,41 @@ function do_postgres_updates() {
     	if ( !isset( $wgDBmwschema ))
     		$wgDBmwschema = 'mediawiki';
     
    +	# Verify that this user is configured correctly
    +	$safeuser = $wgDatabase->addQuotes($wgDBuser);
    +	$SQL = "SELECT array_to_string(useconfig,'*') FROM pg_user WHERE usename = $safeuser";
    +	$config = pg_fetch_result( $wgDatabase->doQuery( $SQL ), 0, 0 );
    +	$conf = array();
    +	foreach( explode( '*', $config ) as $c ) {
    +		list( $x,$y ) = explode( '=', $c );
    +		$conf[$x] = $y;
    +	}
    +	$newpath = array();
    +	if( !array_key_exists( 'search_path', $conf ) or strpos( $conf['search_path'],$wgDBmwschema ) === false ) {
    +		print "Adding in schema \"$wgDBmwschema\" to search_path for user \"$wgDBuser\"\n";
    +		$newpath[$wgDBmwschema] = 1;
    +	}
    +	if( !array_key_exists( 'search_path', $conf ) or strpos( $conf['search_path'],$wgDBts2schema ) === false ) {
    +		print "Adding in schema \"$wgDBts2schema\" to search_path for user \"$wgDBuser\"\n";
    +		$newpath[$wgDBts2schema] = 1;
    +	}
    +	$searchpath = implode( ',', array_keys( $newpath ) );
    +	if( strlen( $searchpath ) ) {
    +		$wgDatabase->doQuery( "ALTER USER $wgDBuser SET search_path = $searchpath" );
    +	}
    +	$goodconf = array(
    +		'client_min_messages' => 'error',
    +		'DateStyle'           => 'ISO, YMD',
    +		'TimeZone'            => 'GMT'
    +	);
    +	foreach( array_keys( $goodconf ) AS $key ) {
    +		$value = $goodconf[$key];
    +		if( !array_key_exists( $key, $conf ) or $conf[$key] !== $value ) {
    +			print "Setting $key to '$value' for user \"$wgDBuser\"\n";
    +			$wgDatabase->doQuery( "ALTER USER $wgDBuser SET $key = '$value'" );
    +		}
    +	}
    +
     	$newsequences = array(
     		"log_log_id_seq",
     		"pr_id_val",
    @@ -1227,7 +1262,6 @@ function do_postgres_updates() {
     	$newrules = array(
     	);
     
    -
     	foreach ($newsequences as $ns) {
     		if ($wgDatabase->sequenceExists($ns)) {
     			echo "... sequence $ns already exists\n";
    -- 
    cgit v1.2.3-54-g00ecf