You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ein Character Set ist der Zeichenvorrat für alle Daten in der Datenbank.
utf8: Entspricht utf8mb3 (später wird utf8mb3 auf mb4 gemappt)
utf8mb4: Für jeden Charakter werden 4 Bytes reserviert. Nur dann passen auch Emojis rein.
Es gibt komplexere Emojis, die manchmal nicht gehen (😀 vs. ❤️)
Eine Kollation regelt die Sortierregeln dieses Zeichenvorrats bei der Benutzung von ORDER BY
Es gibt Kollations für die Datenbank, Tabelle und Spalten (die Collation für die Spalten sind entscheidend, alles andere hat nur Auswirkung auf die Neuanlegung von Spalten bzw. Tabellen)
Eine sehr weit verbreitete und übliche Kombination ist utf8_unicode_ci, utf8 und utf_general_ci (das verwenden wir bei allen Projekten)
utf_general_ci ist ein vereinfachter Standard, der nicht so viele Ressourcen braucht; dies ist heutzutage aber nicht mehr relevant
Man konvertiert die Datenbank/Tabellen/Spalten in das Character Set "latin1" und der Collation "latin1_german2_ci" (nicht empfohlen, da latin1 weniger Zeichen als UTF-8 hat)
Man modifiziert an den gewünschten Stellen das SQL Query auf SELECT * FROM table ORDER BY CONVERT(col USING latin1) COLLATE latin1_german2_ci ASC.
Um Sch und Sz nach S zu sortieren, nutzt man beispielsweise SELECT * FROM table ORDER BY CONVERT(REPLACE(REPLACE(col, 'Sch','Szzzch'), 'St','Szzzt') USING latin1) COLLATE latin1_german2_ci ASC.
show all charsets and collations
SELECTS.SCHEMA_NAMEAS"Database name",
S.DEFAULT_CHARACTER_SET_NAMEAS"Database charset",
S.DEFAULT_COLLATION_NAMEAS"Database collation",
T.TABLE_NAMEAS"Table name",
CCSA.CHARACTER_SET_NAMEAS"Table charset",
T.TABLE_COLLATIONAS"Table collation"FROMINFORMATION_SCHEMA.SCHEMATA S
JOININFORMATION_SCHEMA.TABLES T ONS.SCHEMA_NAME=T.TABLE_SCHEMAJOININFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY CCSA
ONT.TABLE_COLLATION=CCSA.COLLATION_NAMEWHERES.SCHEMA_NAME='db_name'ORDER BYT.TABLE_NAME;
convert a database (without tables and columns)
ALTERDATABASE database_name CHARACTER SET= utf8mb4 COLLATE = utf8mb4_unicode_ci;
convert a table (not columns)
ALTERTABLE table_name COLLATE utf8mb4_unicode_ci;
convert a table and columns
ALTERTABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTERDATABASE database_name CHARACTER SET= utf8mb4 COLLATE = utf8mb4_unicode_ci;
SELECT CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS`Execute these strings!`FROMINFORMATION_SCHEMA.TABLESWHERE TABLE_SCHEMA="database_name"AND TABLE_TYPE="BASE TABLE"ORDER BY TABLE_NAME ASC;
# disable NO_ZERO_IN_DATE / NO_ZERO_DATE that produces errors (gets reset after restart)SET sql_mode ='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
# run the above commands# ...