| Keys and identity |
IDENTITY |
MySQL generates keys from a column attribute rather than from a seed and increment declared on the table. |
The primary key is created as AUTO_INCREMENT and reseeded above the highest loaded value, so the application's next insert does not collide with a migrated row. |
UNIQUEIDENTIFIER |
MySQL has no GUID type, so the value has to be stored as text or as bytes. |
Created as CHAR(36) holding the same digits and dashes SQL Server shows, so a GUID compared as a string still matches. Choose BINARY(16) in the review when you would rather have the compact form. |
| Numbers |
BIT |
SQL Server's BIT is a one-bit column; MySQL's boolean is an integer. |
Converted to TINYINT(1), which is what MySQL clients read back as a boolean. |
MONEY, SMALLMONEY |
MySQL has no money type. Mapping either one to a floating-point column would round amounts that have to stay exact. |
Both land on fixed-point DECIMAL - MONEY as DECIMAL(19,4) and SMALLMONEY as DECIMAL(10,4) - keeping the four decimal places and the full range of each. |
| Date and time |
DATETIME2, TIME |
SQL Server stores up to 100 ns; MySQL stores fractional seconds only when the column declares how many, and stops at microseconds. |
The declared scale comes across, capped at the six digits MySQL supports: DATETIME2(7) becomes DATETIME(6) and TIME(7) becomes TIME(6). A column declared with no fraction stays without one. |
DATETIMEOFFSET |
The value carries a UTC offset with it. MySQL has no type that stores one, so the offset has to go somewhere or the instant stops being knowable. |
Converted to UTC and written as DATETIME(6), so every row means the same instant it meant before. Rows from different zones become directly comparable, which they were not in the source. |
| Text |
NVARCHAR, NCHAR |
SQL Server keeps Unicode in the N types and everything else in the database's code page, where anything outside it was already lost before the migration started. |
The destination is created as utf8mb4, so Cyrillic, CJK and emoji arrive byte for byte. A VARCHAR column that lost characters to its own code page arrives exactly as it reads in SQL Server - the migration neither repairs that nor makes it worse. |
NVARCHAR(max), VARCHAR(max) |
The max forms hold up to 2 GB, which no bounded MySQL character type can take. |
Created as LONGTEXT. |
XML |
MySQL has no XML type, and the source stores the document as UTF-16 rather than as bytes in the target's charset. |
Transcoded and written to LONGTEXT, so the document stays readable text that MySQL's own string and ExtractValue functions can work on. |
| Structure |
| Schemas |
SQL Server nests schemas inside a database; in MySQL the database is the namespace, so dbo.Orders and sales.Orders would collide. |
Schemas collapse into the MySQL database, or the schema name is folded into a table-name prefix when you want the separation to stay visible. |
| Identifier quoting |
SQL Server quotes reserved or spaced names with brackets, which MySQL does not accept. |
Bracketed identifiers such as [Order] are rewritten into MySQL backtick form, and every destination name stays editable in the review. |
| Views |
A view is stored SQL, and the two dialects disagree on function names, quoting, and paging syntax. |
View definitions are translated between the two dialects in both directions - SQL Server and MySQL is one of only three pairs with two-way translation. See views translation for what is covered. |