<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Satyam Gupta</title>
    <description>The latest articles on DEV Community by Satyam Gupta (@satyamgupta1495).</description>
    <link>https://dev.to/satyamgupta1495</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F494388%2F0d93f865-8f47-492d-8a1b-5bb223e62740.jpeg</url>
      <title>DEV Community: Satyam Gupta</title>
      <link>https://dev.to/satyamgupta1495</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/satyamgupta1495"/>
    <language>en</language>
    <item>
      <title>I Thought MSSQL and MySQL Were the Same. I Was Wrong.</title>
      <dc:creator>Satyam Gupta</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:03:13 +0000</pubDate>
      <link>https://dev.to/satyamgupta1495/i-thought-mssql-and-mysql-were-the-same-i-was-wrong-201d</link>
      <guid>https://dev.to/satyamgupta1495/i-thought-mssql-and-mysql-were-the-same-i-was-wrong-201d</guid>
      <description>&lt;p&gt;If you've worked with SQL, you've probably looked at Microsoft SQL Server and MySQL and thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"They're both SQL databases. How different can they really be?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was more or less how I thought about them.&lt;/p&gt;

&lt;p&gt;At first, the differences seemed simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL Server&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;versus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL Server&lt;/span&gt;
&lt;span class="n"&gt;GETDATE&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;versus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL&lt;/span&gt;
&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then there are things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IDENTITY       → AUTO_INCREMENT
ISNULL()       → IFNULL()
dbo.Users      → database.Users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Easy enough, right?&lt;/p&gt;

&lt;p&gt;Not quite.&lt;/p&gt;

&lt;p&gt;While working with an existing ASP.NET MVC application backed by Microsoft SQL Server, I started comparing the database layer with MySQL.&lt;/p&gt;

&lt;p&gt;That's when I realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MSSQL and MySQL don't just have different SQL syntax. They make different architectural, indexing, transaction, storage, security, and operational choices.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this matters a lot when you're migrating an existing application.&lt;/p&gt;

&lt;p&gt;Especially if you're thinking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET → NestJS
MSSQL  → MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are actually &lt;strong&gt;two different migrations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don't have to do both.&lt;/p&gt;

&lt;p&gt;This article explains what I learned while looking beyond SQL syntax and comparing the two databases from a developer's perspective.&lt;/p&gt;




&lt;h2&gt;
  
  
  First: SQL Isn't MSSQL or MySQL
&lt;/h2&gt;

&lt;p&gt;Before comparing the databases, it's worth clearing up one common misconception.&lt;/p&gt;

&lt;p&gt;SQL is a language standard.&lt;/p&gt;

&lt;p&gt;MSSQL and MySQL are database systems that implement SQL, along with their own features and syntax.&lt;/p&gt;

&lt;p&gt;A simplified way to think about it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    SQL
                     │
          ┌──────────┴──────────┐
          │                     │
      SQL Server              MySQL
          │                     │
        T-SQL          MySQL-specific SQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both databases understand concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt;
&lt;span class="k"&gt;DELETE&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So if you know SQL, you're not starting from zero when moving between them.&lt;/p&gt;

&lt;p&gt;But SQL gives you the common language.&lt;/p&gt;

&lt;p&gt;The database gives you the implementation.&lt;/p&gt;

&lt;p&gt;That's where things start getting interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  MSSQL vs MySQL at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;MSSQL / SQL Server&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL dialect&lt;/td&gt;
&lt;td&gt;T-SQL&lt;/td&gt;
&lt;td&gt;MySQL SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default port&lt;/td&gt;
&lt;td&gt;1433&lt;/td&gt;
&lt;td&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common ecosystem&lt;/td&gt;
&lt;td&gt;.NET, Microsoft/Azure&lt;/td&gt;
&lt;td&gt;Web, PHP, Node.js, Linux/cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema model&lt;/td&gt;
&lt;td&gt;Database → Schema → Object&lt;/td&gt;
&lt;td&gt;Database/schema → Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage architecture&lt;/td&gt;
&lt;td&gt;SQL Server Database Engine&lt;/td&gt;
&lt;td&gt;Pluggable storage engines; InnoDB is the default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactions&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported by InnoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stored procedures&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Views&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triggers&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text search&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clustered indexes&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;InnoDB organizes table data around a clustered primary-key index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open-source ecosystem&lt;/td&gt;
&lt;td&gt;Depends on SQL Server edition/product&lt;/td&gt;
&lt;td&gt;Strong open-source ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One important detail here is the storage architecture.&lt;/p&gt;

&lt;p&gt;MySQL has multiple storage engines, while &lt;strong&gt;InnoDB is the default storage engine in MySQL 8.4&lt;/strong&gt; and provides transactions, row-level locking, foreign keys, crash recovery, and clustered primary-key organization.&lt;/p&gt;

&lt;p&gt;So even something as fundamental as "how a table is physically organized" isn't something you should assume is identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Database vs Schema: One of the First Things That Confused Me
&lt;/h2&gt;

&lt;p&gt;This is one of the easiest places to get confused when moving from SQL Server to MySQL.&lt;/p&gt;

&lt;p&gt;In SQL Server, you commonly have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL Server Instance
        │
        ▼
     Database
        │
        ▼
      Schema
        │
        ▼
      Table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;propertyhive
    │
    └── dbo
         │
         ├── Users
         ├── Properties
         └── Agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So you might write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dbo = schema
Users = table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In MySQL, the terminology works differently.&lt;/p&gt;

&lt;p&gt;A MySQL database is effectively the namespace containing tables and other objects. MySQL documentation commonly uses "database" and "schema" interchangeably.&lt;/p&gt;

&lt;p&gt;You might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;propertyhive
    │
    ├── Users
    ├── Properties
    └── Agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;propertyhive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is &lt;strong&gt;not something you can blindly translate into:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in MySQL.&lt;/p&gt;

&lt;p&gt;You first have to understand what &lt;code&gt;dbo&lt;/code&gt; represented in the original SQL Server application.&lt;/p&gt;

&lt;p&gt;This becomes particularly important during migration because schema-qualified objects can appear everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Properties&lt;/span&gt;
&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetPropertyDetails&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vwUserwiseRatings&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you simply search and replace syntax, you're going to miss the architectural meaning behind those references.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Obvious Differences: SQL Syntax
&lt;/h2&gt;

&lt;p&gt;Let's get the easy stuff out of the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  TOP vs LIMIT
&lt;/h2&gt;

&lt;p&gt;SQL Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For pagination, SQL Server commonly uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;UserId&lt;/span&gt;
&lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt;
&lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt; &lt;span class="k"&gt;ONLY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;UserId&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The concepts are similar.&lt;/p&gt;

&lt;p&gt;The syntax isn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  IDENTITY vs AUTO_INCREMENT
&lt;/h2&gt;

&lt;p&gt;SQL Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both can automatically generate numeric IDs.&lt;/p&gt;

&lt;p&gt;But they're implemented differently.&lt;/p&gt;

&lt;p&gt;That difference becomes important when you start dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing data&lt;/li&gt;
&lt;li&gt;Seed scripts&lt;/li&gt;
&lt;li&gt;Explicit ID insertion&lt;/li&gt;
&lt;li&gt;ORM mappings&lt;/li&gt;
&lt;li&gt;Last-generated IDs&lt;/li&gt;
&lt;li&gt;Sequences&lt;/li&gt;
&lt;li&gt;Migration tooling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Date and Time Functions
&lt;/h2&gt;

&lt;p&gt;Here's another common translation.&lt;/p&gt;

&lt;p&gt;SQL Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;GETDATE&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UTC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL Server&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;GETUTCDATE&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;UTC_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Date arithmetic also differs.&lt;/p&gt;

&lt;p&gt;SQL Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;DATEADD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GETDATE&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;DATE_ADD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The underlying concept is identical:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Give me a date seven days from now."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the database-specific expression is different.&lt;/p&gt;

&lt;p&gt;This is one reason automated SQL conversion can help with migration but cannot replace testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. NULL Functions Aren't Always the Same
&lt;/h2&gt;

&lt;p&gt;SQL Server commonly uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ISNULL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL commonly uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;IFNULL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both can provide a fallback when a value is &lt;code&gt;NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But there's an important lesson here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never assume similarly named functions have identical type-conversion behavior.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, SQL Server also supports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and MySQL supports it too.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COALESCE()&lt;/code&gt; is part of standard SQL and is often preferable when you want an expression that can work across multiple database systems.&lt;/p&gt;

&lt;p&gt;Still, portability shouldn't be your only concern. You should understand the behavior of the actual database you're running.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Even String Length Isn't Identical
&lt;/h2&gt;

&lt;p&gt;SQL Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;LEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there's a catch.&lt;/p&gt;

&lt;p&gt;In MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns the length in &lt;strong&gt;bytes&lt;/strong&gt;, while:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CHAR_LENGTH&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns the number of characters.&lt;/p&gt;

&lt;p&gt;So for multilingual text, these can produce different results.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mumbai'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;CHAR_LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mumbai'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may appear equivalent for simple ASCII text.&lt;/p&gt;

&lt;p&gt;But once you start working with Unicode characters or emojis, the distinction becomes important.&lt;/p&gt;

&lt;p&gt;Which brings us to one of the most underestimated migration problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Unicode: &lt;code&gt;NVARCHAR&lt;/code&gt; vs &lt;code&gt;utf8mb4&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Suppose your application stores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mumbai
मुंबई
தமிழ்நாடு
東京
🏠
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't want your migration to turn that into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;???
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL Server has historically distinguished Unicode types such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;NVARCHAR&lt;/span&gt;
&lt;span class="nb"&gt;NCHAR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL uses character sets and collations.&lt;/p&gt;

&lt;p&gt;For modern MySQL applications, &lt;code&gt;utf8mb4&lt;/code&gt; is the important character set to understand.&lt;/p&gt;

&lt;p&gt;The key difference in thinking is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL Server
    ↓
Unicode-aware data types

MySQL
    ↓
Character set + collation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't merely a syntax problem.&lt;/p&gt;

&lt;p&gt;It can affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Names&lt;/li&gt;
&lt;li&gt;Property descriptions&lt;/li&gt;
&lt;li&gt;Locality names&lt;/li&gt;
&lt;li&gt;City names&lt;/li&gt;
&lt;li&gt;User-generated content&lt;/li&gt;
&lt;li&gt;Emojis&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Equality comparisons&lt;/li&gt;
&lt;li&gt;Data migration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're migrating a property application, for example, a locality might contain multilingual data.&lt;/p&gt;

&lt;p&gt;That's something you should test explicitly rather than assuming the database will handle it automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Collation Can Change Your Application's Behavior
&lt;/h2&gt;

&lt;p&gt;Here's a surprisingly important difference.&lt;/p&gt;

&lt;p&gt;Imagine the database contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mumbai
mumbai
MUMBAI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your application executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;City&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'mumbai'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What should happen?&lt;/p&gt;

&lt;p&gt;Does it match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mumbai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;only?&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mumbai
mumbai
MUMBAI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer depends on the database's collation and the specific column/expression involved.&lt;/p&gt;

&lt;p&gt;Collation affects things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Case sensitivity&lt;/li&gt;
&lt;li&gt;Accent sensitivity&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Comparison&lt;/li&gt;
&lt;li&gt;Searching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can create a particularly nasty migration bug.&lt;/p&gt;

&lt;p&gt;Your application works perfectly in SQL Server.&lt;/p&gt;

&lt;p&gt;You migrate the data.&lt;/p&gt;

&lt;p&gt;Then a search behaves differently in MySQL.&lt;/p&gt;

&lt;p&gt;Nothing looks wrong in the query.&lt;/p&gt;

&lt;p&gt;The difference is in the database configuration.&lt;/p&gt;

&lt;p&gt;That's why &lt;strong&gt;collation should be part of your migration checklist&lt;/strong&gt;, not an afterthought.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Data Types: Don't Treat Them as Simple 1:1 Mappings
&lt;/h2&gt;

&lt;p&gt;Here's where migration starts getting more interesting.&lt;/p&gt;

&lt;p&gt;A basic mapping might look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SQL Server&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BIGINT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BIGINT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VARCHAR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VARCHAR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NVARCHAR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;VARCHAR&lt;/code&gt; + appropriate character set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DECIMAL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DECIMAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BOOLEAN&lt;/code&gt; / &lt;code&gt;TINYINT(1)&lt;/code&gt; commonly used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DATETIME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DATETIME&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UNIQUEIDENTIFIER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Often &lt;code&gt;CHAR(36)&lt;/code&gt; / &lt;code&gt;BINARY(16)&lt;/code&gt; depending on design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JSON&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;JSON&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The problem is that a table definition isn't just a list of names.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Both databases have DECIMAL, so we're done."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You still need to validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precision&lt;/li&gt;
&lt;li&gt;Scale&lt;/li&gt;
&lt;li&gt;Range&lt;/li&gt;
&lt;li&gt;Default values&lt;/li&gt;
&lt;li&gt;Nullability&lt;/li&gt;
&lt;li&gt;ORM mapping&lt;/li&gt;
&lt;li&gt;Existing data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same applies to dates, UUIDs, booleans, binary data, and text.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Storage Engines: MySQL Has Another Layer You Need to Understand
&lt;/h2&gt;

&lt;p&gt;This is one of the conceptual differences I didn't appreciate initially.&lt;/p&gt;

&lt;p&gt;SQL Server is built around the SQL Server Database Engine.&lt;/p&gt;

&lt;p&gt;MySQL, on the other hand, has a storage-engine architecture.&lt;/p&gt;

&lt;p&gt;You can encounter engines such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;InnoDB
MyISAM
MEMORY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For modern transactional applications, &lt;strong&gt;InnoDB is the important one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MySQL 8.4 uses InnoDB as its default storage engine. InnoDB provides ACID transactions, row-level locking, foreign keys, crash recovery, and clustered primary-key organization.&lt;/p&gt;

&lt;p&gt;So when you're comparing SQL Server with MySQL, you're not just comparing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL Server
vs
MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're also comparing different database architectures and implementation choices.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Indexes: This Is Where "Just Convert the SQL" Really Breaks Down
&lt;/h2&gt;

&lt;p&gt;Indexes are one of the biggest reasons you can't treat migration as a search-and-replace exercise.&lt;/p&gt;

&lt;p&gt;In SQL Server, you can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clustered indexes&lt;/li&gt;
&lt;li&gt;Nonclustered indexes&lt;/li&gt;
&lt;li&gt;Included columns&lt;/li&gt;
&lt;li&gt;Filtered indexes&lt;/li&gt;
&lt;li&gt;Columnstore indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;NONCLUSTERED&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;IX_Users_Email&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;INCLUDE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CreatedAt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Included columns can make an index cover a query so SQL Server doesn't need to fetch additional data from the underlying table.&lt;/p&gt;

&lt;p&gt;SQL Server also supports filtered indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;IX_ActiveUsers&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;IsActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a very different indexing feature from simply creating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in MySQL.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. MySQL/InnoDB Indexing Works Differently
&lt;/h2&gt;

&lt;p&gt;InnoDB organizes table data around the primary key's clustered index.&lt;/p&gt;

&lt;p&gt;That means the primary key isn't just another secondary lookup structure in the same conceptual sense.&lt;/p&gt;

&lt;p&gt;InnoDB also has secondary indexes.&lt;/p&gt;

&lt;p&gt;So this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;has architectural consequences for how the table is organized and how secondary indexes locate rows.&lt;/p&gt;

&lt;p&gt;MySQL documentation explicitly describes the InnoDB primary key index as the clustered index and explains that secondary indexes reference the primary-key value.&lt;/p&gt;

&lt;p&gt;This is why blindly copying an MSSQL indexing strategy into MySQL is a bad idea.&lt;/p&gt;

&lt;p&gt;You should ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What queries do we actually run?

What columns are filtered?

What columns are sorted?

What are the cardinalities?

What is the primary key?

How does the target database optimize this workload?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then design the indexes for the target database.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. The Same Query Can Have Completely Different Performance
&lt;/h2&gt;

&lt;p&gt;This is another misconception worth killing.&lt;/p&gt;

&lt;p&gt;Suppose you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;CityId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;IsActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You run it in SQL Server.&lt;/p&gt;

&lt;p&gt;Then you migrate the database to MySQL and run essentially the same query.&lt;/p&gt;

&lt;p&gt;Should it have the same execution time?&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;The optimizer is different.&lt;/p&gt;

&lt;p&gt;The indexes may be different.&lt;/p&gt;

&lt;p&gt;Statistics may be different.&lt;/p&gt;

&lt;p&gt;Data distribution may be different.&lt;/p&gt;

&lt;p&gt;Configuration may be different.&lt;/p&gt;

&lt;p&gt;The storage architecture may be different.&lt;/p&gt;

&lt;p&gt;The execution plan may be different.&lt;/p&gt;

&lt;p&gt;In SQL Server, you might inspect the execution plan and statistics through SQL Server tooling.&lt;/p&gt;

&lt;p&gt;In MySQL, you can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to investigate query execution.&lt;/p&gt;

&lt;p&gt;MySQL's documentation emphasizes that indexes should be designed around the actual workload because unnecessary indexes consume space and add write overhead.&lt;/p&gt;

&lt;p&gt;The lesson is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never migrate an index strategy based only on the old database's schema. Re-test the workload on the new database.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  13. Transactions Are More Than BEGIN and COMMIT
&lt;/h2&gt;

&lt;p&gt;Most developers know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- operations&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ROLLBACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But transactions involve much more than those commands.&lt;/p&gt;

&lt;p&gt;They involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolation&lt;/li&gt;
&lt;li&gt;Locking&lt;/li&gt;
&lt;li&gt;Concurrency&lt;/li&gt;
&lt;li&gt;Deadlocks&lt;/li&gt;
&lt;li&gt;Visibility of changes&lt;/li&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SQL Server supports isolation levels including:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SNAPSHOT
SERIALIZABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and its behavior can also be affected by database-level options such as &lt;code&gt;READ_COMMITTED_SNAPSHOT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;InnoDB also has its own transaction and locking model, using row-level locking and consistent nonlocking reads.&lt;/p&gt;

&lt;p&gt;So if your application contains something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create property
    ↓
Create property images
    ↓
Create property metadata
    ↓
Update search index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;inside a transaction, you need to verify the behavior after migration.&lt;/p&gt;

&lt;p&gt;Don't assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Both support transactions, so we're good."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They both support transactions.&lt;/p&gt;

&lt;p&gt;That doesn't mean every concurrency scenario behaves identically.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Deadlocks Don't Magically Disappear After Migration
&lt;/h2&gt;

&lt;p&gt;Consider two requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request A
    locks Property 1
    then wants Property 2

Request B
    locks Property 2
    then wants Property 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can end up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A → waits for B
B → waits for A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a deadlock.&lt;/p&gt;

&lt;p&gt;Different databases have different locking implementations and behaviors.&lt;/p&gt;

&lt;p&gt;SQL Server can use row, page, or table locks depending on circumstances, and lock escalation can occur.&lt;/p&gt;

&lt;p&gt;InnoDB uses row-level locking as part of its transaction model and does not use lock escalation in the same way.&lt;/p&gt;

&lt;p&gt;So when migrating a high-traffic application, transaction tests should include concurrent requests, not just happy-path unit tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Stored Procedures: This Is Where Migration Can Become Painful
&lt;/h2&gt;

&lt;p&gt;Suppose your SQL Server application has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetProperties&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;CityId&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Properties&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;CityId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;CityId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can't simply paste that into MySQL.&lt;/p&gt;

&lt;p&gt;The procedural syntax is different.&lt;/p&gt;

&lt;p&gt;SQL Server uses T-SQL.&lt;/p&gt;

&lt;p&gt;MySQL has its own stored-program syntax.&lt;/p&gt;

&lt;p&gt;And the problem isn't just syntax.&lt;/p&gt;

&lt;p&gt;Existing procedures may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Temporary tables&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Cursors&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Transactions&lt;/li&gt;
&lt;li&gt;Dynamic SQL&lt;/li&gt;
&lt;li&gt;SQL Server functions&lt;/li&gt;
&lt;li&gt;Table hints&lt;/li&gt;
&lt;li&gt;SQL Server-specific system objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;SCOPE_IDENTITY&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;has no direct "copy this exact line" equivalent.&lt;/p&gt;

&lt;p&gt;MySQL commonly uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;LAST_INSERT_ID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after an auto-increment insert.&lt;/p&gt;

&lt;p&gt;The same business requirement exists.&lt;/p&gt;

&lt;p&gt;The implementation differs.&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Should You Keep Stored Procedures or Move Logic to NestJS?
&lt;/h2&gt;

&lt;p&gt;This is where migration becomes an architectural decision.&lt;/p&gt;

&lt;p&gt;Imagine your current system looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET MVC
     │
     ▼
Stored Procedures
     │
     ▼
MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When moving to NestJS, you could choose:&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A — Keep database logic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS
   │
   ▼
MSSQL
   │
   ▼
Stored Procedures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B — Move logic into NestJS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS
   │
   ▼
Service / Repository
   │
   ▼
MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option C — Hybrid
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS
   │
   ├── Application logic
   │
   └── Critical DB operations
             │
             ▼
       Stored Procedures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There isn't one universally correct answer.&lt;/p&gt;

&lt;p&gt;It depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing business logic&lt;/li&gt;
&lt;li&gt;Team expertise&lt;/li&gt;
&lt;li&gt;Performance requirements&lt;/li&gt;
&lt;li&gt;Migration timeline&lt;/li&gt;
&lt;li&gt;Testing coverage&lt;/li&gt;
&lt;li&gt;Long-term architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is also why I wouldn't automatically combine an ASP.NET-to-NestJS migration with an MSSQL-to-MySQL migration.&lt;/p&gt;

&lt;p&gt;You're multiplying the variables you're changing at once.&lt;/p&gt;




&lt;h2&gt;
  
  
  17. Views, Functions and Triggers Need Migration Attention Too
&lt;/h2&gt;

&lt;p&gt;A database isn't just tables.&lt;/p&gt;

&lt;p&gt;An existing SQL Server application may contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tables
Views
Stored Procedures
Functions
Triggers
Indexes
Constraints
Jobs
Permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vwUserwiseRatings&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;RegisteredUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CONVERT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ISNULL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rating&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;Rating&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;RegisteredUsersRatings&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;IsActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;IsApproved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;RegisteredUserId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if the underlying tables migrate successfully, this view still needs review.&lt;/p&gt;

&lt;p&gt;You have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dbo
CONVERT()
ISNULL()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and SQL Server-specific syntax.&lt;/p&gt;

&lt;p&gt;A migration isn't finished when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tables = migrated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's finished when the application's &lt;strong&gt;database behavior&lt;/strong&gt; has been validated.&lt;/p&gt;




&lt;h2&gt;
  
  
  18. JSON Support Is Similar in Concept, Different in Implementation
&lt;/h2&gt;

&lt;p&gt;Both databases support JSON.&lt;/p&gt;

&lt;p&gt;SQL Server provides JSON functionality including:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;
&lt;span class="n"&gt;OPENJSON&lt;/span&gt;
&lt;span class="n"&gt;JSON_VALUE&lt;/span&gt;
&lt;span class="n"&gt;JSON_QUERY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL Server documentation describes &lt;code&gt;FOR JSON&lt;/code&gt; as a way to format query results as JSON directly from the database.&lt;/p&gt;

&lt;p&gt;SQL Server also supports indexing JSON-derived values through techniques such as computed columns and indexes.&lt;/p&gt;

&lt;p&gt;MySQL has native JSON functionality as well, including JSON extraction and indexing options.&lt;/p&gt;

&lt;p&gt;MySQL 8.4 also supports multi-valued indexes for JSON arrays.&lt;/p&gt;

&lt;p&gt;So again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Both support JSON
        ≠
Same JSON implementation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your application stores property metadata as JSON, test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inserts&lt;/li&gt;
&lt;li&gt;Updates&lt;/li&gt;
&lt;li&gt;Queries&lt;/li&gt;
&lt;li&gt;Null behavior&lt;/li&gt;
&lt;li&gt;Indexing&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;ORM mapping&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  19. Full-Text Search Is Another Feature You Need to Test
&lt;/h2&gt;

&lt;p&gt;Suppose your property application allows users to search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"2 BHK apartment near Mira Road"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may eventually use database full-text search.&lt;/p&gt;

&lt;p&gt;SQL Server has its own Full-Text Search implementation.&lt;/p&gt;

&lt;p&gt;MySQL/InnoDB supports &lt;code&gt;FULLTEXT&lt;/code&gt; indexes and uses syntax such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AGAINST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'apartment mira road'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL's InnoDB full-text implementation uses inverted indexes and has its own transaction and indexing behavior.&lt;/p&gt;

&lt;p&gt;So if the existing application relies on database-level full-text search, you can't assume the same search query and ranking behavior after migration.&lt;/p&gt;

&lt;p&gt;Search is application behavior.&lt;/p&gt;

&lt;p&gt;Treat it as such.&lt;/p&gt;




&lt;h2&gt;
  
  
  20. Permissions and Security Are Different Too
&lt;/h2&gt;

&lt;p&gt;Database security isn't just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username
password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL Server commonly separates concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Login
   ↓
Database User
   ↓
Role
   ↓
Permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL has its own account and privilege model.&lt;/p&gt;

&lt;p&gt;During migration, think about application accounts separately from human developer accounts.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
    ↓
Read/Write account

Reporting service
    ↓
Read-only account

Admin
    ↓
Administrative account
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal should be least privilege regardless of the database.&lt;/p&gt;

&lt;p&gt;Never migrate production credentials into source code or configuration files just because the old application did so.&lt;/p&gt;




&lt;h2&gt;
  
  
  21. Backup and Recovery Are Not Just "Take a Backup"
&lt;/h2&gt;

&lt;p&gt;This is another area where database migration becomes an operations problem.&lt;/p&gt;

&lt;p&gt;SQL Server has concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full backup
Differential backup
Transaction log backup
Recovery models
Point-in-time recovery
Always On
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL Server's recovery model affects transaction-log management and the types of restore operations available. The three recovery models are Simple, Full, and Bulk-logged.&lt;/p&gt;

&lt;p&gt;MySQL has a different ecosystem around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logical backups
Binary logs
Replication
Group Replication
InnoDB Cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important point isn't to memorize every feature.&lt;/p&gt;

&lt;p&gt;It's to recognize that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your backup and recovery strategy is part of your database architecture.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're migrating production infrastructure, you need to define:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is our RPO?
What is our RTO?
How do we restore?
How do we test restoration?
How do we recover from accidental deletes?
How do we perform point-in-time recovery?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A database migration without a rollback strategy is not a complete migration plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  22. Replication and High Availability
&lt;/h2&gt;

&lt;p&gt;Both SQL Server and MySQL support replication/high-availability architectures, but the technologies and operational models differ.&lt;/p&gt;

&lt;p&gt;SQL Server provides features such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Always On availability groups
Replication
Log shipping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL provides mechanisms such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Replication
Group Replication
InnoDB Cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL replication is based around the binary log, and MySQL documents several replication configurations and behaviors.&lt;/p&gt;

&lt;p&gt;The important thing is not to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which one scales better?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's too simplistic.&lt;/p&gt;

&lt;p&gt;Instead ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is my workload?

How many reads?

How many writes?

Do I need read replicas?

What is my failover requirement?

What downtime is acceptable?

What does my cloud provider support?

What does my team know how to operate?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database performance is workload-dependent.&lt;/p&gt;




&lt;h2&gt;
  
  
  23. So What Actually Happens During MSSQL → MySQL Migration?
&lt;/h2&gt;

&lt;p&gt;This is where everything above comes together.&lt;/p&gt;

&lt;p&gt;A naive migration plan looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Export MSSQL
      ↓
Import MySQL
      ↓
Change connection string
      ↓
Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real migrations look more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    MSSQL
                      │
        ┌─────────────┼─────────────┐
        │             │             │
      Tables        Views       Procedures
        │             │             │
      Types        Functions     Triggers
        │             │             │
     Indexes       Queries      Transactions
        │             │             │
        └─────────────┼─────────────┘
                      ↓
                 Analyze
                      ↓
                 Convert
                      ↓
                  Test
                      ↓
                Benchmark
                      ↓
                  Cutover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I'd add one more step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should always know how you're getting back if something goes wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  24. A Practical MSSQL → MySQL Migration Checklist
&lt;/h2&gt;

&lt;p&gt;Here's how I'd break down the analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Inventory the database
&lt;/h2&gt;

&lt;p&gt;Document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;☑ Tables
☑ Columns
☑ Primary keys
☑ Foreign keys
☑ Unique constraints
☑ Defaults
☑ Views
☑ Stored procedures
☑ Functions
☑ Triggers
☑ Indexes
☑ Full-text search
☑ JSON usage
☑ Scheduled jobs
☑ Permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Map data types
&lt;/h2&gt;

&lt;p&gt;Create a mapping such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL                  MySQL
----------------------------------
INT                    INT
BIGINT                 BIGINT
VARCHAR                VARCHAR
NVARCHAR               VARCHAR + utf8mb4
DECIMAL                DECIMAL
DATETIME               DATETIME
UNIQUEIDENTIFIER       CHAR/BINARY design
BIT                    BOOLEAN/TINYINT design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then validate every non-trivial type.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Analyze schemas
&lt;/h2&gt;

&lt;p&gt;Find every occurrence of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dbo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then determine whether it represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A SQL Server schema&lt;/li&gt;
&lt;li&gt;A naming convention&lt;/li&gt;
&lt;li&gt;An object namespace&lt;/li&gt;
&lt;li&gt;Something referenced by application code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't just replace it blindly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Convert database logic
&lt;/h2&gt;

&lt;p&gt;Review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Views
Procedures
Functions
Triggers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For every object ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can this be converted?

Should it be converted?

Should the logic move into NestJS?

Does it need to remain database-side?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Redesign indexes
&lt;/h2&gt;

&lt;p&gt;Don't do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL index
      ↓
Copy
      ↓
MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Existing query workload
        ↓
Analyze queries
        ↓
Design MySQL indexes
        ↓
EXPLAIN
        ↓
Benchmark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Test transactions
&lt;/h2&gt;

&lt;p&gt;Test real scenarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concurrent updates
Concurrent inserts
Rollback
Deadlocks
Isolation
Long-running transactions
Foreign-key failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7: Validate data
&lt;/h2&gt;

&lt;p&gt;Don't only check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Row count
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NULL values
Unicode
Dates
Decimals
IDs
Foreign keys
Duplicate values
Default values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL Users = 1,000,000
MySQL Users = 1,000,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;doesn't prove the migration is correct.&lt;/p&gt;

&lt;p&gt;You could still have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incorrect dates
Broken Unicode
Changed precision
Missing relationships
Different collation behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  25. The Part I Think Is Most Important: ASP.NET → NestJS Does NOT Mean MSSQL → MySQL
&lt;/h2&gt;

&lt;p&gt;This is the architectural distinction I wish more migration discussions made.&lt;/p&gt;

&lt;p&gt;Suppose your current system is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET MVC
     │
     ▼
   MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can absolutely build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS
   │
   ▼
  MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no requirement that changing the backend framework means changing the database.&lt;/p&gt;

&lt;p&gt;Likewise, you could keep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET MVC
     │
     ▼
   MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and migrate the database separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET MVC
     │
     ▼
   MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or migrate both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET MVC
     │
     ▼
   MSSQL

        ↓

NestJS
     │
     ▼
   MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All are technically possible.&lt;/p&gt;

&lt;p&gt;But the last option changes significantly more things at the same time.&lt;/p&gt;




&lt;h2&gt;
  
  
  26. Why I Wouldn't Automatically Do Both Migrations Together
&lt;/h2&gt;

&lt;p&gt;Imagine an API starts returning incorrect data after migration.&lt;/p&gt;

&lt;p&gt;You changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET → NestJS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL → MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have two major areas to investigate.&lt;/p&gt;

&lt;p&gt;Is the problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS business logic?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MySQL query?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ORM mapping?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database behavior?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data migration?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a lot of variables.&lt;/p&gt;

&lt;p&gt;Instead, a staged approach could be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Existing system

ASP.NET
   │
   ▼
 MSSQL

     ↓

NestJS
   │
   ▼
 MSSQL

     ↓

Test everything

     ↓

MSSQL
   │
   ▼
MySQL

     ↓

Test everything again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if something breaks during the second migration, you have a much smaller search space.&lt;/p&gt;

&lt;p&gt;This isn't a universal rule.&lt;/p&gt;

&lt;p&gt;There are situations where a combined migration makes sense.&lt;/p&gt;

&lt;p&gt;But if you can separate the changes, you often make debugging and rollback much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  27. A Migration Strategy I'd Actually Use
&lt;/h2&gt;

&lt;p&gt;If I were approaching an existing ASP.NET + MSSQL application, I'd consider something like this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1 — Understand
&lt;/h2&gt;

&lt;p&gt;Document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Controllers
Services
Repositories/DAL
Queries
Stored procedures
Views
Functions
Triggers
Indexes
Transactions
External integrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't migrate what you don't understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2 — Move the Backend
&lt;/h2&gt;

&lt;p&gt;Build the NestJS application while keeping MSSQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NestJS
   │
   ├── Controllers
   ├── Services
   ├── Repositories
   │
   ▼
 MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, you're primarily changing the application layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 3 — Validate
&lt;/h2&gt;

&lt;p&gt;Compare the old and new systems.&lt;/p&gt;

&lt;p&gt;Test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API responses
Authentication
Authorization
Business rules
Transactions
Errors
Edge cases
Performance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New backend + old database behaves like old backend + old database.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Phase 4 — Decide Whether MySQL Is Actually Needed
&lt;/h2&gt;

&lt;p&gt;Only after the backend migration is stable should you ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Why are we moving from MSSQL to MySQL?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible reasons might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure requirements&lt;/li&gt;
&lt;li&gt;Licensing/cost&lt;/li&gt;
&lt;li&gt;Existing team expertise&lt;/li&gt;
&lt;li&gt;Hosting strategy&lt;/li&gt;
&lt;li&gt;Application architecture&lt;/li&gt;
&lt;li&gt;Organizational standards&lt;/li&gt;
&lt;li&gt;Technical requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But "because we're using NestJS" isn't by itself a reason.&lt;/p&gt;

&lt;p&gt;NestJS can work with SQL Server.&lt;/p&gt;




&lt;h2&gt;
  
  
  28. When Does MSSQL Make Sense?
&lt;/h2&gt;

&lt;p&gt;SQL Server can be a strong choice when you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An existing Microsoft ecosystem&lt;/li&gt;
&lt;li&gt;.NET applications&lt;/li&gt;
&lt;li&gt;Existing SQL Server infrastructure&lt;/li&gt;
&lt;li&gt;Enterprise requirements&lt;/li&gt;
&lt;li&gt;SQL Server expertise&lt;/li&gt;
&lt;li&gt;Existing SQL Server-specific database logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your company already has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET
SQL Server
SSMS
Azure
Microsoft infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then SQL Server may be the most practical choice.&lt;/p&gt;

&lt;p&gt;Changing it simply because the backend is changing may create unnecessary migration work.&lt;/p&gt;




&lt;h2&gt;
  
  
  29. When Does MySQL Make Sense?
&lt;/h2&gt;

&lt;p&gt;MySQL can be an excellent choice when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your organization already uses MySQL&lt;/li&gt;
&lt;li&gt;Your application architecture fits MySQL well&lt;/li&gt;
&lt;li&gt;You want its open-source ecosystem&lt;/li&gt;
&lt;li&gt;Your team has strong MySQL expertise&lt;/li&gt;
&lt;li&gt;Your infrastructure is designed around it&lt;/li&gt;
&lt;li&gt;Your workload fits it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's also widely used in web application stacks.&lt;/p&gt;

&lt;p&gt;But again:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't choose a database because another developer says it's "better."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Choose based on the workload and requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  30. MSSQL vs MySQL: A More Useful Decision Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;MSSQL&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Existing .NET application&lt;/td&gt;
&lt;td&gt;Excellent fit&lt;/td&gt;
&lt;td&gt;Possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing Node.js application&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing SQL Server infrastructure&lt;/td&gt;
&lt;td&gt;Excellent fit&lt;/td&gt;
&lt;td&gt;Migration required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open-source preference&lt;/td&gt;
&lt;td&gt;Depends on edition/product&lt;/td&gt;
&lt;td&gt;Strong fit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stored procedures&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactions&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Strong with InnoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise workloads&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web applications&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON workloads&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text search&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration from the other database&lt;/td&gt;
&lt;td&gt;Requires analysis&lt;/td&gt;
&lt;td&gt;Requires analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important phrase in almost every row is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"It depends."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not avoiding the question.&lt;/p&gt;

&lt;p&gt;That's the correct answer for database architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  31. Common Mistakes Developers Make
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Mistake 1: Thinking SQL Server = SQL
&lt;/h2&gt;

&lt;p&gt;They're not the same thing.&lt;/p&gt;

&lt;p&gt;SQL is the language.&lt;/p&gt;

&lt;p&gt;SQL Server is Microsoft's database system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 2: Replacing &lt;code&gt;TOP&lt;/code&gt; with &lt;code&gt;LIMIT&lt;/code&gt; and calling it a migration
&lt;/h2&gt;

&lt;p&gt;Changing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;solves one syntax problem.&lt;/p&gt;

&lt;p&gt;It doesn't migrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;indexes
transactions
procedures
collations
permissions
views
triggers
performance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mistake 3: Assuming &lt;code&gt;dbo&lt;/code&gt; works the same way
&lt;/h2&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Understand the schema architecture first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 4: Ignoring collation
&lt;/h2&gt;

&lt;p&gt;Your application can suddenly behave differently when comparing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mumbai
mumbai
MUMBAI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mistake 5: Ignoring Unicode
&lt;/h2&gt;

&lt;p&gt;A migration that preserves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mumbai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but corrupts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;मुंबई
東京
🏠
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;isn't successful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 6: Copying indexes blindly
&lt;/h2&gt;

&lt;p&gt;An index that made sense in SQL Server may not be the right index for InnoDB.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 7: Assuming transactions behave identically
&lt;/h2&gt;

&lt;p&gt;Both databases support transactions.&lt;/p&gt;

&lt;p&gt;That doesn't mean their locking and isolation behavior are identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 8: Assuming stored procedures are portable
&lt;/h2&gt;

&lt;p&gt;They're not.&lt;/p&gt;

&lt;p&gt;Database-specific procedural code often requires substantial rewriting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 9: Assuming the same query has the same performance
&lt;/h2&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Always inspect the execution plan on the target database.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 10: Changing everything at once
&lt;/h2&gt;

&lt;p&gt;This is probably the biggest one.&lt;/p&gt;

&lt;p&gt;If you change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backend
Database
ORM
Infrastructure
Authentication
API contracts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;at the same time, debugging becomes significantly harder.&lt;/p&gt;




&lt;h2&gt;
  
  
  32. The Bigger Lesson: SQL Knowledge Is Transferable, Database Behavior Isn't
&lt;/h2&gt;

&lt;p&gt;After looking at all of this, I think the relationship can be summarized like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    SQL
                     │
          ┌──────────┴──────────┐
          │                     │
      MSSQL                   MySQL
          │                     │
       T-SQL               MySQL SQL
          │                     │
          ├── Types             ├── Types
          ├── Indexes           ├── Indexes
          ├── Transactions      ├── Transactions
          ├── Locking           ├── Locking
          ├── JSON              ├── JSON
          └── Tooling           └── Tooling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The common SQL layer gives you a huge advantage.&lt;/p&gt;

&lt;p&gt;But the database-specific layer is where engineering decisions live.&lt;/p&gt;

&lt;p&gt;That's why I now think about database knowledge in two layers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1 — Transferable SQL knowledge
&lt;/h3&gt;

&lt;p&gt;Learn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
JOIN
GROUP BY
Indexes
Transactions
Constraints
Normalization
Aggregations
Subqueries
CTEs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These concepts transfer extremely well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2 — Database-specific knowledge
&lt;/h3&gt;

&lt;p&gt;Then learn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL Server
    ↓
T-SQL
    ↓
SQL Server indexes
    ↓
SQL Server locking
    ↓
SQL Server tooling
    ↓
SQL Server operations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MySQL
    ↓
MySQL SQL
    ↓
InnoDB
    ↓
MySQL indexes
    ↓
MySQL locking
    ↓
MySQL operations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's where the real differences start.&lt;/p&gt;




&lt;h2&gt;
  
  
  33. Final Takeaway
&lt;/h2&gt;

&lt;p&gt;I started comparing MSSQL and MySQL expecting something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL
  ↓
Different syntax
  ↓
MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I found was closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              SQL
               │
       Shared fundamentals
               │
        ┌──────┴──────┐
        │             │
      MSSQL          MySQL
        │             │
    Architecture   Architecture
    Data types     Data types
    Indexes        Indexes
    Locking        Locking
    Transactions   Transactions
    JSON           JSON
    Security       Security
    Backups        Backups
    Replication    Replication
        │             │
        └──────┬──────┘
               │
          Different
          behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's the part that matters during migration.&lt;/p&gt;

&lt;p&gt;If you're moving from SQL Server to MySQL, don't ask only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What SQL syntax do I need to change?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What database behavior am I depending on?

Which features are SQL Server-specific?

Which indexes need redesigning?

What happens to my transactions?

What happens to my stored procedures?

What happens to my collation?

What happens to my Unicode data?

What happens to my backup strategy?

What happens to query performance?

What happens under concurrency?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you're moving from ASP.NET to NestJS, don't assume that means you also need to move from MSSQL to MySQL.&lt;/p&gt;

&lt;p&gt;Those are separate engineering decisions.&lt;/p&gt;

&lt;p&gt;You can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET → NestJS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while keeping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and only migrate the database later if there is a good reason.&lt;/p&gt;

&lt;p&gt;That's probably the biggest lesson I took away from comparing these two databases:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Learn SQL first. Then learn the database you're actually working with.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because knowing SQL tells you how to talk to a database.&lt;/p&gt;

&lt;p&gt;Knowing the database tells you what that conversation actually means.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is MSSQL better than MySQL?
&lt;/h3&gt;

&lt;p&gt;Not universally.&lt;/p&gt;

&lt;p&gt;SQL Server can be a strong choice for Microsoft/.NET ecosystems and enterprise environments. MySQL can be a strong choice for many web applications and organizations already invested in its ecosystem.&lt;/p&gt;

&lt;p&gt;The right choice depends on workload, infrastructure, team expertise, operational requirements, and cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is MySQL easier than SQL Server?
&lt;/h3&gt;

&lt;p&gt;That depends on what you're already familiar with.&lt;/p&gt;

&lt;p&gt;If you've worked with MySQL, SQL Server will have unfamiliar features. If you've worked with SQL Server, MySQL will have its own learning curve.&lt;/p&gt;

&lt;p&gt;The SQL fundamentals transfer, but the database-specific concepts don't always.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can NestJS connect to MSSQL?
&lt;/h3&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;Using NestJS does not require MySQL. A NestJS application can communicate with SQL Server through appropriate database drivers and ORMs/query libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Node.js use SQL Server?
&lt;/h3&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;Node.js applications can connect to Microsoft SQL Server.&lt;/p&gt;

&lt;p&gt;The backend runtime and database engine are separate architectural choices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I migrate MSSQL to MySQL?
&lt;/h3&gt;

&lt;p&gt;Yes, but it is more involved than exporting tables and importing them.&lt;/p&gt;

&lt;p&gt;You need to evaluate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data types
Schemas
Queries
Views
Procedures
Functions
Triggers
Indexes
Collation
Transactions
Permissions
Performance
Backups
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Is SQL Server syntax the same as MySQL?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;There is substantial overlap because both implement SQL concepts, but each database has its own syntax and extensions.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOP vs LIMIT
IDENTITY vs AUTO_INCREMENT
GETDATE() vs NOW()
ISNULL() vs IFNULL()
T-SQL vs MySQL stored-program syntax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Which is faster: MSSQL or MySQL?
&lt;/h3&gt;

&lt;p&gt;There is no universal answer.&lt;/p&gt;

&lt;p&gt;Performance depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query design&lt;/li&gt;
&lt;li&gt;Indexes&lt;/li&gt;
&lt;li&gt;Data volume&lt;/li&gt;
&lt;li&gt;Hardware&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Workload&lt;/li&gt;
&lt;li&gt;Concurrency&lt;/li&gt;
&lt;li&gt;Database version&lt;/li&gt;
&lt;li&gt;Application architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benchmark the actual workload instead of comparing databases using a single query.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use MySQL or MSSQL for a Node.js application?
&lt;/h3&gt;

&lt;p&gt;Either can work.&lt;/p&gt;

&lt;p&gt;If your organization already has SQL Server infrastructure and expertise, keeping MSSQL may be completely reasonable.&lt;/p&gt;

&lt;p&gt;If your infrastructure and team are already centered around MySQL, MySQL may make more sense.&lt;/p&gt;

&lt;p&gt;The fact that you're using Node.js isn't enough by itself to decide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does moving from ASP.NET to NestJS require changing the database?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;You can migrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASP.NET → NestJS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while keeping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MSSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the backend framework and changing the database are separate decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How difficult is MSSQL → MySQL migration?
&lt;/h3&gt;

&lt;p&gt;It depends heavily on the existing application.&lt;/p&gt;

&lt;p&gt;A simple CRUD application may be relatively straightforward.&lt;/p&gt;

&lt;p&gt;An application with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hundreds of stored procedures
Complex views
Triggers
SQL Server-specific functions
Advanced indexing
Complex transactions
Full-text search
Database jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can require significant engineering effort.&lt;/p&gt;

&lt;p&gt;The database schema is only one part of the migration.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Remember
&lt;/h2&gt;

&lt;p&gt;If I had to reduce this entire comparison to five points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MSSQL and MySQL both use SQL, but SQL isn't the database.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syntax differences are usually the easiest part of a migration.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Indexes, transactions, collations, data types, stored procedures, and database architecture matter much more.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never blindly copy an MSSQL database design into MySQL.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ASP.NET → NestJS and MSSQL → MySQL are two separate migrations.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once I started looking at MSSQL and MySQL this way, the comparison became much more useful.&lt;/p&gt;

&lt;p&gt;It stopped being:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which database has better syntax?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What assumptions does my application make about its database, and will those assumptions still be true after I migrate?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the question I'd ask before changing a production database.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>sql</category>
      <category>database</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
