Wie unten dargestellt:
Kurz gesagt, varchar hat eine variable Länge, während char eine unveränderliche Länge hat. Für die PostgreSQL-Datenbank besteht der einzige Unterschied zwischen varchar und char darin, dass ersteres eine variable Länge hat, während letzteres eine feste Länge hat. Die maximale Länge beider beträgt 10485760 (1 GB). Varchar gibt keine Länge an und kann Zeichenfolgen mit der maximalen Länge (1 GB) speichern. Char gibt jedoch keine Länge an und der Standardwert ist 1. Darauf müssen Sie achten. Texttyp: In der PostgreSQL-Datenbank gibt es zwischen Text und Varchar fast keinen Leistungsunterschied. Der einzige Unterschied ist die Speicherstruktur. Die Verwendung von char sollte erfolgen, wenn die Länge der Zeichenfolge sicher ist, andernfalls sollte varchar oder text verwendet werden. Offizielle Interpretation:SQL definiert zwei grundlegende Zeichentypen: „character varying(n)“ und „character(n), wobei n eine positive Ganzzahl ist. Beide Typen können Zeichenfolgen (keine Bytes) mit bis zu n Zeichen speichern. Der Versuch, eine längere Zeichenfolge in diesen Feldtypen zu speichern, führt zu einem Fehler, es sei denn, die überzähligen Zeichen sind alle Leerzeichen. In diesem Fall wird die Zeichenfolge auf die maximale Länge gekürzt. Diese scheinbar seltsame Ausnahme wird vom SQL-Standard verlangt. Wenn die zu speichernde Zeichenfolge kürzer als die angegebene Länge ist, wird ein Wert vom Typ „Character“ mit Leerzeichen aufgefüllt; ein Wert vom Typ „Character Variable“ speichert einfach die kürzere Zeichenfolge. Wenn wir einen Wert explizit in „character varying(n)“ oder „character(n)“ konvertieren, wird der zu lange Wert auf n Zeichen gekürzt, ohne dass ein Fehler auftritt. Dies ist auch eine Anforderung des SQL-Standards. varchar(n) und char(n) sind Aliase für character varying(n) bzw. character(n). Ein Zeichen ohne angegebene Länge ist gleichbedeutend mit character(1). Wenn character varying ohne Längenangabe verwendet wird, akzeptiert der Typ Zeichenfolgen beliebiger Länge. Letzteres ist eine PostgreSQL-Erweiterung. Darüber hinaus bietet PostgreSQL den Texttyp, der Zeichenfolgen beliebiger Länge speichern kann. Obwohl der Typ „Text“ nicht Teil des SQL-Standards ist, verfügen viele andere SQL-Datenbanksysteme über ihn. Zeichenwerte werden physikalisch mit Leerzeichen auf die angegebene Länge n aufgefüllt und auch so gespeichert und angezeigt. Die ausgefüllte Lücke ist jedoch semantisch bedeutungslos. Beim Vergleich zweier Zeichenwerte werden eventuelle Füllzeichen ignoriert. Bei der Konvertierung in andere Zeichenfolgentypen werden die Leerzeichen im Zeichenwert entfernt. Beachten Sie, dass bei Zeichenvariationen und Textwerten nachfolgende Leerzeichen semantisch sind. Und wenn Sie Mustervergleiche wie LIKE verwenden, verwenden Sie reguläre Ausdrücke. Der Speicherbedarf für einen kurzen String (bis 126 Byte) beträgt 1 Byte plus den eigentlichen String inklusive der Leerzeichen. Längere Zeichenfolgen haben einen Overhead von 4 Byte, nicht 1. Lange Zeichenfolgen werden vom System automatisch komprimiert, sodass der physische Bedarf an Datenträgern geringer sein kann. Damit längere Werte den schnellen Zugriff auf kurze Feldwerte nicht behindern, werden diese zusätzlich in einer Backend-Tabelle gespeichert. In jedem Fall beträgt die längste Zeichenfolge, die gespeichert werden darf, etwa 1 GB. Der Maximalwert von n, der in einer Datentypdeklaration vorkommen darf, ist kleiner als dieser. Es macht wenig Sinn, dieses Verhalten zu ändern, da die Anzahl der Zeichen und Bytes bei Mehrbyte-Kodierungen stark variieren kann. Wenn Sie lange Zeichenfolgen ohne bestimmte Obergrenze speichern möchten, verwenden Sie Text- oder Zeichenvariationen ohne Längendeklaration, anstatt eine beliebige Längenbeschränkung auszuwählen. Tipp: Zwischen den drei Typen gibt es keinen Leistungsunterschied, außer dass bei Verwendung von mit Leerzeichen aufgefüllten Typen mehr Speicherplatz benötigt wird und beim Speichern von Spalten mit Längenbeschränkung einige zusätzliche CPU-Zyklen zum Überprüfen der Speicherlänge erforderlich sind. Obwohl character(n) in einigen anderen Datenbanksystemen gewisse Leistungsvorteile bietet, ist dies bei PostgreSQL nicht der Fall. Tatsächlich ist character(n) aufgrund der zusätzlichen Speicherkosten normalerweise das langsamste der drei. In den meisten Fällen sollten Text- oder Zeichenvariationen verwendet werden. Ergänzung: PostGreSQL-Datenbank für Texteingabe und Textabruf verwenden Chinesische Wortsegmentierung ChineseParse.cs System verwenden; Verwenden von System.Collections; mit System.IO; mit System.Text.RegularExpressions; Namespace FullTextSearch.Common { /// <Zusammenfassung> /// Chinesischer Wortsegmentierer. /// </summary> öffentliche Klasse ChineseParse { privates statisches schreibgeschütztes ChineseWordsHashCountSet _countTable; statisches ChineseParse() { _countTable = neues ChineseWordsHashCountSet(); InitFromFile("ChinesischesWörterbuch.txt"); } /// <Zusammenfassung> /// Initialisieren Sie das chinesische Wörterwörterbuch und das Zeichenfolgenhäufigkeitswörterbuch aus der angegebenen Datei. /// </summary> /// <param name="fileName">Dateiname</param> private static void InitFromFile(Zeichenfolge Dateiname) { Zeichenfolgepfad = Pfad.Kombinieren(Verzeichnis.GetCurrentDirectory(), @"..\..\Common\", Dateiname); if (Datei.Existiert(Pfad)) { mit (StreamReader sr = File.OpenText(Pfad)) { Zeichenfolge s = ""; während ((s = sr.ReadLine()) != null) { Chinesische Worteinheit _tempUnit = InitUnit(s); _countTable.InsertWord(_tempUnit.Word); } } } } /// <Zusammenfassung> /// Analysieren Sie einen String in ChineseWordUnit. /// </summary> /// <param name="s">Zeichenfolge</param> /// <returns>Die analysierte ChineseWordUnit</returns> /// 4 /// 0 private statische ChineseWordUnit InitUnit (Zeichenfolge s) { var reg = neuer Regex(@"\s+"); Zeichenfolge[] temp = reg.Split(s); //wenn (temp.Länge != 2) //{ // neue Ausnahme werfen("Fehler bei der Zeichenfolgenanalyse: " + s); //} wenn (temp.Länge != 1) { throw new Exception("Fehler bei der Zeichenfolgenanalyse: " + s); } gibt eine neue chinesische Worteinheit zurück (temp[0], Int32.Parse("1")); } /// <Zusammenfassung> /// Analysieren Sie die Eingabezeichenfolge und zerlegen Sie sie in einzelne Wörter. /// </summary> /// <param name="s">Zu schneidende Zeichenfolge</param> /// <returns>Das durch Ausschneiden erhaltene chinesische Wort-Array</returns> öffentliche statische Zeichenfolge [] ParseChinese (Zeichenfolge s) { int _length = s.Länge; Zeichenfolge _temp = Zeichenfolge.Leer; var _words = neue ArrayList(); für (int i = 0; i < s.Length;) { _temp = s.Teilstring(i, 1); wenn (_countTable.GetCount(_temp) > 1) { } j = 2; für (; i + j < s.Length + 1 und _countTable.GetCount(s.Substring(i, j)) > 0; j++) { } _temp = s.Teilzeichenfolge(i, j - 1); = i + j - 2; } ich++; _words.Add(_temp); } var _tempStringArray = neuer String[_words.Count]; _words.CopyTo(_tempStringArray); gibt _tempStringArray zurück; } } } ChineseWordsHashCountSet.cs Verwenden von System.Collections; Namespace FullTextSearch.Common { /// <Zusammenfassung> /// Eine Wörterbuchklasse, die aufzeichnet, wie oft eine Zeichenfolge am Anfang eines chinesischen Wortes vorkommt, das in einem chinesischen Wörterbuch aufgezeichnet ist. Wenn die Zeichenfolge „中“ am Anfang von „中国“ erscheint, wird die Häufigkeit im Wörterbuch aufgezeichnet. /// </summary> öffentliche Klasse ChineseWordsHashCountSet { /// <Zusammenfassung> /// Eine Hashtabelle, die aufzeichnet, wie oft eine Zeichenfolge in einem chinesischen Wort vorkommt. Der Schlüssel ist eine bestimmte Zeichenfolge und der Wert ist die Häufigkeit, mit der die Zeichenfolge im chinesischen Wort vorkommt. /// </summary> private schreibgeschützte Hashtabelle _rootTable; /// <Zusammenfassung> /// Typinitialisierung. /// </summary> öffentliches ChineseWordsHashCountSet() { _rootTable = neue Hashtabelle(); } /// <Zusammenfassung> /// Abfrage, wie oft die angegebene Zeichenfolge am Anfang eines chinesischen Wortes in einem chinesischen Wörterbuch vorkommt. /// </summary> /// <param name="s">Zeichenfolge angeben</param> /// <returns>Die Häufigkeit, mit der die Zeichenfolge am Anfang eines im chinesischen Wörterbuch aufgezeichneten chinesischen Wortes vorkommt. Wenn der Wert -1 ist, bedeutet dies, dass es nicht angezeigt wird. </returns> öffentliche int GetCount(Zeichenfolge s) { wenn (!_rootTable.ContainsKey(s.Length)) { Rückgabe -1; } var _tempTable = (Hashtabelle) _rootTable[s.Length]; wenn (!_tempTable.ContainsKey(s)) { Rückgabe -1; } gibt (int) _tempTable[s] zurück; } /// <Zusammenfassung> /// Ein Wort in das Häufigkeitswörterbuch einfügen. Analysieren Sie das Wort und fügen Sie es in das Häufigkeitswörterbuch ein. /// </summary> /// <param name="s">Die zu verarbeitende Zeichenfolge. </param> öffentliche void InsertWord(Zeichenfolge s) { für (int i = 0; i < s.Länge; i++) { Zeichenfolge _s = s.Teilzeichenfolge(0, i + 1); SubString einfügen(_s); } } /// <Zusammenfassung> /// Fügen Sie einen String-Zähldatensatz in das Zählwörterbuch ein. /// </summary> /// <param name="s">Die einzufügende Zeichenfolge. </param> private void InsertSubString(Zeichenfolge s) { wenn (!_rootTable.ContainsKey(s.Length) && s.Length > 0) { var _newHashtable = neue Hashtable(); _rootTable.Add(s.Length, _newHashtable); } var _tempTable = (Hashtabelle) _rootTable[s.Length]; wenn (!_tempTable.ContainsKey(s)) { _tempTable.Add(s, 1); } anders { _tempTable[s] = (int) _tempTable[s] + 1; } } } } ChineseWordUnit.cs Namespace FullTextSearch.Common { öffentliche Struktur ChineseWordUnit { privater schreibgeschützter Int. _power; privater schreibgeschützter String _word; /// <Zusammenfassung> /// Strukturinitialisierung. /// </summary> /// <param name="word">Chinesisches Wort</param> /// <param name="power">Das Gewicht des Wortes</param> öffentliche ChineseWordUnit (Zeichenfolge Wort, Int Potenz) { _Wort = Wort; _power = Leistung; } /// <Zusammenfassung> /// Das chinesische Wort, das der chinesischen Worteinheit entspricht. /// </summary> öffentliche Zeichenfolge Word { erhalte { return _word; } } /// <Zusammenfassung> /// Die Bedeutung des chinesischen Wortes. /// </summary> öffentliche int Leistung { erhalte { return _power; } } } } ChinesischesWörterbuch.txt Hauptfensteroberfläche MainManager.cs System verwenden; mit System.Collections.Generic; mit System.Data; mit System.Drawing; Verwenden von System.Windows.Forms; mit FullTextSearch.Common; Verwendung von Npgsql; Namespace Volltextsuche { öffentliche partielle Klasse MainManager: Formular { privates schreibgeschütztes PostgreSQL pg = neues PostgreSQL(); private schreibgeschützte SQLquerys sqlQuerys = neue SQLquerys(); privater Zeichenanalysetyp; private Zeichenfolge createConnString = ""; privater Datensatz Datensatz = neuer Datensatz(); private DataTable dataTable = neue DataTable(); privater Charakter odabirAndOr; private char vrstaVorbereitung; öffentlicher MainManager() { InitialisierenKomponente(); rbtn_AND.Checked = true; rbtnNicht zutreffend.Checked = true; odabirAndOr = '*'; radioButton_Day.Checked = true; radioButton_Day.Checked = true; } private void Form1_Load(Objekt sender, EventArgs e) { gb_unosPodataka.Enabled = false; groupBox_Search.Enabled = falsch; groupBox_Analysis.Enabled = falsch; button_Trennen.Aktiviert = false; button_Pretrazi.BackColor = Farbe.WhiteSmoke; button_Trennen.BackColor = Farbe.WhiteSmoke; button_unosTekstaUBazu.BackColor = Farbe.WhiteSmoke; button1.Hintergrundfarbe = Farbe.WeißRauch; } private void button_unosTekstaUBazu_Click(Objekt sender, EventArgs e) { Zeichenfolge searchTextBoxString = rTB_unosTextaUBazu.Text; wenn (searchTextBoxString != "") { pg.insertIntoTable(searchTextBoxString, pg.conn); MessageBox.Show(searchTextBoxString + "Zur Datenbank hinzufügen!"); rTB_unosTextaUBazu.Clear(); } anders { MessageBox.Show("Leere Daten sind nicht zulässig!"); } } private void button_Pretrazi_Click(Objekt Absender, EventArgs e) { Zeichenfolge stringToSearch; Zeichenfolge SQL; Zeichenfolge hervorgehobener Text; Zeichenfolgenrang; Zeichenfolgenprüfung; stringToSearch = txt_Search.Text.Trim(); var list = neue Liste<string>(ChineseParse.ParseChinese(stringToSearch)); ; sql = sqlQuerys.createSqlString(list, odabirAndOr, vrstaAuswählen); richTextBox1.Text = sql; Überprüfen Sie, ob sqlQuerys.testIfEmpty(stringToSearch) gültig ist. pg.insertIntoAnalysisTable(stringToSearch, pg.conn); pg.openConnection(); var Befehl = neuer NpgsqlCommand(sql, pg.conn); NpgsqlDataReader-Leser = Befehl.ExecuteReader(); int-Anzahl = 0; linkLabel_Rezultat.Text = " "; während (Leser.Lesen()) { hervorgehobenerText = Leser[1].ToString(); Rang = Leser[3].ToString(); linkLabel_Rezultat.Text += hervorgehobenerText + "[" + Rang + "]\n"; zählen++; } labelBrojac.Text = "Anzahl der gefundenen Dateien: " + count; pg.connection(); } private void rbtn_AND_CheckedChanged(Objekt sender, EventArgs e) { odabirAndOr = '*'; } private void rbtn_OR_CheckedChanged(Objekt sender, EventArgs e) { odabirAndOr = '+'; } private void rbtnNeizmjenjeni_CheckedChanged(Objekt Absender, EventArgs e) { vrstaVoreinstellung = 'A'; } private void rbtn_Rijecnici_CheckedChanged(Objekt sender, EventArgs e) { vrstaVoreinstellung = 'B'; } private void rbtn_Fuzzy_CheckedChanged(Objekt sender, EventArgs e) { vrstaVoreinstellung = 'C'; } private void button_Connect_Click(Objekt sender, EventArgs e) { wenn (verbinde mich()) { gb_unosPodataka.Enabled = true; groupBox_Search.Enabled = wahr; groupBox_Analysis.Enabled = true; textBox_Database.Enabled = falsch; textBox_IP.Enabled = falsch; textBox_Port.Enabled = falsch; textBox_Password.Enabled = false; textBox_UserID.Enabled = falsch; button_Connect.Enabled = false; button_Trennen.Aktiviert = true; button_Pretrazi.BackColor = Farbe.Himmelblau; button_Trennen.BackColor = Farbe.IndianRed; button_unosTekstaUBazu.BackColor = Farbe.MittelMeergrün; button1.Hintergrundfarbe = Farbe.Mittelmeergrün; button_Connect.BackColor = Farbe.WhiteSmoke; } } private void button_Disconnect_Click(Objekt Absender, EventArgs e) { gb_unosPodataka.Enabled = false; groupBox_Search.Enabled = falsch; groupBox_Analysis.Enabled = falsch; textBox_Database.Enabled = true; textBox_IP.Enabled = true; textBox_Port.Enabled = true; textBox_Password.Enabled = true; textBox_UserID.Enabled = true; button_Connect.Enabled = true; button_Trennen.Aktiviert = false; button_Pretrazi.BackColor = Farbe.WhiteSmoke; button_Trennen.BackColor = Farbe.WhiteSmoke; button_unosTekstaUBazu.BackColor = Farbe.WhiteSmoke; button1.Hintergrundfarbe = Farbe.WeißRauch; button_Connect.BackColor = Farbe.Mittelmeergrün; txt_Search.Text = ""; linkLabel_Rezultat.Text = ""; richTextBox1.Text = ""; labelBrojac.Text = ""; } private bool connectMe() { createConnString += "Server=" + textBox_IP.Text + ";Port=" + textBox_Port.Text + ";Benutzer-ID=" + textBox_UserID.Text + ";Passwort=" + textBox_Passwort.Text + ";Datenbank=" + textBox_Database.Text + ";"; sqlQuerys.setTheKey(createConnString); pg.setConnectionString(); pg.setConnection(); wenn (pg.openConnection()) { MessageBox.Show("Sie sind erfolgreich verbunden!"); pg.connection(); gibt true zurück; } gibt false zurück; } private void button1_Click(Objekt sender, EventArgs e) { Zeichenfolge ausgewählter Zeitstempel; selectedTimestamp = dateTimePicker_From.Value.ToString("tt-MM-jjjj hh:mm:ss") + " " + dateTimePicker_To.Value.ToString("tt-MM-jjjj hh:mm:ss"); var analize = neue Analyse (ausgewählter Zeitstempel, Analysetyp); analize.Show(); } private void radioButton_Day_CheckedChanged(Objekt sender, EventArgs e) { Analysetyp = "D"; } private void radioButton_Hour_CheckedChanged(Objekt sender, EventArgs e) { Analysetyp = "H"; } } } SQLquerys.cs-Code: mit System.Collections.Generic; Namespace Volltextsuche { interne Klasse SQLquerys { private statische Zeichenfolge „giveMeTheKey“; private statische int tempInt = 1; //Verbindungszeichenfolge festlegen public void setTheKey(string connString) { gibMirdenenSchlüssel = Verbindungszeichenfolge; gibMirDenSchlüssel += ""; } //Speichern Sie die Verbindungszeichenfolge in einer statischen Variable „public string getTheKey()“ { gibMirDenSchlüssel += ""; gib mir den Schlüssel zurück; } öffentliche void setCounter() { tempInt = 1; } //Analysieren Sie die Zeichenfolge für die Suche basierend auf der Auswahl von AND und OR public string createFunctionString(List<string> searchList, char selector) { Zeichenfolge TempString = ""; Zeichenfolge[] TempField = null; } } j = 0; foreach (Zeichenfolge Suchzeichenfolge in Liste in Suchliste) { wenn (j != 0) { wenn (Selektor == '+') TempString = TempString + " | "; sonst wenn (Selektor == '*') TempString = TempString + " & "; } j = 1; TempField = splitListForInput(SuchzeichenfolgeInListe); TempString = TempString + "("; foreach (Zeichenfolge nur TempString in TempField) { wenn (i != 0) { TempString = TempString + " & "; } : TempString = TempString + nurTempString; ich = 1; } : TempString = TempString + ")"; ich = 0; } gibt TempString zurück; } //Hilfsmethode öffentliche Liste<string> splitInputField(string[] inputField) { var unfinishedList = neue Liste<string>(); foreach (Zeichenfolge „SplitString“ im Eingabefeld) { unfinishedList.Add(splitString); } unfertigeListe zurückgeben; } //Hilfsmethode public string[] splitListForInput(string inputString) { Zeichenfolge[] analysierteListe = null; : parsedList = inputString.Split(' '); gib analysierte Liste zurück; } // Funktion zum Erstellen der TS-Funktion in PostgreSQL für die Wörterbuchsuche, public string createTsFunction(string tsString) { Zeichenfolge tsHeadline = ""; Zeichenfolge tsRank = ""; Zeichenfolge tsFunction = ""; tsHeadline = ",\n ts_headline(\"Inhalt\", to_tsquery('" + tsString + "')), \"Inhalt\""; tsRank = ",\n ts_rank(to_tsvector(\"content\"), to_tsquery('" + tsString + "')) Rang"; tsFunktion = tsÜberschrift + tsRank; gibt tsFunktion zurück; } //Das Erstellen einer SQL-Abfrage hängt von der ausgewählten Suchart und auch vom AND- oder OR-Selektor ab. public string createSqlString(List<string> searchList, char selector, char vrstaPretrazivanja) { Zeichenfolge selectString = ""; Zeichenfolge myTempString = ""; Zeichenfolge TempString = ""; } TempString = createFunctionString(Suchliste, Selektor); : TempString = createTsFunction(TempString); selectString = "SELECT \"id\"" + TempString + "\nFROM \"texttable\" \nWHERE "; if (Voreinstellung == 'A') { foreach (Zeichenfolge myString in Suchliste) { wenn (i == 0) { meinTempString = meinTempString + "\"Inhalt\" LIKE '%" + meinString + "%' "; ich++; } anders { wenn (Selektor == '*') meinTempString = meinTempString + "\nUND \"Inhalt\" WIE '%" + meinString + "%' "; sonst wenn (Selektor == '+') meinTempString = meinTempString + "\nODER \"Inhalt\" LIKE '%" + meinString + "%' "; } } } sonst wenn (Voreinstellung == 'B') { foreach (Zeichenfolge myString in Suchliste) { Zeichenfolge zeitlicherString = ""; string[] testingString = meinString.Split(' '); für (int k = 0; k < testingString.Length; k++) { wenn (k != Teststring.Länge - 1) { zeitlicherString += TestString[k] + " & "; } anders { temporalString += testingString[k]; } } wenn (i == 0) { meinTempString = meinTempString + "to_tsvector(\"Inhalt\") @@ to_tsquery('Englisch', '" + zeitlicherString + "')"; ich++; } anders { wenn (Selektor == '*') meinTempString = meinTempString + "\nUND to_tsvector(\"Inhalt\") @@ to_tsquery('Englisch', '" + zeitlicherString + "')"; sonst wenn (Selektor == '+') myTempString = myTempString + "\nODER to_tsvector(\"content\") @@ to_tsquery('englisch', '" + zeitlicherString + "')"; } } } if (Voreinstellung == 'C') { foreach (Zeichenfolge myString in Suchliste) { wenn (i == 0) { meinTempString = meinTempString + "\"Inhalt\" % '" + meinString + "' "; ich++; } anders { wenn (Selektor == '*') meinTempString = meinTempString + "\nUND \"Inhalt\" % '" + meinString + "' "; sonst wenn (Selektor == '+') meinTempString = meinTempString + "\nODER \"Inhalt\" % '" + meinString + "' "; } } } selectString = selectString + meinTempString + "\nORDER BY Rang DESC"; gibt selectString zurück; } öffentliche Zeichenfolge testIfEmpty (Zeichenfolge gesuchter Text) { Zeichenfolge „checkingIfEmpty“ = „SELECT * FROM \"analysisTable\" WHERE \"searchedtext\" =' " + searchedText + "'"; gib checkingIfEmpty zurück; } öffentliche Zeichenfolge queryForAnalysis(char analysisChoice) { Zeichenfolge myTestsql = ""; wenn (AnalyseAuswahl == 'H') { //Diese Abfrage ist nur zu Testzwecken so geschrieben, sie muss geändert werden myTestsql = "SELECT * FROM crosstab('SELECT CAST((\"searchedtext\") AS text) searchedText," + " CAST(EXTRACT(HOUR FROM \"timeOfSearch\") AS int) AS sat, CAST(COUNT(*) AS int) AS broj FROM \"analysisTable\" GROUP BY \"searchedText\", sat" + " ORDER BY \"gesuchterText\", sat', 'SELECT rbrSata FROM sat ORDER BY rbrSata') AS pivotTable (\"gesuchterText\" TEXT, t0_1 INT, t1_2 INT" + ", t2_3 INT, t3_4 INT, t4_5 INT, t5_6 INT, t6_7 INT, t7_8 INT, t8_9 INT, t9_10 INT, t10_11 INT, t11_12 INT, t12_13 INT" + ", t13_14 INT, t14_15 INT, t15_16 INT, t16_17 INT, t17_18 INT, t18_19 INT, t19_20 INT, t20_21 INT, t21_22 INT, t22_23 INT, t23_00 INT) ORDER BY \"gesuchterText\""; gibt myTestsql zurück; } wenn (AnalyseAuswahl == 'D') { //Diese Abfrage ist nur zu Testzwecken so geschrieben, sie muss geändert werden myTestsql += "SELECT *FROM crosstab ('SELECT CAST((\"searchedtext\") AS text) AS searchedText, CAST(EXTRACT(DAY FROM \"dateOfSearch\") AS int) AS dan" + ", CAST(COUNT(*) AS int) AS broj FROM \"Analysetabelle\" GROUP BY \"Suchtext\", " + "dan ORDER BY \"gesuchterText\", dan', 'SELECT rbrDana FROM dan ORDER BY rbrDana') AS pivotTable(\"gesuchterText\" TEXT"; gibt myTestsql zurück; } gibt myTestsql zurück; } //Diese Methode wird zum Parsen des Datums verwendet public int[] parseForDates(string date) { Zeichenfolge[] temp; var tempInt = neuer int[3]; temp = Datum.Split('-'); für (int i = 0; i < 3; i++) { tempInt[i] = int.Parse(temp[i]); } gibt tempInt zurück; } // Dieser Code wird zum Erstellen einer Analyse verwendet. Er führt einige Datums-/Uhrzeitmanipulationen durch, um eine Analyse für das ausgewählte Datum/die ausgewählte Uhrzeit erstellen zu können. öffentliche Zeichenfolge „createSqlForDayAnalysis“ (Zeichenfolge „dateFrom“, Zeichenfolge „dateTo“) { Zeichenfolge insertIntoTempTable = ""; Zeichenfolge Datum/UhrzeitFürAnalyse = ""; int[] tempFrom = parseForDates(dateFrom); int[] tempTo = parseForDates(dateTo); //Monatswechsel-Algorithmus while (tempFrom[0] != tempTo[0] || tempFrom[1] != tempTo[1]) { wenn (tempFrom[1] == tempTo[1]) { wenn (tempFrom[0] != tempTo[0]) { für (int i = tempInt + 1; tempFrom[0] + 2 < tempTo[0] + 2; i++) { insertIntoTempTable += "INSERT INTO \"dan\" VALUES (" + i + ");"; Datum/UhrzeitFürAnalyse += ",dd" + tempFrom[0] + tempFrom[1] + tempFrom[2] + " INT"; tempInt = i; tempFrom[0]++; } } } wenn (tempFrom[1] != tempTo[1]) { wenn (tempFrom[1]%2 == 0 || tempFrom[1] == 7 || tempFrom[1] == 1) { für (int i = tempInt; tempFrom[0] < 31 && tempFrom[1] != tempTo[1]; i++) { insertIntoTempTable += "INSERT INTO \"dan\" VALUES (" + i + ");"; Datum/UhrzeitFürAnalyse += ", dd" + tempFrom[0] + tempFrom[1] + tempFrom[2] + " INT"; tempInt = i; tempFrom[0]++; wenn (tempFrom[0] == 31) { tempFrom[1]++; tempFrom[0] = 1; } } } } } dateTimeForAnalysis += ") ORDER BY \"Suchtext\""; Rückgabewert für Datum/Uhrzeit für Analyse + "#" + insertIntoTempTable; } } } PostgreSQL.cs-Code: System verwenden; verwenden von System.Windows.Forms; Verwendung von Npgsql; Verwendung von NpgsqlTypes; Namespace Volltextsuche { öffentliche Klasse PostgreSQL { private statische int tempInt = 1; private schreibgeschützte SQL-Abfragen sql = neue SQL-Abfragen(); öffentliche NpgsqlConnection-Verbindung; öffentliche Zeichenfolge als Verbindungszeichenfolge; private Zeichenfolge newConnString; öffentliches PostgreSQL() { setConnectionString(); setConnection(); } öffentliche void setConnectionString() { newConnString = sql.getTheKey(); Verbindungszeichenfolge = String.Format(newConnString); setConnection(); } öffentliche void setConnection() { conn = neue NpgsqlConnection(Verbindungszeichenfolge); } öffentliche bool openConnection() { versuchen { conn.Öffnen(); gibt true zurück; } fangen { MessageBox.Show("Verbindung nicht möglich! Parameter prüfen!"); gibt false zurück; } } öffentliche void closeConnection() { conn.Schließen(); } öffentliche void insertIntoTable(Zeichenfolge textToInsert, NpgsqlConnection nsqlConn) { Zeichenfolge mySqlString = "INSERT INTO \"texttable\" (\"content\") VALUES (@Param1)"; var meinParameter = neuer NpgsqlParameter("@Param1", NpgsqlDbType.Text); meinParameter.Wert = einzufügender Text; öffneVerbindung(); var meinCommand = neuer NpgsqlCommand(mySqlString, nsqlConn); meinCommand.Parameters.Add(meinParameter); meinCommand.ExecuteNonQuery(); Verbindung schließen(); } öffentliche void insertIntoAnalysisTable(Zeichenfolge textToInsert, NpgsqlConnection nsqlConn) { Zeichenfolge Datum/Uhrzeit = Datum/Uhrzeit.Jetzt.ToString(); Zeichenfolge[] temp; temp = Datum/Uhrzeit.Split(' '); Zeichenfolge mySqlString = "INSERT INTO \"Analysetabelle\" (\"Suchtext\", \"Suchdatum\", \"Suchzeit\") VALUES ('" + Zu einfügender Text + "', '" + temp[0] + "'" + ", '" + temp[1] + "');"; öffneVerbindung(); var meinCommand = neuer NpgsqlCommand(mySqlString, nsqlConn); meinCommand.ExecuteNonQuery(); Verbindung schließen(); } öffentliche void executeQuery(Zeichenfolge Abfragetext, NpgsqlConnection nsqlConn) { öffneVerbindung(); var meinCommand = neuer NpgsqlCommand(queryText, nsqlConn); meinCommand.ExecuteNonQuery(); Verbindung schließen(); } öffentliche void createTempTable(NpgsqlConnection nsqlConn, char analysisType, string dateFrom, string dateTo, Zeichenfolge splitMe) { wenn (Analysetyp == 'H') { Zeichenfolge dropIfExists = "Tabelle löschen, wenn \"sat\" vorhanden ist;"; Zeichenfolge createTempTable = "TABELLE ERSTELLEN, WENN \"sat\" NICHT VORHANDEN IST (rbrSata INT);"; Zeichenfolge insertIntoTempTable = ""; für (int i = 0; i < 24; i++) { insertIntoTempTable += "INSERT INTO \"sat\" VALUES (" + i + ");"; } öffneVerbindung(); var commandDrop = neuer NpgsqlCommand(dropIfExists, nsqlConn); commandDrop.ExecuteNonQuery(); var commandCreate = neuer NpgsqlCommand(createTempTable, nsqlConn); commandCreate.ExecuteNonQuery(); var commandInsert = neuer NpgsqlCommand(insertIntoTempTable, nsqlConn); commandInsert.ExecuteNonQuery(); Verbindung schließen(); } sonst wenn (Analysetyp == 'D') { Zeichenfolge dropIfExists = "Tabelle löschen, wenn \"dan\" vorhanden ist;"; Zeichenfolge createTempTable = "TABELLE ERSTELLEN, WENN \"dan\" NICHT VORHANDEN IST (rbrDana INT);"; Zeichenfolge insertIntoTempTable = splitMe; öffneVerbindung(); var commandDrop = neuer NpgsqlCommand(dropIfExists, nsqlConn); commandDrop.ExecuteNonQuery(); var commandCreate = neuer NpgsqlCommand(createTempTable, nsqlConn); commandCreate.ExecuteNonQuery(); var commandInsert = neuer NpgsqlCommand(insertIntoTempTable, nsqlConn); commandInsert.ExecuteNonQuery(); Verbindung schließen(); } } } } PostGreSQL-SQL-Skript: TABELLE ERSTELLEN public.analysistable ( id integer NICHT NULL STANDARD nextval('analysistable_id_seq'::regclass), gesuchter Text Text COLLATE pg_catalog."default" NOT NULL, dateofsearch Datum NICHT NULL, timeofsearch Zeit ohne Zeitzone NOT NULL, CONSTRAINT analysistable_pkey PRIMARY KEY (ID) ) MIT ( OIDS = FALSCH ) TABELLENBEREICH pg_default; ALTER TABLE public.analysistable EIGENTÜMER des Königs; CREATE TABLE public.texttable ( id integer NICHT NULL STANDARD nextval('texttable_id_seq'::regclass), Inhaltstext COLLATE pg_catalog."default" NOT NULL, CONSTRAINT texttable_pkey PRIMÄRSCHLÜSSEL (id) ) MIT ( OIDS = FALSCH ) TABELLENBEREICH pg_default; ALTER TABLE public.texttable EIGENTÜMER des Königs; Die Laufergebnisse sind in der Abbildung dargestellt: Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur. Das könnte Sie auch interessieren:
|
<<: Einführung in die Verwendung gängiger XHTML-Tags
>>: Realisierung baumförmiger Sekundärtabellen auf Basis von Angular
1. Starten Sie den Docker-Container Starten Sie m...
Inhaltsverzeichnis Herkunft Status Quo Anfrage ab...
Beim Ändern der Zeitzone unter Linux ist es immer...
Einführung in Rahmeneigenschaften border -Eigensc...
Man muss sagen, dass ein Webdesigner ein Generalis...
1. Holen Sie sich den tatsächlichen Pfad des aktu...
In diesem Artikel wird der spezifische Code von j...
1. SVN-Server installieren yum installiere Subver...
MySQL 5.7 und höhere Versionen ermöglichen die di...
Traditionell erstellen Entwickler Eigenschaften i...
Inhaltsverzeichnis Vorwort Kurzübersicht: JavaScr...
Beim Erstellen von Webseiten verwenden wir häufig ...
Fehler: Connection to blog0@localhost failed. [08...
In diesem Artikel werden diese 4 Prinzipien im Hi...
Wenn Sie Inhalte vor Benutzern von Telefonen, Tabl...