You said you are open to other DBMS solutions as well.
This is very easy in Postgres:
select id,
split_part(data1, ';', 1) as Data1_Before_Semicolon,
split_part(data1, ';', 2) as Data1_After_Semicolon1,
split_part(data2, ';', 1) as Data2_Before_Semicolon,
split_part(data2, ';', 2) as Data2_After_Semicolon1,
split_part(data2, ';', 3) as Data2_After_Semicolon2,
split_part(data3, ';', 1) as Data3_Before_Semicolon,
split_part(data3, ';', 2) as Data3_After_Semicolon1,
split_part(data3, ';', 3) as Data3_After_Semicolon2,
split_part(data4, ';', 1) as Data4_Before_Semicolon,
split_part(data4, ';', 2) as Data4_After_Semicolon1,
split_part(data4, ';', 3) as Data4_After_Semicolon2,
split_part(data5, ';', 1) as Data5_Before_Semicolon,
split_part(data5, ';', 2) as Data5_After_Semicolon1,
split_part(data5, ';', 3) as Data5_After_Semicolon2
from example;
Online example: https://rextester.com/RSNO8845
To update it, use the same expression:
update the table
set Data1_Before_Semicolon = split_part(data1, ';', 1,
Data1_After_Semicolon1 = split_part(data1, ';', 2)
....