windows - Sådan håndhæves sagerfølsomme tabeller og kolonne navne i MySql?

Indlæg af Hanne Mølgaard Plasc

Problem



Sagen er, at vi arbejder på Windows-maskine, og når vi har gjort det, implementerer vi koden på Unix-maskine. Koden fungerer fint på windows, men i unix får vi fejlen som 'ingen sådan tabel eksisterer' efter at have ændret tabelnavnet i korrekt tilfælde fungerer det også fint i unix. Faktisk er der i Windows ikke tilfældet med sager, der er følsomme, men i unix har de (læs, at MySQL-tabeller faktisk er filer, og i unix har vi et kaskos følsomt filnavn, men ikke i Windows). Løsning kan være at skabe alle tabeller igen, og lad os få tabelnavnet i små bogstaver. Ja, det kan vi også godt.


Men vi kan stadig indføre husfølsomhed på tabelnavne i MySql (Windows-maskine). Hvis ja, lad mig så vide, hvordan du gør det.

Bedste reference


Indstillingen hedder lower\_case\_table\_names. Hvis du sætter det på 0, vil sammenligninger være sagerfølsomme. [8]


Imidlertid,



  Du bør ikke indstille denne variabel til 0, hvis du kører MySQL på et system, der har tilfælde af uhensigtsmæssige filnavne (f.eks. Windows eller Mac OS X). Hvis du tvinge denne variabel til 0 med - lavt navn-tabel-navne=0 på et tilfælde, der ikke er følsomt, og få adgang til MyISAM-tabellenavne ved hjælp af forskellige bogstaver, kan indekskorruption forekomme.



gør alle tabelnavne små bogstaver på tværs af alle systemer (herunder Linux), dvs. sætter det til en værdi af 1, lyder som den bedre mulighed:



  Tabelnavne gemmes i små bogstaver på disken, og navnesammenligninger er ikke sagerfølsomme. MySQL konverterer alle tabelnavne til små bogstaver ved opbevaring og opslag. Denne adfærd gælder også for database navne og tabel aliaser.


Andre referencer 1


På Unix er standardværdien for lower\_case\_table\_names 0. I Windows er standardværdien 1. På Mac OS X er standardværdien 1 før MySQL 4.0.18 og 2 fra 4.0.18.


For at løse dette kan du søge efter indstillingen: lower\_case\_table\_names i din my.ini-fil, fundet i eller omkring: C: \ Programmer \ MySQL \ MySQL Server 4.1, afhængigt af hvilken version du kører. Hvis du ikke finder indstillingen, kan du bare tilføje den til slutningen af ​​my.ini-filen, som jeg gjorde, sådan:


lower\_case\_table\_names=0


Husk at genstarte MySQL-tjenesten, før du tester om det virker.


Hvis du bruger MySQL på kun én platform, behøver du normalt ikke at ændre variable lower\_case\_table\_names fra standardværdien. Du kan dog støde på vanskeligheder, hvis du vil overføre tabeller mellem platforme, der adskiller sig fra filsystemets følsomhed. For eksempel på Unix kan du have to forskellige tabeller med navnet my\_table og MY\_TABLE, men i Windows betragtes disse navne som identiske. For at undgå dataoverføringsproblemer, der stammer fra brevpapir i databaser eller tabelnavne, har du to muligheder:


Brug lower\_case\_table\_names=1 på alle systemer. Den største ulempe ved dette er, at når du bruger SHOW TABLES eller SHOW DATABASES, kan du ikke se navnene i deres originale brevpapir.


Brug lower\_case\_table\_names=0 på Unix og lower\_case\_table\_names=2 på Windows. Dette bevarer brevpapiret i databasen og tabelnavne. Ulempen ved dette er, at du skal sikre, at dine udsagn altid henviser til din database og tabel navne med den korrekte brevpapir på Windows. Hvis du overfører dine udsagn til Unix, hvor bogstaver er signifikante, fungerer de ikke, hvis bogstaverne er forkerte.


Undtagelse: Hvis du bruger InnoDB-tabeller, og du forsøger at undgå disse dataoverførselsproblemer, skal du indstille lower\_case\_table\_names til 1 på alle platforme for at tvinge navne til at blive konverteret til små bogstaver.


Hvis du planlægger at indstille systemvariabelen lower\_case\_table\_names til 1 på Unix, skal du først konvertere din gamle database og tabelnavne til små bogstaver, inden du stopper mysqld og genstarter den med den nye variabelindstilling.


Se venligst på MySQL-webstedet for yderligere oplysninger om dette, og nogle vigtige advarsler http://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html[9]

Andre referencer 2


Du kan sætte kode i JPA for at konvertere alle dine fysiske, skema-, sekvens- og tabelnavne til små bogstaver og bruge sagen på begge systemer, så databasen kan eksporteres fra Windows og importeres til Unix uden problemer.


Tilføj denne klasse et sted:


public class ImprovedNamingStrategy implements PhysicalNamingStrategy {

    @Override
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    /**
     * Converts table name.
     *
     * @param identifier
     *            the identifier.
     * @return the identifier.
     */
    private Identifier convert(Identifier identifier) {
        if (identifier == null || identifier.getText().trim().isEmpty()) {
            return identifier;
        }
        return Identifier.toIdentifier(identifier.getText().toLowerCase());
    }
}


og tilføj denne egenskab til dig persistence.xml


<property name="hibernate.physical\_naming\_strategy" value="ImprovedNamingStrategy" />